@fleetmesh /纺织
的FleetMesh 纺织 TypeScript中的8层内容寻址数据平面:
Fiber → Strand → Spool → Fabric → Quilt → Suit → Fit → Tombstone
而 @fleetmesh/leaf 提供了介导的WebSocket传输、礼品包装的DIDComm v2消息传递和NIP-77 Negentropy wire协议; @fleetmesh/textile 提供了通用的内容寻址数据结构,1024字节的叶子包Merkle dag,确定性CRDT合并,6级隐私阶梯强制执行,XChaCha20-Poly1305分片密封,可插拔存储库和NIP-77 Negentropy集对调,跨任何FleetMesh应用程序(MeshTube, MeshDrive, MeshDocs, MeshChat, MeshGit)。
依赖项限制为 @fleetmesh/leaf 被审计的人 @noble/* 和 @scure/base 密码库,完全固定。
安装
npm install @fleetmesh/textile @fleetmesh/leaf
顶级命名导入和 @fleetmesh/leaf支持style命名空间导入:
import {
MediaFiber,
MetadataFiber,
MediaStrand,
PlaylistFabric,
SovereignQuilt,
FiberVaultRepository,
reconcileTextileVaults,
utf8,
} from '@fleetmesh/textile';
// Or via modular namespaces:
import { bao, canonical, primitives, sealing, signatures, storage, leafBridge } from '@fleetmesh/textile';
快速入门
import {
createSchnorrTextileSigner,
FiberVaultRepository,
IdentityFiber,
MediaFiber,
MediaStrand,
MetadataFiber,
PlaylistFabric,
reconcileTextileVaults,
SealedShardFiber,
SovereignQuilt,
TextileQuilt,
utf8,
} from '@fleetmesh/textile';
const skHex = '11'.repeat(32);
const signer = createSchnorrTextileSigner(skHex);
const alice = { identity_id: 'alice', did: signer.signerDid, handle: 'alice' };
// 1. Layer 1 (Fiber): Content-addressed atomic byte sequences (1024B leaf Bao Merkle root)
const videoFiber = MediaFiber.fromBytes(utf8('video-payload'), 'video/mp4', { author: alice });
const metaFiber = new MetadataFiber({ title: 'Hello Mesh', synopsis: 'Intro video', content_domain: 'video' });
// 2. Layer 2 (Strand): Role-tagged Fiber references spun into a versioned asset
const strand = new MediaStrand({
id: 'strand-hello-mesh',
title: 'Hello Mesh',
author: alice,
fibers: [videoFiber.toStrandRef('primary'), metaFiber.toStrandRef('metadata')],
});
// 3. Layer 4 (Fabric): Deterministic CRDT collection of Strands
const playlist = PlaylistFabric.create({
fabricId: 'fabric-featured',
owner: alice,
title: 'Featured Videos',
strands: [strand.toManifest()],
});
// 4. Layer 5 (Quilt): Stitch Fabrics, IdentityFibers, and XChaCha20-Poly1305 SealedShardFibers
const vaultKey = new Uint8Array(32).fill(0x42);
const sealedHistory = SealedShardFiber.sealWithKey(
'watch_history',
utf8(JSON.stringify({ watched: [strand.id] })),
vaultKey,
);
const idFiber = IdentityFiber.fromProfilePayload(alice.did, { handle: 'alice' });
const sovereignQuilt = new SovereignQuilt({
id: 'quilt-alice',
author: alice,
identityFibers: [idFiber.toStrandRef('primary_asset')],
fabrics: [playlist],
shardFibers: [sealedHistory.toQuiltShardRef()],
});
// Project a public Quilt view (automatically strips private fabrics and sealed shards)
const publicQuilt = sovereignQuilt.projectForAudience('public');
const sigEnvelope = publicQuilt.signWithKey(skHex);
// 5. Persist primitives into a content-addressed Vault and reconcile with a remote peer via NIP-77
const aliceVault = new FiberVaultRepository();
const bobVault = new FiberVaultRepository();
await aliceVault.putPrimitive(videoFiber);
await aliceVault.putPrimitive(metaFiber);
await aliceVault.putPrimitive(strand);
await aliceVault.putPrimitive(playlist);
await aliceVault.putPrimitive(publicQuilt);
const diff = await reconcileTextileVaults(bobVault, aliceVault);
for (const root of diff.needRoots) {
const bytes = await aliceVault.getFiber(root);
if (bytes) await bobVault.putFiber(bytes, { expectedRoot: root });
}
// Rehydrate and verify typed primitives from the vault
const hydratedQuilt = await bobVault.getPrimitive(publicQuilt.root, TextileQuilt.fromManifest);
console.log(hydratedQuilt?.verify(), hydratedQuilt?.verifySignature(sigEnvelope)); // true, true
八层纺织层次结构
| 层 | 基类 | 规范MIME类型 | 子类&角色 |
|---|---|---|---|
| 1. 纤维 | TextileFiber | application/vnd.fleetmesh.fiber+octet-stream | 原子内容寻址字节序列(1024-字节叶包默克尔树)。子类: MediaFiber, RawBlobFiber, MetadataFiber (JsonMetadataFiber), TimedFiber (MTF1), InteractionFiber, IdentityFiber, SealedShardFiber (MTS1 XChaCha20-Poly1305), ChunkedFiber (高度10 1 MiB macro-chunk子树)。 |
| 2. 链 | TextileStrand | application/vnd.fleetmesh.strand+json | 旋转role-tagged TextileFiber 引用(FiberRefCollection)转化为版本化的语义资产(strand_root). 子类: MediaStrand, SubtitleStrand, CommentStrand, InteractionStrand, ScrobbleStrand, DocumentStrand, CodeRepoStrand, ArcadeRomStrand, ProductStrand, GroupStrand, TombstoneNoticeStrand. |
| 3. 线轴 | TextileSpool | application/vnd.fleetmesh.spool+json | 的实时追加缓冲区 TimedFibers (MTF1),由BIP-340签署的操作链(SignedSpoolOp). 调用 .cut() 将活动窗口压缩成 FilamentStrand, SpoolLengthStrand, SpoolCutFabric. |
| 4. 织物 | TextileFabric | application/vnd.fleetmesh.fabric+json | 命令(append)或键索引(key)的CRDT集合 TextileStrand年代, FabricDelimiter年代, FabricInteractions (fabric_root). 子类: PlaylistFabric, FeedFabric, CatalogFabric, SubtitleLocalizationFabric, ViewLedgerFabric, TombstoneLedgerFabric, VaultFabric, CircleFeedFabric, ActivityFabric. |
| 5. 被子 | TextileQuilt | application/vnd.fleetmesh.quilt+json | 缝合一个身份或圆圈 TextileFabric年代, IdentityFiber年代, SealedShardFiberS,和生活 Spindle 指向观众范围内的投影(self, circle, public)由 quilt_root. 子类: SovereignQuilt, PublishedQuiltView, GroupQuilt. |
| 6. 西装 | TextileSuit | application/vnd.fleetmesh.suit+json | 自包含的 .fiberpack v2 (MTFP1\n)可移植的主权身份包(suit_root)用于跨设备同步和Sneakernet / BLE / QR / USB传输。子类: SovereignIdentitySuit. |
| 7. 适合 | TextileFit | application/vnd.fleetmesh.fit+json | 内容寻址运行时策略引擎(fit_root)管理存储配额、自动固定、墓碑边界强制执行和密封碎片泄漏预防。 |
| 8. 墓碑上 | TextileTombstone | application/vnd.fleetmesh.tombstone+json | 跨层收放原语(PreemptiveTombstone, RetroactiveTombstone, LocalCacheTombstone, EphemeralTtlTombstone, FederatedQuarantineTombstone, SupersededRevisionTombstone, KeyRevocationTombstone)索引为 TombstoneLedgerRepository. |
跨层对称和核心不变量
每个层类都继承自 AbstractTextilePrimitive<TManifest> (和容器层继承自 CompositeTextilePrimitive<TManifest>):
- 对称序列化和水化:每一层提供
.toManifest(),.toCanonicalBytes(),.toCanonicalJson(),静态Class.fromManifest(manifest)水合作用,加上vault.putPrimitive(primitive)和vault.getPrimitive(root, Class.fromManifest). - Everything-is-a-Fiber投影:
primitive.toManifestFiber()和TextileFiber.fromPrimitive(primitive)将任何更高层的清单投影到内容寻址的TextileFiber谁的root === primitive.root. - 递归默克尔DAG遍历:
composite.childRefs(),composite.childRoots(),composite.collectClosureRoots(resolver),composite.verifySubtree(resolver),composite.findTombstonedChildren(predicate),composite.evaluateClosureFit(fit). - 单调的6级隐私梯:
public→peer→circle→mutual→link→private. 调用primitive.escalatePrivacyRung(next)棘轮隐私向上和投掷PrivacyEscalationError任何缓和局势的企图。 - 确定性CRDT合并:
strand.merge(remote),fabric.merge(remote),quilt.merge(remote)满足交换性、结合性和幂等性(merge(A, B).root === merge(B, A).root)。 - 双域BIP-340 Schnorr签名:
primitive.signWithKey(skHex),primitive.sign(signer),primitive.verifySignature(envelope)同时支持fleetmesh.textile/v1和meshtube.textile/v1域以及NIP-01类30899可替换的事件。 - 类型错误层次结构:所有域错误继承自
TextileError(BaoVerificationError,PrivacyEscalationError,SchemaValidationError,SpoolStateError)。
一致性和多引擎测试
每一个原语 @fleetmesh/textile 对冻结的跨语言载体进行测试 vectors/textile-v1.json 并针对Python 3参考实现进行了字节对字节的验证,以及跨 node . js, 铬, 火狐, WebKit 通过Vitest浏览器模式在剧作家:
npm install
npm run typecheck # Strict TypeScript (erasableSyntaxOnly, noUncheckedIndexedAccess)
npm run build # Emit dist/*.js and dist/*.d.ts
npm test # Node.js unit, conformance, audit-guard & integration suites
npm run test:coverage # V8 coverage report across src/ (97%+ line coverage)
要同时在Node.js、Chromium、Firefox和WebKit上运行完整的套件:
npm run browsers # Once: install Chromium, Firefox, and WebKit
npm run test:all # Run all suites across Node + 3 browser engines