diff --git a/src/adaptors/yjs-ndn-adaptor.ts b/src/adaptors/yjs-ndn-adaptor.ts index 719243f..5ca9d85 100644 --- a/src/adaptors/yjs-ndn-adaptor.ts +++ b/src/adaptors/yjs-ndn-adaptor.ts @@ -125,7 +125,7 @@ export class NdnSvsAdaptor { // Verify this part if there's a change in naming convention. // NOTE: Currently naming convention is hard-coded. May need organizing. // WARNING: It does not support multiple Yjs documents in the same app. - const snapshotPrefix = this.syncAgent.appPrefix.append('32=snapshot'); + const snapshotPrefix = this.syncAgent.appPrefix.append('32=' + this.snapshotTopic); // New SVS encodings const snapshotName = snapshotPrefix.append(new Component(Version.type, encodedSV)); @@ -156,7 +156,7 @@ export class NdnSvsAdaptor { // NOTE: The following code depend on snapshot naming convention to work. // Verify this part if there's a change in naming convention. - const snapshotPrefix = this.syncAgent.appPrefix.append('32=snapshot'); + const snapshotPrefix = this.syncAgent.appPrefix.append('32=' + this.snapshotTopic); // NOTE: The following code depend on snapshot naming convention to work. // Verify this part if there's a change in naming convention. diff --git a/src/sync-agent/sync-agent.ts b/src/sync-agent/sync-agent.ts index e94f446..748fb74 100644 --- a/src/sync-agent/sync-agent.ts +++ b/src/sync-agent/sync-agent.ts @@ -41,6 +41,7 @@ export class SyncAgent implements AsyncDisposable { readonly latestOnly: LatestOnlyDelivery, readonly onReset?: () => void, readonly groupKey?: CryptoKey, + readonly snapshotTopic: string = 'snapshot', ) { atLeastOnce.onReset = () => this.onResetTriggered(); latestOnly.onReset = () => this.onResetTriggered(); @@ -356,7 +357,7 @@ export class SyncAgent implements AsyncDisposable { // NOTE: The following code depend on snapshot naming convention to work. // Verify this part if there's a change in naming convention. - if (intName.get(this.appPrefix.length)?.equals(Component.from('32=snapshot'))) { + if (intName.get(this.appPrefix.length)?.equals(Component.from('32=' + this.snapshotTopic))) { const wire = await this.persistStorage.get(intName.toString()); if (wire === undefined || wire.length === 0) { // console.warn(`A remote peer is fetching a non-existing object: ${intName.toString()}`); @@ -460,6 +461,7 @@ export class SyncAgent implements AsyncDisposable { verifier: Verifier, onReset?: () => void, groupKeyBits?: Uint8Array, + snapshotTopic?: string, ) { const tempStorage = new InMemoryStorage(); // Note: we need the signer name to be /[appPrefix]//KEY/ @@ -510,6 +512,7 @@ export class SyncAgent implements AsyncDisposable { latestOnly, onReset, groupKey, + snapshotTopic, ); resolver!((content, id) => ret.onUpdate(content, id)); return ret; diff --git a/src/workspace/workspace.ts b/src/workspace/workspace.ts index 7ecee38..9b60978 100644 --- a/src/workspace/workspace.ts +++ b/src/workspace/workspace.ts @@ -29,6 +29,7 @@ export class Workspace implements AsyncDisposable { useBundler?: boolean; groupKeyBits?: Uint8Array; snapshotInterval?: number; + snapshotTopic?: string; }) { // Always init a new one, and then load. if (opts.createNewDoc) { @@ -47,6 +48,7 @@ export class Workspace implements AsyncDisposable { opts.verifier, opts.onReset, opts.groupKeyBits, + opts.snapshotTopic ?? 'snapshot', ); // Root doc using CRDT and Sync @@ -56,6 +58,7 @@ export class Workspace implements AsyncDisposable { 'doc', opts.useBundler ?? false, opts.snapshotInterval ?? 100, + opts.snapshotTopic ?? 'snapshot', ); const yjsSnapshotMgr = new YjsStateManager( () => encodeSyncState(syncAgent!.getUpdateSyncSV()),