@fluidframework/replay-driver 0.55.2 → 0.56.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/replayController.d.ts +1 -1
- package/dist/replayController.d.ts.map +1 -1
- package/dist/replayController.js.map +1 -1
- package/dist/replayDocumentDeltaConnection.d.ts +1 -1
- package/dist/replayDocumentDeltaConnection.d.ts.map +1 -1
- package/dist/replayDocumentDeltaConnection.js.map +1 -1
- package/dist/storageImplementations.d.ts +3 -3
- package/dist/storageImplementations.d.ts.map +1 -1
- package/dist/storageImplementations.js +8 -4
- package/dist/storageImplementations.js.map +1 -1
- package/lib/packageVersion.d.ts +1 -1
- package/lib/packageVersion.js +1 -1
- package/lib/packageVersion.js.map +1 -1
- package/lib/replayController.d.ts +1 -1
- package/lib/replayController.d.ts.map +1 -1
- package/lib/replayController.js.map +1 -1
- package/lib/replayDocumentDeltaConnection.d.ts +1 -1
- package/lib/replayDocumentDeltaConnection.d.ts.map +1 -1
- package/lib/replayDocumentDeltaConnection.js.map +1 -1
- package/lib/storageImplementations.d.ts +3 -3
- package/lib/storageImplementations.d.ts.map +1 -1
- package/lib/storageImplementations.js +8 -4
- package/lib/storageImplementations.js.map +1 -1
- package/package.json +4 -4
- package/src/packageVersion.ts +1 -1
- package/src/replayController.ts +1 -1
- package/src/replayDocumentDeltaConnection.ts +1 -1
- package/src/storageImplementations.ts +12 -7
package/dist/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/replay-driver";
|
|
8
|
-
export declare const pkgVersion = "0.
|
|
8
|
+
export declare const pkgVersion = "0.56.2";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/dist/packageVersion.js
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.pkgVersion = exports.pkgName = void 0;
|
|
10
10
|
exports.pkgName = "@fluidframework/replay-driver";
|
|
11
|
-
exports.pkgVersion = "0.
|
|
11
|
+
exports.pkgVersion = "0.56.2";
|
|
12
12
|
//# sourceMappingURL=packageVersion.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,+BAA+B,CAAC;AAC1C,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/replay-driver\";\nexport const pkgVersion = \"0.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEU,QAAA,OAAO,GAAG,+BAA+B,CAAC;AAC1C,QAAA,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/replay-driver\";\nexport const pkgVersion = \"0.56.2\";\n"]}
|
|
@@ -8,7 +8,7 @@ import * as api from "@fluidframework/protocol-definitions";
|
|
|
8
8
|
* Partial implementation of IDocumentStorageService
|
|
9
9
|
*/
|
|
10
10
|
export declare abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {
|
|
11
|
-
abstract getVersions(versionId: string, count: number): Promise<api.IVersion[]>;
|
|
11
|
+
abstract getVersions(versionId: string | null, count: number): Promise<api.IVersion[]>;
|
|
12
12
|
abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;
|
|
13
13
|
abstract readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
14
14
|
uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayController.d.ts","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,sCAAsC,CAAC;AAE5D;;GAEG;AACH,8BAAsB,8BAA+B,YAAW,uBAAuB;aACnE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"replayController.d.ts","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,sCAAsC,CAAC;AAE5D;;GAEG;AACH,8BAAsB,8BAA+B,YAAW,uBAAuB;aACnE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;aAC7E,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;aAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAErD,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9F,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAI9F,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAInE,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAInF,IAAW,aAAa,IAAI,MAAM,CAEjC;CACJ;AAED;;;;GAIG;AACH,8BAAsB,gBAAiB,SAAQ,8BAA8B;IACzE;;;;;OAKG;aACa,WAAW,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhF;;;OAGG;aACa,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAExD;;;;OAIG;aACa,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAE9D;;;;;;;;OAQG;aACa,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;IAE/E;;;;;OAKG;aACa,MAAM,CAClB,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,yBAAyB,EAAE,KAAK,IAAI,EACtD,UAAU,EAAE,GAAG,CAAC,yBAAyB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAClE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayController.js","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH;;GAEG;AACH,MAAsB,8BAA8B;IAKzC,KAAK,CAAC,wBAAwB,CAAC,OAAyB,EAAE,OAAwB;QACrF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAe,EAAE,OAAiB,EAAE,OAAe,EAAE,GAAW;QAC/E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAA0B;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAW,aAAa;QACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;CACJ;AAxBD,wEAwBC;AAED;;;;GAIG;AACH,MAAsB,gBAAiB,SAAQ,8BAA8B;CA0C5E;AA1CD,4CA0CC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDocumentService,\n IDocumentStorageService,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport * as api from \"@fluidframework/protocol-definitions\";\n\n/**\n * Partial implementation of IDocumentStorageService\n */\nexport abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {\n public abstract getVersions(versionId: string, count: number): Promise<api.IVersion[]>;\n public abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;\n public abstract readBlob(blobId: string): Promise<ArrayBufferLike>;\n\n public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async write(tree: api.ITree, parents: string[], message: string, ref: string): Promise<api.IVersion> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<api.ICreateBlobResponse> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async downloadSummary(handle: api.ISummaryHandle): Promise<api.ISummaryTree> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public get repositoryUrl(): string {\n throw new Error(\"Invalid operation\");\n }\n}\n\n/**\n * Replay controller object\n * It controls where we start (snapshot, local file, no snapshots)\n * As well as dispatch of ops\n */\nexport abstract class ReplayController extends ReadDocumentStorageServiceBase {\n /**\n * Initialize reply controller\n * @param documentService - the real document service\n * @returns - Boolean, indicating if controller should be used.\n * If false is returned, caller should fallback to original storage.\n */\n public abstract initStorage(documentService: IDocumentService): Promise<boolean>;\n\n /**\n * Returns sequence number to start processing ops\n * Should be zero if not using snapshot, and snapshot seq# otherwise\n */\n public abstract getStartingOpSequence(): Promise<number>;\n\n /**\n * Returns last op number to fetch from current op\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n */\n public abstract fetchTo(currentOp: number): number | undefined;\n\n /**\n * Returns true if no more ops should be processed (or downloaded for future processing).\n * It's called at end of each batch with latest op timestamp.\n * Also it's called when there are no more ops available (lastTimeStamp === undefined).\n * If false is returned and there are no more ops, request for more ops is made every 2 seconds.\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n * @param lastTimeStamp - timestamp of last op (if more ops are available). Undefined otherwise.\n */\n public abstract isDoneFetch(currentOp: number, lastTimeStamp?: number): boolean;\n\n /**\n * Replay batch of ops\n * NOTE: new batch of ops is fetched (fetchTo() & isDoneFetch() APIs are called) while this call is in flights\n * @param emitter - callback to emit ops\n * @param fetchedOps - ops to process\n */\n public abstract replay(\n emitter: (op: api.ISequencedDocumentMessage[]) => void,\n fetchedOps: api.ISequencedDocumentMessage[]): Promise<void>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"replayController.js","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AASH;;GAEG;AACH,MAAsB,8BAA8B;IAKzC,KAAK,CAAC,wBAAwB,CAAC,OAAyB,EAAE,OAAwB;QACrF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAe,EAAE,OAAiB,EAAE,OAAe,EAAE,GAAW;QAC/E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAA0B;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAW,aAAa;QACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;CACJ;AAxBD,wEAwBC;AAED;;;;GAIG;AACH,MAAsB,gBAAiB,SAAQ,8BAA8B;CA0C5E;AA1CD,4CA0CC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDocumentService,\n IDocumentStorageService,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport * as api from \"@fluidframework/protocol-definitions\";\n\n/**\n * Partial implementation of IDocumentStorageService\n */\nexport abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {\n public abstract getVersions(versionId: string | null, count: number): Promise<api.IVersion[]>;\n public abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;\n public abstract readBlob(blobId: string): Promise<ArrayBufferLike>;\n\n public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async write(tree: api.ITree, parents: string[], message: string, ref: string): Promise<api.IVersion> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<api.ICreateBlobResponse> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async downloadSummary(handle: api.ISummaryHandle): Promise<api.ISummaryTree> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public get repositoryUrl(): string {\n throw new Error(\"Invalid operation\");\n }\n}\n\n/**\n * Replay controller object\n * It controls where we start (snapshot, local file, no snapshots)\n * As well as dispatch of ops\n */\nexport abstract class ReplayController extends ReadDocumentStorageServiceBase {\n /**\n * Initialize reply controller\n * @param documentService - the real document service\n * @returns - Boolean, indicating if controller should be used.\n * If false is returned, caller should fallback to original storage.\n */\n public abstract initStorage(documentService: IDocumentService): Promise<boolean>;\n\n /**\n * Returns sequence number to start processing ops\n * Should be zero if not using snapshot, and snapshot seq# otherwise\n */\n public abstract getStartingOpSequence(): Promise<number>;\n\n /**\n * Returns last op number to fetch from current op\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n */\n public abstract fetchTo(currentOp: number): number | undefined;\n\n /**\n * Returns true if no more ops should be processed (or downloaded for future processing).\n * It's called at end of each batch with latest op timestamp.\n * Also it's called when there are no more ops available (lastTimeStamp === undefined).\n * If false is returned and there are no more ops, request for more ops is made every 2 seconds.\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n * @param lastTimeStamp - timestamp of last op (if more ops are available). Undefined otherwise.\n */\n public abstract isDoneFetch(currentOp: number, lastTimeStamp?: number): boolean;\n\n /**\n * Replay batch of ops\n * NOTE: new batch of ops is fetched (fetchTo() & isDoneFetch() APIs are called) while this call is in flights\n * @param emitter - callback to emit ops\n * @param fetchedOps - ops to process\n */\n public abstract replay(\n emitter: (op: api.ISequencedDocumentMessage[]) => void,\n fetchedOps: api.ISequencedDocumentMessage[]): Promise<void>;\n}\n"]}
|
|
@@ -24,7 +24,7 @@ export declare class ReplayControllerStatic extends ReplayController {
|
|
|
24
24
|
*/
|
|
25
25
|
constructor(replayFrom: number, replayTo: number, unitIsTime?: boolean | undefined);
|
|
26
26
|
initStorage(documentService: IDocumentService): Promise<boolean>;
|
|
27
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
27
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
28
28
|
getSnapshotTree(version?: IVersion): Promise<null>;
|
|
29
29
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
30
30
|
getStartingOpSequence(): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayDocumentDeltaConnection.d.ts","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EACH,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,gBAAgB,EACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,yBAAyB,EACzB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EAEX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAS,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,qBAAa,sBAAuB,SAAQ,gBAAgB;aAgBpC,UAAU,EAAE,MAAM;aAClB,QAAQ,EAAE,MAAM;aAChB,UAAU,CAAC;IAjB/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAM;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAE9C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAG1B;;;;;;OAMG;gBAEiB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,qBAAS;IAQ3B,WAAW,CAAC,eAAe,EAAE,gBAAgB;IAI7C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"replayDocumentDeltaConnection.d.ts","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayDocumentDeltaConnection.js","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDisposable } from \"@fluidframework/common-definitions\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentDeltaConnectionEvents,\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ConnectionMode,\n IClientConfiguration,\n IConnected,\n IDocumentMessage,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n IVersion,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { delay, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { ReplayController } from \"./replayController\";\n\nconst ReplayDocumentId = \"documentId\";\n\nexport class ReplayControllerStatic extends ReplayController {\n private static readonly DelayInterval = 50;\n private static readonly ReplayResolution = 15;\n\n private firstTimeStamp: number | undefined;\n private replayCurrent = 0;\n // Simulated delay interval for emitting the ops\n\n /**\n * Helper class\n *\n * @param replayFrom - First op to be played on socket.\n * @param replayTo - Last op number to be played on socket.\n * @param unitIsTime - True is user want to play ops that are within a replay resolution window.\n */\n public constructor(\n public readonly replayFrom: number,\n public readonly replayTo: number,\n public readonly unitIsTime?: boolean) {\n super();\n if (unitIsTime !== true) {\n // There is no code in here to start with snapshot, thus we have to start with op #0.\n this.replayTo = 0;\n }\n }\n\n public async initStorage(documentService: IDocumentService) {\n return true;\n }\n\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion) {\n return version ? Promise.reject(new Error(\"Invalid operation\")) : null;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async getStartingOpSequence(): Promise<number> {\n return 0;\n }\n\n public fetchTo(currentOp: number) {\n if (!(this.unitIsTime !== true && this.replayTo >= 0)) {\n return undefined;\n }\n return this.replayTo;\n }\n\n public isDoneFetch(currentOp: number, lastTimeStamp?: number) {\n if (this.replayTo >= 0) {\n if (this.unitIsTime === true) {\n return (\n lastTimeStamp !== undefined\n && this.firstTimeStamp !== undefined\n && lastTimeStamp - this.firstTimeStamp >= this.replayTo);\n }\n return currentOp >= this.replayTo;\n }\n return lastTimeStamp === undefined; // No more ops\n }\n\n public skipToIndex(fetchedOps: ISequencedDocumentMessage[]) {\n if (this.replayFrom <= 0) {\n return 0;\n }\n if (this.unitIsTime === true) {\n for (let i = 0; i < fetchedOps.length; i += 1) {\n const timeStamp = fetchedOps[i].timestamp;\n if (timeStamp !== undefined) {\n if (this.firstTimeStamp === undefined) {\n this.firstTimeStamp = timeStamp;\n }\n if (timeStamp - this.firstTimeStamp >= this.replayFrom) {\n return i;\n }\n }\n }\n } else if (this.replayFrom > this.replayCurrent) {\n return this.replayFrom - this.replayCurrent;\n }\n return 0;\n }\n\n public async replay(\n emitter: (op: ISequencedDocumentMessage[]) => void,\n fetchedOps: ISequencedDocumentMessage[]): Promise<void> {\n let current = this.skipToIndex(fetchedOps);\n\n return new Promise((resolve) => {\n const replayNextOps = () => {\n // Emit the ops from replay to the end every \"deltainterval\" milliseconds\n // to simulate the socket stream\n const currentOp = fetchedOps[current];\n const playbackOps = [currentOp];\n let nextInterval = ReplayControllerStatic.DelayInterval;\n current += 1;\n\n if (this.unitIsTime === true) {\n const currentTimeStamp = currentOp.timestamp;\n if (currentTimeStamp !== undefined) {\n // Emit more ops that is in the ReplayResolution window\n\n while (current < fetchedOps.length) {\n const op = fetchedOps[current];\n if (op.timestamp === undefined) {\n // Missing timestamp, just delay the standard amount of time\n break;\n }\n const timeDiff = op.timestamp - currentTimeStamp;\n if (timeDiff >= ReplayControllerStatic.ReplayResolution) {\n // Time exceeded the resolution window, break out the loop\n // and delay for the time difference.\n nextInterval = timeDiff;\n break;\n }\n if (timeDiff < 0) {\n // Time have regressed, just delay the standard amount of time\n break;\n }\n\n // The op is within the ReplayResolution emit it now\n playbackOps.push(op);\n current += 1;\n }\n\n if (this.firstTimeStamp !== undefined\n && this.replayTo >= 0\n && currentTimeStamp + nextInterval - this.firstTimeStamp > this.replayTo) {\n nextInterval = -1;\n }\n }\n }\n scheduleNext(nextInterval);\n emitter(playbackOps);\n };\n const scheduleNext = (nextInterval: number) => {\n if (nextInterval >= 0 && current < fetchedOps.length) {\n setTimeout(replayNextOps, nextInterval);\n } else {\n this.replayCurrent += current;\n resolve();\n }\n };\n scheduleNext(ReplayControllerStatic.DelayInterval);\n });\n }\n}\n\nexport class ReplayDocumentDeltaConnection\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable {\n /**\n * Creates a new delta connection and mimics the delta connection to replay ops on it.\n * @param documentService - The document service to be used to get underlying endpoints.\n */\n public static create(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController): IDocumentDeltaConnection {\n const connection: IConnected = {\n claims: ReplayDocumentDeltaConnection.claims,\n clientId: \"PseudoClientId\",\n existing: true,\n initialMessages: [],\n initialSignals: [],\n initialClients: [],\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n mode: \"read\",\n serviceConfiguration: {\n blockSize: 64436,\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n summary: {\n idleTime: 5000,\n maxOps: 1000,\n maxTime: 5000 * 12,\n maxAckWaitTime: 600000,\n },\n },\n supportedVersions: [ReplayDocumentDeltaConnection.replayProtocolVersion],\n version: ReplayDocumentDeltaConnection.replayProtocolVersion,\n };\n const deltaConnection = new ReplayDocumentDeltaConnection(connection);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaConnection.fetchAndEmitOps(documentStorageService, controller);\n\n return deltaConnection;\n }\n\n private static readonly replayProtocolVersion = \"^0.1.0\";\n // Since the replay service never actually sends messages the size below is arbitrary\n private static readonly ReplayMaxMessageSize = 16 * 1024;\n\n private static readonly claims: ITokenClaims = {\n documentId: ReplayDocumentId,\n scopes: [ScopeType.DocRead],\n tenantId: \"\",\n user: {\n id: \"\",\n },\n iat: Math.round(new Date().getTime() / 1000),\n exp: Math.round(new Date().getTime() / 1000) + 60 * 60, // 1 hour expiration\n ver: \"1.0\",\n };\n\n public get clientId(): string {\n return this.details.clientId;\n }\n\n public get mode(): ConnectionMode {\n return this.details.mode;\n }\n\n public get claims(): ITokenClaims {\n return this.details.claims;\n }\n\n public get existing(): boolean {\n return this.details.existing;\n }\n\n public get version(): string {\n return this.details.version;\n }\n\n public get initialMessages(): ISequencedDocumentMessage[] {\n return this.details.initialMessages;\n }\n\n public get initialSignals(): ISignalMessage[] {\n return this.details.initialSignals;\n }\n\n public get initialClients(): ISignalClient[] {\n return this.details.initialClients;\n }\n\n public get serviceConfiguration(): IClientConfiguration {\n return this.details.serviceConfiguration;\n }\n\n public readonly maxMessageSize = ReplayDocumentDeltaConnection.ReplayMaxMessageSize;\n\n constructor(\n public details: IConnected,\n ) {\n super();\n }\n\n public submit(documentMessage: IDocumentMessage[]): void {\n // ReplayDocumentDeltaConnection.submit() can't be called - client never sees its own join on,\n // and thus can never move to sending ops.\n throw new Error(\"ReplayDocumentDeltaConnection.submit() can't be called\");\n }\n\n public async submitSignal(message: any) {\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n\n /**\n * This gets the specified ops from the delta storage endpoint and replays them in the replayer.\n */\n private async fetchAndEmitOps(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController,\n ): Promise<void> {\n let done;\n let replayPromiseChain = Promise.resolve();\n\n let currentOp = await controller.getStartingOpSequence();\n\n do {\n const fetchTo = controller.fetchTo(currentOp);\n\n const abortController = new AbortController();\n const stream = documentStorageService.fetchMessages(currentOp + 1, fetchTo, abortController.signal);\n do {\n const result = await stream.read();\n\n if (result.done) {\n // No more ops. But, they can show up later, either because document was just created,\n // or because another client keeps submitting new ops.\n done = controller.isDoneFetch(currentOp, undefined);\n if (!done) {\n await delay(2000);\n }\n break;\n }\n replayPromiseChain = replayPromiseChain.then(\n async () => controller.replay((ops) => this.emit(\"op\", ReplayDocumentId, ops), messages));\n\n const messages = result.value;\n currentOp += messages.length;\n done = controller.isDoneFetch(currentOp, messages[messages.length - 1].timestamp);\n } while (!done);\n\n abortController.abort();\n } while (!done);\n return replayPromiseChain;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"replayDocumentDeltaConnection.js","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDisposable } from \"@fluidframework/common-definitions\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentDeltaConnectionEvents,\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ConnectionMode,\n IClientConfiguration,\n IConnected,\n IDocumentMessage,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n IVersion,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { delay, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { ReplayController } from \"./replayController\";\n\nconst ReplayDocumentId = \"documentId\";\n\nexport class ReplayControllerStatic extends ReplayController {\n private static readonly DelayInterval = 50;\n private static readonly ReplayResolution = 15;\n\n private firstTimeStamp: number | undefined;\n private replayCurrent = 0;\n // Simulated delay interval for emitting the ops\n\n /**\n * Helper class\n *\n * @param replayFrom - First op to be played on socket.\n * @param replayTo - Last op number to be played on socket.\n * @param unitIsTime - True is user want to play ops that are within a replay resolution window.\n */\n public constructor(\n public readonly replayFrom: number,\n public readonly replayTo: number,\n public readonly unitIsTime?: boolean) {\n super();\n if (unitIsTime !== true) {\n // There is no code in here to start with snapshot, thus we have to start with op #0.\n this.replayTo = 0;\n }\n }\n\n public async initStorage(documentService: IDocumentService) {\n return true;\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion) {\n return version ? Promise.reject(new Error(\"Invalid operation\")) : null;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async getStartingOpSequence(): Promise<number> {\n return 0;\n }\n\n public fetchTo(currentOp: number) {\n if (!(this.unitIsTime !== true && this.replayTo >= 0)) {\n return undefined;\n }\n return this.replayTo;\n }\n\n public isDoneFetch(currentOp: number, lastTimeStamp?: number) {\n if (this.replayTo >= 0) {\n if (this.unitIsTime === true) {\n return (\n lastTimeStamp !== undefined\n && this.firstTimeStamp !== undefined\n && lastTimeStamp - this.firstTimeStamp >= this.replayTo);\n }\n return currentOp >= this.replayTo;\n }\n return lastTimeStamp === undefined; // No more ops\n }\n\n public skipToIndex(fetchedOps: ISequencedDocumentMessage[]) {\n if (this.replayFrom <= 0) {\n return 0;\n }\n if (this.unitIsTime === true) {\n for (let i = 0; i < fetchedOps.length; i += 1) {\n const timeStamp = fetchedOps[i].timestamp;\n if (timeStamp !== undefined) {\n if (this.firstTimeStamp === undefined) {\n this.firstTimeStamp = timeStamp;\n }\n if (timeStamp - this.firstTimeStamp >= this.replayFrom) {\n return i;\n }\n }\n }\n } else if (this.replayFrom > this.replayCurrent) {\n return this.replayFrom - this.replayCurrent;\n }\n return 0;\n }\n\n public async replay(\n emitter: (op: ISequencedDocumentMessage[]) => void,\n fetchedOps: ISequencedDocumentMessage[]): Promise<void> {\n let current = this.skipToIndex(fetchedOps);\n\n return new Promise((resolve) => {\n const replayNextOps = () => {\n // Emit the ops from replay to the end every \"deltainterval\" milliseconds\n // to simulate the socket stream\n const currentOp = fetchedOps[current];\n const playbackOps = [currentOp];\n let nextInterval = ReplayControllerStatic.DelayInterval;\n current += 1;\n\n if (this.unitIsTime === true) {\n const currentTimeStamp = currentOp.timestamp;\n if (currentTimeStamp !== undefined) {\n // Emit more ops that is in the ReplayResolution window\n\n while (current < fetchedOps.length) {\n const op = fetchedOps[current];\n if (op.timestamp === undefined) {\n // Missing timestamp, just delay the standard amount of time\n break;\n }\n const timeDiff = op.timestamp - currentTimeStamp;\n if (timeDiff >= ReplayControllerStatic.ReplayResolution) {\n // Time exceeded the resolution window, break out the loop\n // and delay for the time difference.\n nextInterval = timeDiff;\n break;\n }\n if (timeDiff < 0) {\n // Time have regressed, just delay the standard amount of time\n break;\n }\n\n // The op is within the ReplayResolution emit it now\n playbackOps.push(op);\n current += 1;\n }\n\n if (this.firstTimeStamp !== undefined\n && this.replayTo >= 0\n && currentTimeStamp + nextInterval - this.firstTimeStamp > this.replayTo) {\n nextInterval = -1;\n }\n }\n }\n scheduleNext(nextInterval);\n emitter(playbackOps);\n };\n const scheduleNext = (nextInterval: number) => {\n if (nextInterval >= 0 && current < fetchedOps.length) {\n setTimeout(replayNextOps, nextInterval);\n } else {\n this.replayCurrent += current;\n resolve();\n }\n };\n scheduleNext(ReplayControllerStatic.DelayInterval);\n });\n }\n}\n\nexport class ReplayDocumentDeltaConnection\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable {\n /**\n * Creates a new delta connection and mimics the delta connection to replay ops on it.\n * @param documentService - The document service to be used to get underlying endpoints.\n */\n public static create(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController): IDocumentDeltaConnection {\n const connection: IConnected = {\n claims: ReplayDocumentDeltaConnection.claims,\n clientId: \"PseudoClientId\",\n existing: true,\n initialMessages: [],\n initialSignals: [],\n initialClients: [],\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n mode: \"read\",\n serviceConfiguration: {\n blockSize: 64436,\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n summary: {\n idleTime: 5000,\n maxOps: 1000,\n maxTime: 5000 * 12,\n maxAckWaitTime: 600000,\n },\n },\n supportedVersions: [ReplayDocumentDeltaConnection.replayProtocolVersion],\n version: ReplayDocumentDeltaConnection.replayProtocolVersion,\n };\n const deltaConnection = new ReplayDocumentDeltaConnection(connection);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaConnection.fetchAndEmitOps(documentStorageService, controller);\n\n return deltaConnection;\n }\n\n private static readonly replayProtocolVersion = \"^0.1.0\";\n // Since the replay service never actually sends messages the size below is arbitrary\n private static readonly ReplayMaxMessageSize = 16 * 1024;\n\n private static readonly claims: ITokenClaims = {\n documentId: ReplayDocumentId,\n scopes: [ScopeType.DocRead],\n tenantId: \"\",\n user: {\n id: \"\",\n },\n iat: Math.round(new Date().getTime() / 1000),\n exp: Math.round(new Date().getTime() / 1000) + 60 * 60, // 1 hour expiration\n ver: \"1.0\",\n };\n\n public get clientId(): string {\n return this.details.clientId;\n }\n\n public get mode(): ConnectionMode {\n return this.details.mode;\n }\n\n public get claims(): ITokenClaims {\n return this.details.claims;\n }\n\n public get existing(): boolean {\n return this.details.existing;\n }\n\n public get version(): string {\n return this.details.version;\n }\n\n public get initialMessages(): ISequencedDocumentMessage[] {\n return this.details.initialMessages;\n }\n\n public get initialSignals(): ISignalMessage[] {\n return this.details.initialSignals;\n }\n\n public get initialClients(): ISignalClient[] {\n return this.details.initialClients;\n }\n\n public get serviceConfiguration(): IClientConfiguration {\n return this.details.serviceConfiguration;\n }\n\n public readonly maxMessageSize = ReplayDocumentDeltaConnection.ReplayMaxMessageSize;\n\n constructor(\n public details: IConnected,\n ) {\n super();\n }\n\n public submit(documentMessage: IDocumentMessage[]): void {\n // ReplayDocumentDeltaConnection.submit() can't be called - client never sees its own join on,\n // and thus can never move to sending ops.\n throw new Error(\"ReplayDocumentDeltaConnection.submit() can't be called\");\n }\n\n public async submitSignal(message: any) {\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n\n /**\n * This gets the specified ops from the delta storage endpoint and replays them in the replayer.\n */\n private async fetchAndEmitOps(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController,\n ): Promise<void> {\n let done;\n let replayPromiseChain = Promise.resolve();\n\n let currentOp = await controller.getStartingOpSequence();\n\n do {\n const fetchTo = controller.fetchTo(currentOp);\n\n const abortController = new AbortController();\n const stream = documentStorageService.fetchMessages(currentOp + 1, fetchTo, abortController.signal);\n do {\n const result = await stream.read();\n\n if (result.done) {\n // No more ops. But, they can show up later, either because document was just created,\n // or because another client keeps submitting new ops.\n done = controller.isDoneFetch(currentOp, undefined);\n if (!done) {\n await delay(2000);\n }\n break;\n }\n replayPromiseChain = replayPromiseChain.then(\n async () => controller.replay((ops) => this.emit(\"op\", ReplayDocumentId, ops), messages));\n\n const messages = result.value;\n currentOp += messages.length;\n done = controller.isDoneFetch(currentOp, messages[messages.length - 1].timestamp);\n } while (!done);\n\n abortController.abort();\n } while (!done);\n return replayPromiseChain;\n }\n}\n"]}
|
|
@@ -27,7 +27,7 @@ export declare class FileSnapshotReader extends ReadDocumentStorageServiceBase i
|
|
|
27
27
|
[key: string]: ISnapshotTree;
|
|
28
28
|
};
|
|
29
29
|
constructor(json: IFileSnapshot);
|
|
30
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
30
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
31
31
|
getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null>;
|
|
32
32
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
33
33
|
}
|
|
@@ -36,12 +36,12 @@ export declare class SnapshotStorage extends ReadDocumentStorageServiceBase {
|
|
|
36
36
|
protected readonly docTree: ISnapshotTree | null;
|
|
37
37
|
protected docId?: string;
|
|
38
38
|
constructor(storage: IDocumentStorageService, docTree: ISnapshotTree | null);
|
|
39
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
39
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
40
40
|
getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null>;
|
|
41
41
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
42
42
|
}
|
|
43
43
|
export declare class OpStorage extends ReadDocumentStorageServiceBase {
|
|
44
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
44
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
45
45
|
getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null>;
|
|
46
46
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageImplementations.d.ts","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,wBAAwB,EACxB,4BAA4B,EAC5B,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACf,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACH,OAAO,EACP,aAAa,EACb,KAAK,EACL,QAAQ,EACR,YAAY,EACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAC;CACrC;AAED,qBAAa,kBAAmB,SAAQ,8BAA+B,YAAW,uBAAuB;IAErG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,uBAAuB;IAEzE,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAM;IAC1D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAA;KAAE,CAAM;gBAE7C,IAAI,EAAE,aAAa;IAQzB,WAAW,CACpB,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"storageImplementations.d.ts","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,10 @@ class FileSnapshotReader extends replayController_1.ReadDocumentStorageServiceBa
|
|
|
19
19
|
this.docTree = driver_utils_1.buildSnapshotTree(json.tree.entries, this.blobs);
|
|
20
20
|
}
|
|
21
21
|
async getVersions(versionId, count) {
|
|
22
|
-
if (this.docId === undefined || this.docId === versionId) {
|
|
23
|
-
|
|
22
|
+
if (this.docId === undefined || this.docId === versionId || versionId === null) {
|
|
23
|
+
if (versionId !== null) {
|
|
24
|
+
this.docId = versionId;
|
|
25
|
+
}
|
|
24
26
|
return [{ id: "latest", treeId: "" }];
|
|
25
27
|
}
|
|
26
28
|
if (this.commits[versionId] !== undefined) {
|
|
@@ -64,8 +66,10 @@ class SnapshotStorage extends replayController_1.ReadDocumentStorageServiceBase
|
|
|
64
66
|
common_utils_1.assert(!!this.docTree, 0x0b0 /* "Missing document snapshot tree!" */);
|
|
65
67
|
}
|
|
66
68
|
async getVersions(versionId, count) {
|
|
67
|
-
if (this.docId === undefined || this.docId === versionId) {
|
|
68
|
-
|
|
69
|
+
if (this.docId === undefined || this.docId === versionId || versionId === null) {
|
|
70
|
+
if (versionId !== null) {
|
|
71
|
+
this.docId = versionId;
|
|
72
|
+
}
|
|
69
73
|
return [{ id: "latest", treeId: "" }];
|
|
70
74
|
}
|
|
71
75
|
return this.storage.getVersions(versionId, count);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageImplementations.js","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentService,\n IDocumentServiceFactory,\n IDocumentStorageService,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n IClient,\n ISnapshotTree,\n ITree,\n IVersion,\n ISummaryTree,\n} from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { EmptyDeltaStorageService } from \"./emptyDeltaStorageService\";\nimport { ReadDocumentStorageServiceBase } from \"./replayController\";\n\n/**\n * Structure of snapshot on disk, when we store snapshot as single file\n */\nexport interface IFileSnapshot {\n tree: ITree;\n commits: { [key: string]: ITree };\n}\n\nexport class FileSnapshotReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {\n // IVersion.treeId used to communicate between getVersions() & getSnapshotTree() calls to indicate IVersion is ours.\n protected static readonly FileStorageVersionTreeId = \"FileStorageTreeId\";\n\n protected docId?: string;\n protected docTree: ISnapshotTree;\n protected blobs: Map<string, ArrayBufferLike>;\n protected readonly commits: { [key: string]: ITree } = {};\n protected readonly trees: { [key: string]: ISnapshotTree } = {};\n\n public constructor(json: IFileSnapshot) {\n super();\n this.commits = json.commits;\n\n this.blobs = new Map<string, ArrayBufferLike>();\n this.docTree = buildSnapshotTree(json.tree.entries, this.blobs);\n }\n\n public async getVersions(\n versionId: string,\n count: number): Promise<IVersion[]> {\n if (this.docId === undefined || this.docId === versionId) {\n this.docId = versionId;\n return [{ id: \"latest\", treeId: \"\" }];\n }\n\n if (this.commits[versionId] !== undefined) {\n return [{ id: versionId, treeId: FileSnapshotReader.FileStorageVersionTreeId }];\n }\n throw new Error(`Unknown version ID: ${versionId}`);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (!versionRequested || versionRequested.id === \"latest\") {\n return this.docTree;\n }\n if (versionRequested.treeId !== FileSnapshotReader.FileStorageVersionTreeId) {\n throw new Error(`Unknown version id: ${versionRequested}`);\n }\n\n let snapshotTree = this.trees[versionRequested.id];\n if (snapshotTree === undefined) {\n const tree = this.commits[versionRequested.id];\n if (tree === undefined) {\n throw new Error(`Can't find version ${versionRequested.id}`);\n }\n\n this.trees[versionRequested.id] = snapshotTree = buildSnapshotTree(tree.entries, this.blobs);\n }\n return snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const blob = this.blobs.get(blobId);\n if (blob !== undefined) {\n return blob;\n }\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class SnapshotStorage extends ReadDocumentStorageServiceBase {\n protected docId?: string;\n\n constructor(\n protected readonly storage: IDocumentStorageService,\n protected readonly docTree: ISnapshotTree | null) {\n super();\n assert(!!this.docTree, 0x0b0 /* \"Missing document snapshot tree!\" */);\n }\n\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n if (this.docId === undefined || this.docId === versionId) {\n this.docId = versionId;\n return [{ id: \"latest\", treeId: \"\" }];\n }\n return this.storage.getVersions(versionId, count);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (versionRequested && versionRequested.id !== \"latest\") {\n return this.storage.getSnapshotTree(versionRequested);\n }\n\n return this.docTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.storage.readBlob(blobId);\n }\n}\n\nexport class OpStorage extends ReadDocumentStorageServiceBase {\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n throw new Error(\"no snapshot tree should be asked when playing ops\");\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class StaticStorageDocumentService implements IDocumentService {\n constructor(private readonly storage: IDocumentStorageService) { }\n\n public dispose() {}\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public get resolvedUrl(): IResolvedUrl {\n throw new Error(\"Not implemented\");\n }\n\n public async connectToStorage(): Promise<IDocumentStorageService> {\n return this.storage;\n }\n\n public async connectToDeltaStorage(): Promise<IDocumentDeltaStorageService> {\n return new EmptyDeltaStorageService();\n }\n\n public async connectToDeltaStream(client: IClient): Promise<IDocumentDeltaConnection> {\n // We have no delta stream, so make it not return forever...\n return new Promise(() => { });\n }\n}\n\nexport class StaticStorageDocumentServiceFactory implements IDocumentServiceFactory {\n public readonly protocolName = \"fluid-static-storage:\";\n public constructor(protected readonly storage: IDocumentStorageService) { }\n\n public async createDocumentService(fileURL: IResolvedUrl): Promise<IDocumentService> {\n return new StaticStorageDocumentService(this.storage);\n }\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public async createContainer(\n createNewSummary: ISummaryTree,\n resolvedUrl: IResolvedUrl,\n logger: ITelemetryLogger,\n ): Promise<IDocumentService> {\n throw new Error(\"Not implemented\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storageImplementations.js","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentService,\n IDocumentServiceFactory,\n IDocumentStorageService,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n IClient,\n ISnapshotTree,\n ITree,\n IVersion,\n ISummaryTree,\n} from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { EmptyDeltaStorageService } from \"./emptyDeltaStorageService\";\nimport { ReadDocumentStorageServiceBase } from \"./replayController\";\n\n/**\n * Structure of snapshot on disk, when we store snapshot as single file\n */\nexport interface IFileSnapshot {\n tree: ITree;\n commits: { [key: string]: ITree };\n}\n\nexport class FileSnapshotReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {\n // IVersion.treeId used to communicate between getVersions() & getSnapshotTree() calls to indicate IVersion is ours.\n protected static readonly FileStorageVersionTreeId = \"FileStorageTreeId\";\n\n protected docId?: string;\n protected docTree: ISnapshotTree;\n protected blobs: Map<string, ArrayBufferLike>;\n protected readonly commits: { [key: string]: ITree } = {};\n protected readonly trees: { [key: string]: ISnapshotTree } = {};\n\n public constructor(json: IFileSnapshot) {\n super();\n this.commits = json.commits;\n\n this.blobs = new Map<string, ArrayBufferLike>();\n this.docTree = buildSnapshotTree(json.tree.entries, this.blobs);\n }\n\n public async getVersions(\n versionId: string | null,\n count: number): Promise<IVersion[]> {\n\n if (this.docId === undefined || this.docId === versionId || versionId === null) {\n if (versionId !== null){\n this.docId = versionId;\n }\n return [{ id: \"latest\", treeId: \"\" }];\n }\n\n if (this.commits[versionId] !== undefined) {\n return [{ id: versionId, treeId: FileSnapshotReader.FileStorageVersionTreeId }];\n }\n throw new Error(`Unknown version ID: ${versionId}`);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (!versionRequested || versionRequested.id === \"latest\") {\n return this.docTree;\n }\n if (versionRequested.treeId !== FileSnapshotReader.FileStorageVersionTreeId) {\n throw new Error(`Unknown version id: ${versionRequested}`);\n }\n\n let snapshotTree = this.trees[versionRequested.id];\n if (snapshotTree === undefined) {\n const tree = this.commits[versionRequested.id];\n if (tree === undefined) {\n throw new Error(`Can't find version ${versionRequested.id}`);\n }\n\n this.trees[versionRequested.id] = snapshotTree = buildSnapshotTree(tree.entries, this.blobs);\n }\n return snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const blob = this.blobs.get(blobId);\n if (blob !== undefined) {\n return blob;\n }\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class SnapshotStorage extends ReadDocumentStorageServiceBase {\n protected docId?: string;\n\n constructor(\n protected readonly storage: IDocumentStorageService,\n protected readonly docTree: ISnapshotTree | null) {\n super();\n assert(!!this.docTree, 0x0b0 /* \"Missing document snapshot tree!\" */);\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n if (this.docId === undefined || this.docId === versionId || versionId === null) {\n if (versionId !== null){\n this.docId = versionId;\n }\n return [{ id: \"latest\", treeId: \"\" }];\n }\n return this.storage.getVersions(versionId, count);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (versionRequested && versionRequested.id !== \"latest\") {\n return this.storage.getSnapshotTree(versionRequested);\n }\n\n return this.docTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.storage.readBlob(blobId);\n }\n}\n\nexport class OpStorage extends ReadDocumentStorageServiceBase {\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n throw new Error(\"no snapshot tree should be asked when playing ops\");\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class StaticStorageDocumentService implements IDocumentService {\n constructor(private readonly storage: IDocumentStorageService) { }\n\n public dispose() {}\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public get resolvedUrl(): IResolvedUrl {\n throw new Error(\"Not implemented\");\n }\n\n public async connectToStorage(): Promise<IDocumentStorageService> {\n return this.storage;\n }\n\n public async connectToDeltaStorage(): Promise<IDocumentDeltaStorageService> {\n return new EmptyDeltaStorageService();\n }\n\n public async connectToDeltaStream(client: IClient): Promise<IDocumentDeltaConnection> {\n // We have no delta stream, so make it not return forever...\n return new Promise(() => { });\n }\n}\n\nexport class StaticStorageDocumentServiceFactory implements IDocumentServiceFactory {\n public readonly protocolName = \"fluid-static-storage:\";\n public constructor(protected readonly storage: IDocumentStorageService) { }\n\n public async createDocumentService(fileURL: IResolvedUrl): Promise<IDocumentService> {\n return new StaticStorageDocumentService(this.storage);\n }\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public async createContainer(\n createNewSummary: ISummaryTree,\n resolvedUrl: IResolvedUrl,\n logger: ITelemetryLogger,\n ): Promise<IDocumentService> {\n throw new Error(\"Not implemented\");\n }\n}\n"]}
|
package/lib/packageVersion.d.ts
CHANGED
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
|
|
6
6
|
*/
|
|
7
7
|
export declare const pkgName = "@fluidframework/replay-driver";
|
|
8
|
-
export declare const pkgVersion = "0.
|
|
8
|
+
export declare const pkgVersion = "0.56.2";
|
|
9
9
|
//# sourceMappingURL=packageVersion.d.ts.map
|
package/lib/packageVersion.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,+BAA+B,CAAC;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/replay-driver\";\nexport const pkgVersion = \"0.
|
|
1
|
+
{"version":3,"file":"packageVersion.js","sourceRoot":"","sources":["../src/packageVersion.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,+BAA+B,CAAC;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n *\n * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\n */\n\nexport const pkgName = \"@fluidframework/replay-driver\";\nexport const pkgVersion = \"0.56.2\";\n"]}
|
|
@@ -8,7 +8,7 @@ import * as api from "@fluidframework/protocol-definitions";
|
|
|
8
8
|
* Partial implementation of IDocumentStorageService
|
|
9
9
|
*/
|
|
10
10
|
export declare abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {
|
|
11
|
-
abstract getVersions(versionId: string, count: number): Promise<api.IVersion[]>;
|
|
11
|
+
abstract getVersions(versionId: string | null, count: number): Promise<api.IVersion[]>;
|
|
12
12
|
abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;
|
|
13
13
|
abstract readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
14
14
|
uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayController.d.ts","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,sCAAsC,CAAC;AAE5D;;GAEG;AACH,8BAAsB,8BAA+B,YAAW,uBAAuB;aACnE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"replayController.d.ts","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACH,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,GAAG,MAAM,sCAAsC,CAAC;AAE5D;;GAEG;AACH,8BAAsB,8BAA+B,YAAW,uBAAuB;aACnE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;aAC7E,eAAe,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;aAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAErD,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAI9F,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IAI9F,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAInE,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAInF,IAAW,aAAa,IAAI,MAAM,CAEjC;CACJ;AAED;;;;GAIG;AACH,8BAAsB,gBAAiB,SAAQ,8BAA8B;IACzE;;;;;OAKG;aACa,WAAW,CAAC,eAAe,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhF;;;OAGG;aACa,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC;IAExD;;;;OAIG;aACa,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAE9D;;;;;;;;OAQG;aACa,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;IAE/E;;;;;OAKG;aACa,MAAM,CAClB,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,yBAAyB,EAAE,KAAK,IAAI,EACtD,UAAU,EAAE,GAAG,CAAC,yBAAyB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAClE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayController.js","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,MAAM,OAAgB,8BAA8B;IAKzC,KAAK,CAAC,wBAAwB,CAAC,OAAyB,EAAE,OAAwB;QACrF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAe,EAAE,OAAiB,EAAE,OAAe,EAAE,GAAW;QAC/E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAA0B;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAW,aAAa;QACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,8BAA8B;CA0C5E","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDocumentService,\n IDocumentStorageService,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport * as api from \"@fluidframework/protocol-definitions\";\n\n/**\n * Partial implementation of IDocumentStorageService\n */\nexport abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {\n public abstract getVersions(versionId: string, count: number): Promise<api.IVersion[]>;\n public abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;\n public abstract readBlob(blobId: string): Promise<ArrayBufferLike>;\n\n public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async write(tree: api.ITree, parents: string[], message: string, ref: string): Promise<api.IVersion> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<api.ICreateBlobResponse> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async downloadSummary(handle: api.ISummaryHandle): Promise<api.ISummaryTree> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public get repositoryUrl(): string {\n throw new Error(\"Invalid operation\");\n }\n}\n\n/**\n * Replay controller object\n * It controls where we start (snapshot, local file, no snapshots)\n * As well as dispatch of ops\n */\nexport abstract class ReplayController extends ReadDocumentStorageServiceBase {\n /**\n * Initialize reply controller\n * @param documentService - the real document service\n * @returns - Boolean, indicating if controller should be used.\n * If false is returned, caller should fallback to original storage.\n */\n public abstract initStorage(documentService: IDocumentService): Promise<boolean>;\n\n /**\n * Returns sequence number to start processing ops\n * Should be zero if not using snapshot, and snapshot seq# otherwise\n */\n public abstract getStartingOpSequence(): Promise<number>;\n\n /**\n * Returns last op number to fetch from current op\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n */\n public abstract fetchTo(currentOp: number): number | undefined;\n\n /**\n * Returns true if no more ops should be processed (or downloaded for future processing).\n * It's called at end of each batch with latest op timestamp.\n * Also it's called when there are no more ops available (lastTimeStamp === undefined).\n * If false is returned and there are no more ops, request for more ops is made every 2 seconds.\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n * @param lastTimeStamp - timestamp of last op (if more ops are available). Undefined otherwise.\n */\n public abstract isDoneFetch(currentOp: number, lastTimeStamp?: number): boolean;\n\n /**\n * Replay batch of ops\n * NOTE: new batch of ops is fetched (fetchTo() & isDoneFetch() APIs are called) while this call is in flights\n * @param emitter - callback to emit ops\n * @param fetchedOps - ops to process\n */\n public abstract replay(\n emitter: (op: api.ISequencedDocumentMessage[]) => void,\n fetchedOps: api.ISequencedDocumentMessage[]): Promise<void>;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"replayController.js","sourceRoot":"","sources":["../src/replayController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,MAAM,OAAgB,8BAA8B;IAKzC,KAAK,CAAC,wBAAwB,CAAC,OAAyB,EAAE,OAAwB;QACrF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAe,EAAE,OAAiB,EAAE,OAAe,EAAE,GAAW;QAC/E,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAA0B;QACnD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAW,aAAa;QACpB,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;CACJ;AAED;;;;GAIG;AACH,MAAM,OAAgB,gBAAiB,SAAQ,8BAA8B;CA0C5E","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport {\n IDocumentService,\n IDocumentStorageService,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport * as api from \"@fluidframework/protocol-definitions\";\n\n/**\n * Partial implementation of IDocumentStorageService\n */\nexport abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {\n public abstract getVersions(versionId: string | null, count: number): Promise<api.IVersion[]>;\n public abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;\n public abstract readBlob(blobId: string): Promise<ArrayBufferLike>;\n\n public async uploadSummaryWithContext(summary: api.ISummaryTree, context: ISummaryContext): Promise<string> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async write(tree: api.ITree, parents: string[], message: string, ref: string): Promise<api.IVersion> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<api.ICreateBlobResponse> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async downloadSummary(handle: api.ISummaryHandle): Promise<api.ISummaryTree> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public get repositoryUrl(): string {\n throw new Error(\"Invalid operation\");\n }\n}\n\n/**\n * Replay controller object\n * It controls where we start (snapshot, local file, no snapshots)\n * As well as dispatch of ops\n */\nexport abstract class ReplayController extends ReadDocumentStorageServiceBase {\n /**\n * Initialize reply controller\n * @param documentService - the real document service\n * @returns - Boolean, indicating if controller should be used.\n * If false is returned, caller should fallback to original storage.\n */\n public abstract initStorage(documentService: IDocumentService): Promise<boolean>;\n\n /**\n * Returns sequence number to start processing ops\n * Should be zero if not using snapshot, and snapshot seq# otherwise\n */\n public abstract getStartingOpSequence(): Promise<number>;\n\n /**\n * Returns last op number to fetch from current op\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n */\n public abstract fetchTo(currentOp: number): number | undefined;\n\n /**\n * Returns true if no more ops should be processed (or downloaded for future processing).\n * It's called at end of each batch with latest op timestamp.\n * Also it's called when there are no more ops available (lastTimeStamp === undefined).\n * If false is returned and there are no more ops, request for more ops is made every 2 seconds.\n * Note: this API is called while replay() is in progress - next batch of ops is downloaded in parallel\n * @param currentOp - current op\n * @param lastTimeStamp - timestamp of last op (if more ops are available). Undefined otherwise.\n */\n public abstract isDoneFetch(currentOp: number, lastTimeStamp?: number): boolean;\n\n /**\n * Replay batch of ops\n * NOTE: new batch of ops is fetched (fetchTo() & isDoneFetch() APIs are called) while this call is in flights\n * @param emitter - callback to emit ops\n * @param fetchedOps - ops to process\n */\n public abstract replay(\n emitter: (op: api.ISequencedDocumentMessage[]) => void,\n fetchedOps: api.ISequencedDocumentMessage[]): Promise<void>;\n}\n"]}
|
|
@@ -24,7 +24,7 @@ export declare class ReplayControllerStatic extends ReplayController {
|
|
|
24
24
|
*/
|
|
25
25
|
constructor(replayFrom: number, replayTo: number, unitIsTime?: boolean | undefined);
|
|
26
26
|
initStorage(documentService: IDocumentService): Promise<boolean>;
|
|
27
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
27
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
28
28
|
getSnapshotTree(version?: IVersion): Promise<null>;
|
|
29
29
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
30
30
|
getStartingOpSequence(): Promise<number>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayDocumentDeltaConnection.d.ts","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACjE,OAAO,EACH,wBAAwB,EACxB,4BAA4B,EAC5B,8BAA8B,EAC9B,gBAAgB,EACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,cAAc,EACd,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,yBAAyB,EACzB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,QAAQ,EAEX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAS,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,qBAAa,sBAAuB,SAAQ,gBAAgB;aAgBpC,UAAU,EAAE,MAAM;aAClB,QAAQ,EAAE,MAAM;aAChB,UAAU,CAAC;IAjB/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAM;IAC3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAE9C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAG1B;;;;;;OAMG;gBAEiB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,qBAAS;IAQ3B,WAAW,CAAC,eAAe,EAAE,gBAAgB;IAI7C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"replayDocumentDeltaConnection.d.ts","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replayDocumentDeltaConnection.js","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDisposable } from \"@fluidframework/common-definitions\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentDeltaConnectionEvents,\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ConnectionMode,\n IClientConfiguration,\n IConnected,\n IDocumentMessage,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n IVersion,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { delay, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { ReplayController } from \"./replayController\";\n\nconst ReplayDocumentId = \"documentId\";\n\nexport class ReplayControllerStatic extends ReplayController {\n private static readonly DelayInterval = 50;\n private static readonly ReplayResolution = 15;\n\n private firstTimeStamp: number | undefined;\n private replayCurrent = 0;\n // Simulated delay interval for emitting the ops\n\n /**\n * Helper class\n *\n * @param replayFrom - First op to be played on socket.\n * @param replayTo - Last op number to be played on socket.\n * @param unitIsTime - True is user want to play ops that are within a replay resolution window.\n */\n public constructor(\n public readonly replayFrom: number,\n public readonly replayTo: number,\n public readonly unitIsTime?: boolean) {\n super();\n if (unitIsTime !== true) {\n // There is no code in here to start with snapshot, thus we have to start with op #0.\n this.replayTo = 0;\n }\n }\n\n public async initStorage(documentService: IDocumentService) {\n return true;\n }\n\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion) {\n return version ? Promise.reject(new Error(\"Invalid operation\")) : null;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async getStartingOpSequence(): Promise<number> {\n return 0;\n }\n\n public fetchTo(currentOp: number) {\n if (!(this.unitIsTime !== true && this.replayTo >= 0)) {\n return undefined;\n }\n return this.replayTo;\n }\n\n public isDoneFetch(currentOp: number, lastTimeStamp?: number) {\n if (this.replayTo >= 0) {\n if (this.unitIsTime === true) {\n return (\n lastTimeStamp !== undefined\n && this.firstTimeStamp !== undefined\n && lastTimeStamp - this.firstTimeStamp >= this.replayTo);\n }\n return currentOp >= this.replayTo;\n }\n return lastTimeStamp === undefined; // No more ops\n }\n\n public skipToIndex(fetchedOps: ISequencedDocumentMessage[]) {\n if (this.replayFrom <= 0) {\n return 0;\n }\n if (this.unitIsTime === true) {\n for (let i = 0; i < fetchedOps.length; i += 1) {\n const timeStamp = fetchedOps[i].timestamp;\n if (timeStamp !== undefined) {\n if (this.firstTimeStamp === undefined) {\n this.firstTimeStamp = timeStamp;\n }\n if (timeStamp - this.firstTimeStamp >= this.replayFrom) {\n return i;\n }\n }\n }\n } else if (this.replayFrom > this.replayCurrent) {\n return this.replayFrom - this.replayCurrent;\n }\n return 0;\n }\n\n public async replay(\n emitter: (op: ISequencedDocumentMessage[]) => void,\n fetchedOps: ISequencedDocumentMessage[]): Promise<void> {\n let current = this.skipToIndex(fetchedOps);\n\n return new Promise((resolve) => {\n const replayNextOps = () => {\n // Emit the ops from replay to the end every \"deltainterval\" milliseconds\n // to simulate the socket stream\n const currentOp = fetchedOps[current];\n const playbackOps = [currentOp];\n let nextInterval = ReplayControllerStatic.DelayInterval;\n current += 1;\n\n if (this.unitIsTime === true) {\n const currentTimeStamp = currentOp.timestamp;\n if (currentTimeStamp !== undefined) {\n // Emit more ops that is in the ReplayResolution window\n\n while (current < fetchedOps.length) {\n const op = fetchedOps[current];\n if (op.timestamp === undefined) {\n // Missing timestamp, just delay the standard amount of time\n break;\n }\n const timeDiff = op.timestamp - currentTimeStamp;\n if (timeDiff >= ReplayControllerStatic.ReplayResolution) {\n // Time exceeded the resolution window, break out the loop\n // and delay for the time difference.\n nextInterval = timeDiff;\n break;\n }\n if (timeDiff < 0) {\n // Time have regressed, just delay the standard amount of time\n break;\n }\n\n // The op is within the ReplayResolution emit it now\n playbackOps.push(op);\n current += 1;\n }\n\n if (this.firstTimeStamp !== undefined\n && this.replayTo >= 0\n && currentTimeStamp + nextInterval - this.firstTimeStamp > this.replayTo) {\n nextInterval = -1;\n }\n }\n }\n scheduleNext(nextInterval);\n emitter(playbackOps);\n };\n const scheduleNext = (nextInterval: number) => {\n if (nextInterval >= 0 && current < fetchedOps.length) {\n setTimeout(replayNextOps, nextInterval);\n } else {\n this.replayCurrent += current;\n resolve();\n }\n };\n scheduleNext(ReplayControllerStatic.DelayInterval);\n });\n }\n}\n\nexport class ReplayDocumentDeltaConnection\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable {\n /**\n * Creates a new delta connection and mimics the delta connection to replay ops on it.\n * @param documentService - The document service to be used to get underlying endpoints.\n */\n public static create(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController): IDocumentDeltaConnection {\n const connection: IConnected = {\n claims: ReplayDocumentDeltaConnection.claims,\n clientId: \"PseudoClientId\",\n existing: true,\n initialMessages: [],\n initialSignals: [],\n initialClients: [],\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n mode: \"read\",\n serviceConfiguration: {\n blockSize: 64436,\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n summary: {\n idleTime: 5000,\n maxOps: 1000,\n maxTime: 5000 * 12,\n maxAckWaitTime: 600000,\n },\n },\n supportedVersions: [ReplayDocumentDeltaConnection.replayProtocolVersion],\n version: ReplayDocumentDeltaConnection.replayProtocolVersion,\n };\n const deltaConnection = new ReplayDocumentDeltaConnection(connection);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaConnection.fetchAndEmitOps(documentStorageService, controller);\n\n return deltaConnection;\n }\n\n private static readonly replayProtocolVersion = \"^0.1.0\";\n // Since the replay service never actually sends messages the size below is arbitrary\n private static readonly ReplayMaxMessageSize = 16 * 1024;\n\n private static readonly claims: ITokenClaims = {\n documentId: ReplayDocumentId,\n scopes: [ScopeType.DocRead],\n tenantId: \"\",\n user: {\n id: \"\",\n },\n iat: Math.round(new Date().getTime() / 1000),\n exp: Math.round(new Date().getTime() / 1000) + 60 * 60, // 1 hour expiration\n ver: \"1.0\",\n };\n\n public get clientId(): string {\n return this.details.clientId;\n }\n\n public get mode(): ConnectionMode {\n return this.details.mode;\n }\n\n public get claims(): ITokenClaims {\n return this.details.claims;\n }\n\n public get existing(): boolean {\n return this.details.existing;\n }\n\n public get version(): string {\n return this.details.version;\n }\n\n public get initialMessages(): ISequencedDocumentMessage[] {\n return this.details.initialMessages;\n }\n\n public get initialSignals(): ISignalMessage[] {\n return this.details.initialSignals;\n }\n\n public get initialClients(): ISignalClient[] {\n return this.details.initialClients;\n }\n\n public get serviceConfiguration(): IClientConfiguration {\n return this.details.serviceConfiguration;\n }\n\n public readonly maxMessageSize = ReplayDocumentDeltaConnection.ReplayMaxMessageSize;\n\n constructor(\n public details: IConnected,\n ) {\n super();\n }\n\n public submit(documentMessage: IDocumentMessage[]): void {\n // ReplayDocumentDeltaConnection.submit() can't be called - client never sees its own join on,\n // and thus can never move to sending ops.\n throw new Error(\"ReplayDocumentDeltaConnection.submit() can't be called\");\n }\n\n public async submitSignal(message: any) {\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n\n /**\n * This gets the specified ops from the delta storage endpoint and replays them in the replayer.\n */\n private async fetchAndEmitOps(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController,\n ): Promise<void> {\n let done;\n let replayPromiseChain = Promise.resolve();\n\n let currentOp = await controller.getStartingOpSequence();\n\n do {\n const fetchTo = controller.fetchTo(currentOp);\n\n const abortController = new AbortController();\n const stream = documentStorageService.fetchMessages(currentOp + 1, fetchTo, abortController.signal);\n do {\n const result = await stream.read();\n\n if (result.done) {\n // No more ops. But, they can show up later, either because document was just created,\n // or because another client keeps submitting new ops.\n done = controller.isDoneFetch(currentOp, undefined);\n if (!done) {\n await delay(2000);\n }\n break;\n }\n replayPromiseChain = replayPromiseChain.then(\n async () => controller.replay((ops) => this.emit(\"op\", ReplayDocumentId, ops), messages));\n\n const messages = result.value;\n currentOp += messages.length;\n done = controller.isDoneFetch(currentOp, messages[messages.length - 1].timestamp);\n } while (!done);\n\n abortController.abort();\n } while (!done);\n return replayPromiseChain;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"replayDocumentDeltaConnection.js","sourceRoot":"","sources":["../src/replayDocumentDeltaConnection.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { IDisposable } from \"@fluidframework/common-definitions\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentDeltaConnectionEvents,\n IDocumentService,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ConnectionMode,\n IClientConfiguration,\n IConnected,\n IDocumentMessage,\n ISequencedDocumentMessage,\n ISignalClient,\n ISignalMessage,\n ITokenClaims,\n IVersion,\n ScopeType,\n} from \"@fluidframework/protocol-definitions\";\nimport { delay, TypedEventEmitter } from \"@fluidframework/common-utils\";\nimport { ReplayController } from \"./replayController\";\n\nconst ReplayDocumentId = \"documentId\";\n\nexport class ReplayControllerStatic extends ReplayController {\n private static readonly DelayInterval = 50;\n private static readonly ReplayResolution = 15;\n\n private firstTimeStamp: number | undefined;\n private replayCurrent = 0;\n // Simulated delay interval for emitting the ops\n\n /**\n * Helper class\n *\n * @param replayFrom - First op to be played on socket.\n * @param replayTo - Last op number to be played on socket.\n * @param unitIsTime - True is user want to play ops that are within a replay resolution window.\n */\n public constructor(\n public readonly replayFrom: number,\n public readonly replayTo: number,\n public readonly unitIsTime?: boolean) {\n super();\n if (unitIsTime !== true) {\n // There is no code in here to start with snapshot, thus we have to start with op #0.\n this.replayTo = 0;\n }\n }\n\n public async initStorage(documentService: IDocumentService) {\n return true;\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion) {\n return version ? Promise.reject(new Error(\"Invalid operation\")) : null;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return Promise.reject(new Error(\"Invalid operation\"));\n }\n\n public async getStartingOpSequence(): Promise<number> {\n return 0;\n }\n\n public fetchTo(currentOp: number) {\n if (!(this.unitIsTime !== true && this.replayTo >= 0)) {\n return undefined;\n }\n return this.replayTo;\n }\n\n public isDoneFetch(currentOp: number, lastTimeStamp?: number) {\n if (this.replayTo >= 0) {\n if (this.unitIsTime === true) {\n return (\n lastTimeStamp !== undefined\n && this.firstTimeStamp !== undefined\n && lastTimeStamp - this.firstTimeStamp >= this.replayTo);\n }\n return currentOp >= this.replayTo;\n }\n return lastTimeStamp === undefined; // No more ops\n }\n\n public skipToIndex(fetchedOps: ISequencedDocumentMessage[]) {\n if (this.replayFrom <= 0) {\n return 0;\n }\n if (this.unitIsTime === true) {\n for (let i = 0; i < fetchedOps.length; i += 1) {\n const timeStamp = fetchedOps[i].timestamp;\n if (timeStamp !== undefined) {\n if (this.firstTimeStamp === undefined) {\n this.firstTimeStamp = timeStamp;\n }\n if (timeStamp - this.firstTimeStamp >= this.replayFrom) {\n return i;\n }\n }\n }\n } else if (this.replayFrom > this.replayCurrent) {\n return this.replayFrom - this.replayCurrent;\n }\n return 0;\n }\n\n public async replay(\n emitter: (op: ISequencedDocumentMessage[]) => void,\n fetchedOps: ISequencedDocumentMessage[]): Promise<void> {\n let current = this.skipToIndex(fetchedOps);\n\n return new Promise((resolve) => {\n const replayNextOps = () => {\n // Emit the ops from replay to the end every \"deltainterval\" milliseconds\n // to simulate the socket stream\n const currentOp = fetchedOps[current];\n const playbackOps = [currentOp];\n let nextInterval = ReplayControllerStatic.DelayInterval;\n current += 1;\n\n if (this.unitIsTime === true) {\n const currentTimeStamp = currentOp.timestamp;\n if (currentTimeStamp !== undefined) {\n // Emit more ops that is in the ReplayResolution window\n\n while (current < fetchedOps.length) {\n const op = fetchedOps[current];\n if (op.timestamp === undefined) {\n // Missing timestamp, just delay the standard amount of time\n break;\n }\n const timeDiff = op.timestamp - currentTimeStamp;\n if (timeDiff >= ReplayControllerStatic.ReplayResolution) {\n // Time exceeded the resolution window, break out the loop\n // and delay for the time difference.\n nextInterval = timeDiff;\n break;\n }\n if (timeDiff < 0) {\n // Time have regressed, just delay the standard amount of time\n break;\n }\n\n // The op is within the ReplayResolution emit it now\n playbackOps.push(op);\n current += 1;\n }\n\n if (this.firstTimeStamp !== undefined\n && this.replayTo >= 0\n && currentTimeStamp + nextInterval - this.firstTimeStamp > this.replayTo) {\n nextInterval = -1;\n }\n }\n }\n scheduleNext(nextInterval);\n emitter(playbackOps);\n };\n const scheduleNext = (nextInterval: number) => {\n if (nextInterval >= 0 && current < fetchedOps.length) {\n setTimeout(replayNextOps, nextInterval);\n } else {\n this.replayCurrent += current;\n resolve();\n }\n };\n scheduleNext(ReplayControllerStatic.DelayInterval);\n });\n }\n}\n\nexport class ReplayDocumentDeltaConnection\n extends TypedEventEmitter<IDocumentDeltaConnectionEvents>\n implements IDocumentDeltaConnection, IDisposable {\n /**\n * Creates a new delta connection and mimics the delta connection to replay ops on it.\n * @param documentService - The document service to be used to get underlying endpoints.\n */\n public static create(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController): IDocumentDeltaConnection {\n const connection: IConnected = {\n claims: ReplayDocumentDeltaConnection.claims,\n clientId: \"PseudoClientId\",\n existing: true,\n initialMessages: [],\n initialSignals: [],\n initialClients: [],\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n mode: \"read\",\n serviceConfiguration: {\n blockSize: 64436,\n maxMessageSize: ReplayDocumentDeltaConnection.ReplayMaxMessageSize,\n summary: {\n idleTime: 5000,\n maxOps: 1000,\n maxTime: 5000 * 12,\n maxAckWaitTime: 600000,\n },\n },\n supportedVersions: [ReplayDocumentDeltaConnection.replayProtocolVersion],\n version: ReplayDocumentDeltaConnection.replayProtocolVersion,\n };\n const deltaConnection = new ReplayDocumentDeltaConnection(connection);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n deltaConnection.fetchAndEmitOps(documentStorageService, controller);\n\n return deltaConnection;\n }\n\n private static readonly replayProtocolVersion = \"^0.1.0\";\n // Since the replay service never actually sends messages the size below is arbitrary\n private static readonly ReplayMaxMessageSize = 16 * 1024;\n\n private static readonly claims: ITokenClaims = {\n documentId: ReplayDocumentId,\n scopes: [ScopeType.DocRead],\n tenantId: \"\",\n user: {\n id: \"\",\n },\n iat: Math.round(new Date().getTime() / 1000),\n exp: Math.round(new Date().getTime() / 1000) + 60 * 60, // 1 hour expiration\n ver: \"1.0\",\n };\n\n public get clientId(): string {\n return this.details.clientId;\n }\n\n public get mode(): ConnectionMode {\n return this.details.mode;\n }\n\n public get claims(): ITokenClaims {\n return this.details.claims;\n }\n\n public get existing(): boolean {\n return this.details.existing;\n }\n\n public get version(): string {\n return this.details.version;\n }\n\n public get initialMessages(): ISequencedDocumentMessage[] {\n return this.details.initialMessages;\n }\n\n public get initialSignals(): ISignalMessage[] {\n return this.details.initialSignals;\n }\n\n public get initialClients(): ISignalClient[] {\n return this.details.initialClients;\n }\n\n public get serviceConfiguration(): IClientConfiguration {\n return this.details.serviceConfiguration;\n }\n\n public readonly maxMessageSize = ReplayDocumentDeltaConnection.ReplayMaxMessageSize;\n\n constructor(\n public details: IConnected,\n ) {\n super();\n }\n\n public submit(documentMessage: IDocumentMessage[]): void {\n // ReplayDocumentDeltaConnection.submit() can't be called - client never sees its own join on,\n // and thus can never move to sending ops.\n throw new Error(\"ReplayDocumentDeltaConnection.submit() can't be called\");\n }\n\n public async submitSignal(message: any) {\n }\n\n private _disposed = false;\n public get disposed() { return this._disposed; }\n public dispose() { this._disposed = true; }\n\n /**\n * This gets the specified ops from the delta storage endpoint and replays them in the replayer.\n */\n private async fetchAndEmitOps(\n documentStorageService: IDocumentDeltaStorageService,\n controller: ReplayController,\n ): Promise<void> {\n let done;\n let replayPromiseChain = Promise.resolve();\n\n let currentOp = await controller.getStartingOpSequence();\n\n do {\n const fetchTo = controller.fetchTo(currentOp);\n\n const abortController = new AbortController();\n const stream = documentStorageService.fetchMessages(currentOp + 1, fetchTo, abortController.signal);\n do {\n const result = await stream.read();\n\n if (result.done) {\n // No more ops. But, they can show up later, either because document was just created,\n // or because another client keeps submitting new ops.\n done = controller.isDoneFetch(currentOp, undefined);\n if (!done) {\n await delay(2000);\n }\n break;\n }\n replayPromiseChain = replayPromiseChain.then(\n async () => controller.replay((ops) => this.emit(\"op\", ReplayDocumentId, ops), messages));\n\n const messages = result.value;\n currentOp += messages.length;\n done = controller.isDoneFetch(currentOp, messages[messages.length - 1].timestamp);\n } while (!done);\n\n abortController.abort();\n } while (!done);\n return replayPromiseChain;\n }\n}\n"]}
|
|
@@ -27,7 +27,7 @@ export declare class FileSnapshotReader extends ReadDocumentStorageServiceBase i
|
|
|
27
27
|
[key: string]: ISnapshotTree;
|
|
28
28
|
};
|
|
29
29
|
constructor(json: IFileSnapshot);
|
|
30
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
30
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
31
31
|
getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null>;
|
|
32
32
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
33
33
|
}
|
|
@@ -36,12 +36,12 @@ export declare class SnapshotStorage extends ReadDocumentStorageServiceBase {
|
|
|
36
36
|
protected readonly docTree: ISnapshotTree | null;
|
|
37
37
|
protected docId?: string;
|
|
38
38
|
constructor(storage: IDocumentStorageService, docTree: ISnapshotTree | null);
|
|
39
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
39
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
40
40
|
getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null>;
|
|
41
41
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
42
42
|
}
|
|
43
43
|
export declare class OpStorage extends ReadDocumentStorageServiceBase {
|
|
44
|
-
getVersions(versionId: string, count: number): Promise<IVersion[]>;
|
|
44
|
+
getVersions(versionId: string | null, count: number): Promise<IVersion[]>;
|
|
45
45
|
getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null>;
|
|
46
46
|
readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
47
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageImplementations.d.ts","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,wBAAwB,EACxB,4BAA4B,EAC5B,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,YAAY,EACf,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACH,OAAO,EACP,aAAa,EACb,KAAK,EACL,QAAQ,EACR,YAAY,EACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAC;CACrC;AAED,qBAAa,kBAAmB,SAAQ,8BAA+B,YAAW,uBAAuB;IAErG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,uBAAuB;IAEzE,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;IACjC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC9C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAA;KAAE,CAAM;IAC1D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAA;KAAE,CAAM;gBAE7C,IAAI,EAAE,aAAa;IAQzB,WAAW,CACpB,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"storageImplementations.d.ts","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,8 +16,10 @@ export class FileSnapshotReader extends ReadDocumentStorageServiceBase {
|
|
|
16
16
|
this.docTree = buildSnapshotTree(json.tree.entries, this.blobs);
|
|
17
17
|
}
|
|
18
18
|
async getVersions(versionId, count) {
|
|
19
|
-
if (this.docId === undefined || this.docId === versionId) {
|
|
20
|
-
|
|
19
|
+
if (this.docId === undefined || this.docId === versionId || versionId === null) {
|
|
20
|
+
if (versionId !== null) {
|
|
21
|
+
this.docId = versionId;
|
|
22
|
+
}
|
|
21
23
|
return [{ id: "latest", treeId: "" }];
|
|
22
24
|
}
|
|
23
25
|
if (this.commits[versionId] !== undefined) {
|
|
@@ -60,8 +62,10 @@ export class SnapshotStorage extends ReadDocumentStorageServiceBase {
|
|
|
60
62
|
assert(!!this.docTree, 0x0b0 /* "Missing document snapshot tree!" */);
|
|
61
63
|
}
|
|
62
64
|
async getVersions(versionId, count) {
|
|
63
|
-
if (this.docId === undefined || this.docId === versionId) {
|
|
64
|
-
|
|
65
|
+
if (this.docId === undefined || this.docId === versionId || versionId === null) {
|
|
66
|
+
if (versionId !== null) {
|
|
67
|
+
this.docId = versionId;
|
|
68
|
+
}
|
|
65
69
|
return [{ id: "latest", treeId: "" }];
|
|
66
70
|
}
|
|
67
71
|
return this.storage.getVersions(versionId, count);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storageImplementations.js","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentService,\n IDocumentServiceFactory,\n IDocumentStorageService,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n IClient,\n ISnapshotTree,\n ITree,\n IVersion,\n ISummaryTree,\n} from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { EmptyDeltaStorageService } from \"./emptyDeltaStorageService\";\nimport { ReadDocumentStorageServiceBase } from \"./replayController\";\n\n/**\n * Structure of snapshot on disk, when we store snapshot as single file\n */\nexport interface IFileSnapshot {\n tree: ITree;\n commits: { [key: string]: ITree };\n}\n\nexport class FileSnapshotReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {\n // IVersion.treeId used to communicate between getVersions() & getSnapshotTree() calls to indicate IVersion is ours.\n protected static readonly FileStorageVersionTreeId = \"FileStorageTreeId\";\n\n protected docId?: string;\n protected docTree: ISnapshotTree;\n protected blobs: Map<string, ArrayBufferLike>;\n protected readonly commits: { [key: string]: ITree } = {};\n protected readonly trees: { [key: string]: ISnapshotTree } = {};\n\n public constructor(json: IFileSnapshot) {\n super();\n this.commits = json.commits;\n\n this.blobs = new Map<string, ArrayBufferLike>();\n this.docTree = buildSnapshotTree(json.tree.entries, this.blobs);\n }\n\n public async getVersions(\n versionId: string,\n count: number): Promise<IVersion[]> {\n if (this.docId === undefined || this.docId === versionId) {\n this.docId = versionId;\n return [{ id: \"latest\", treeId: \"\" }];\n }\n\n if (this.commits[versionId] !== undefined) {\n return [{ id: versionId, treeId: FileSnapshotReader.FileStorageVersionTreeId }];\n }\n throw new Error(`Unknown version ID: ${versionId}`);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (!versionRequested || versionRequested.id === \"latest\") {\n return this.docTree;\n }\n if (versionRequested.treeId !== FileSnapshotReader.FileStorageVersionTreeId) {\n throw new Error(`Unknown version id: ${versionRequested}`);\n }\n\n let snapshotTree = this.trees[versionRequested.id];\n if (snapshotTree === undefined) {\n const tree = this.commits[versionRequested.id];\n if (tree === undefined) {\n throw new Error(`Can't find version ${versionRequested.id}`);\n }\n\n this.trees[versionRequested.id] = snapshotTree = buildSnapshotTree(tree.entries, this.blobs);\n }\n return snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const blob = this.blobs.get(blobId);\n if (blob !== undefined) {\n return blob;\n }\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class SnapshotStorage extends ReadDocumentStorageServiceBase {\n protected docId?: string;\n\n constructor(\n protected readonly storage: IDocumentStorageService,\n protected readonly docTree: ISnapshotTree | null) {\n super();\n assert(!!this.docTree, 0x0b0 /* \"Missing document snapshot tree!\" */);\n }\n\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n if (this.docId === undefined || this.docId === versionId) {\n this.docId = versionId;\n return [{ id: \"latest\", treeId: \"\" }];\n }\n return this.storage.getVersions(versionId, count);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (versionRequested && versionRequested.id !== \"latest\") {\n return this.storage.getSnapshotTree(versionRequested);\n }\n\n return this.docTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.storage.readBlob(blobId);\n }\n}\n\nexport class OpStorage extends ReadDocumentStorageServiceBase {\n public async getVersions(versionId: string, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n throw new Error(\"no snapshot tree should be asked when playing ops\");\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class StaticStorageDocumentService implements IDocumentService {\n constructor(private readonly storage: IDocumentStorageService) { }\n\n public dispose() {}\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public get resolvedUrl(): IResolvedUrl {\n throw new Error(\"Not implemented\");\n }\n\n public async connectToStorage(): Promise<IDocumentStorageService> {\n return this.storage;\n }\n\n public async connectToDeltaStorage(): Promise<IDocumentDeltaStorageService> {\n return new EmptyDeltaStorageService();\n }\n\n public async connectToDeltaStream(client: IClient): Promise<IDocumentDeltaConnection> {\n // We have no delta stream, so make it not return forever...\n return new Promise(() => { });\n }\n}\n\nexport class StaticStorageDocumentServiceFactory implements IDocumentServiceFactory {\n public readonly protocolName = \"fluid-static-storage:\";\n public constructor(protected readonly storage: IDocumentStorageService) { }\n\n public async createDocumentService(fileURL: IResolvedUrl): Promise<IDocumentService> {\n return new StaticStorageDocumentService(this.storage);\n }\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public async createContainer(\n createNewSummary: ISummaryTree,\n resolvedUrl: IResolvedUrl,\n logger: ITelemetryLogger,\n ): Promise<IDocumentService> {\n throw new Error(\"Not implemented\");\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storageImplementations.js","sourceRoot":"","sources":["../src/storageImplementations.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { assert } from \"@fluidframework/common-utils\";\nimport {\n IDocumentDeltaConnection,\n IDocumentDeltaStorageService,\n IDocumentService,\n IDocumentServiceFactory,\n IDocumentStorageService,\n IResolvedUrl,\n} from \"@fluidframework/driver-definitions\";\nimport { buildSnapshotTree } from \"@fluidframework/driver-utils\";\nimport {\n IClient,\n ISnapshotTree,\n ITree,\n IVersion,\n ISummaryTree,\n} from \"@fluidframework/protocol-definitions\";\nimport { ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { EmptyDeltaStorageService } from \"./emptyDeltaStorageService\";\nimport { ReadDocumentStorageServiceBase } from \"./replayController\";\n\n/**\n * Structure of snapshot on disk, when we store snapshot as single file\n */\nexport interface IFileSnapshot {\n tree: ITree;\n commits: { [key: string]: ITree };\n}\n\nexport class FileSnapshotReader extends ReadDocumentStorageServiceBase implements IDocumentStorageService {\n // IVersion.treeId used to communicate between getVersions() & getSnapshotTree() calls to indicate IVersion is ours.\n protected static readonly FileStorageVersionTreeId = \"FileStorageTreeId\";\n\n protected docId?: string;\n protected docTree: ISnapshotTree;\n protected blobs: Map<string, ArrayBufferLike>;\n protected readonly commits: { [key: string]: ITree } = {};\n protected readonly trees: { [key: string]: ISnapshotTree } = {};\n\n public constructor(json: IFileSnapshot) {\n super();\n this.commits = json.commits;\n\n this.blobs = new Map<string, ArrayBufferLike>();\n this.docTree = buildSnapshotTree(json.tree.entries, this.blobs);\n }\n\n public async getVersions(\n versionId: string | null,\n count: number): Promise<IVersion[]> {\n\n if (this.docId === undefined || this.docId === versionId || versionId === null) {\n if (versionId !== null){\n this.docId = versionId;\n }\n return [{ id: \"latest\", treeId: \"\" }];\n }\n\n if (this.commits[versionId] !== undefined) {\n return [{ id: versionId, treeId: FileSnapshotReader.FileStorageVersionTreeId }];\n }\n throw new Error(`Unknown version ID: ${versionId}`);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (!versionRequested || versionRequested.id === \"latest\") {\n return this.docTree;\n }\n if (versionRequested.treeId !== FileSnapshotReader.FileStorageVersionTreeId) {\n throw new Error(`Unknown version id: ${versionRequested}`);\n }\n\n let snapshotTree = this.trees[versionRequested.id];\n if (snapshotTree === undefined) {\n const tree = this.commits[versionRequested.id];\n if (tree === undefined) {\n throw new Error(`Can't find version ${versionRequested.id}`);\n }\n\n this.trees[versionRequested.id] = snapshotTree = buildSnapshotTree(tree.entries, this.blobs);\n }\n return snapshotTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n const blob = this.blobs.get(blobId);\n if (blob !== undefined) {\n return blob;\n }\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class SnapshotStorage extends ReadDocumentStorageServiceBase {\n protected docId?: string;\n\n constructor(\n protected readonly storage: IDocumentStorageService,\n protected readonly docTree: ISnapshotTree | null) {\n super();\n assert(!!this.docTree, 0x0b0 /* \"Missing document snapshot tree!\" */);\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n if (this.docId === undefined || this.docId === versionId || versionId === null) {\n if (versionId !== null){\n this.docId = versionId;\n }\n return [{ id: \"latest\", treeId: \"\" }];\n }\n return this.storage.getVersions(versionId, count);\n }\n\n public async getSnapshotTree(versionRequested?: IVersion): Promise<ISnapshotTree | null> {\n if (versionRequested && versionRequested.id !== \"latest\") {\n return this.storage.getSnapshotTree(versionRequested);\n }\n\n return this.docTree;\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n return this.storage.readBlob(blobId);\n }\n}\n\nexport class OpStorage extends ReadDocumentStorageServiceBase {\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n return [];\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n throw new Error(\"no snapshot tree should be asked when playing ops\");\n }\n\n public async readBlob(blobId: string): Promise<ArrayBufferLike> {\n throw new Error(`Unknown blob ID: ${blobId}`);\n }\n}\n\nexport class StaticStorageDocumentService implements IDocumentService {\n constructor(private readonly storage: IDocumentStorageService) { }\n\n public dispose() {}\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public get resolvedUrl(): IResolvedUrl {\n throw new Error(\"Not implemented\");\n }\n\n public async connectToStorage(): Promise<IDocumentStorageService> {\n return this.storage;\n }\n\n public async connectToDeltaStorage(): Promise<IDocumentDeltaStorageService> {\n return new EmptyDeltaStorageService();\n }\n\n public async connectToDeltaStream(client: IClient): Promise<IDocumentDeltaConnection> {\n // We have no delta stream, so make it not return forever...\n return new Promise(() => { });\n }\n}\n\nexport class StaticStorageDocumentServiceFactory implements IDocumentServiceFactory {\n public readonly protocolName = \"fluid-static-storage:\";\n public constructor(protected readonly storage: IDocumentStorageService) { }\n\n public async createDocumentService(fileURL: IResolvedUrl): Promise<IDocumentService> {\n return new StaticStorageDocumentService(this.storage);\n }\n\n // TODO: Issue-2109 Implement detach container api or put appropriate comment.\n public async createContainer(\n createNewSummary: ISummaryTree,\n resolvedUrl: IResolvedUrl,\n logger: ITelemetryLogger,\n ): Promise<IDocumentService> {\n throw new Error(\"Not implemented\");\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/replay-driver",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.56.2",
|
|
4
4
|
"description": "Document replay version of Socket.IO implementation",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": "https://github.com/microsoft/FluidFramework",
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
33
33
|
"@fluidframework/common-utils": "^0.32.1",
|
|
34
|
-
"@fluidframework/driver-definitions": "^0.
|
|
35
|
-
"@fluidframework/driver-utils": "^0.
|
|
34
|
+
"@fluidframework/driver-definitions": "^0.44.0",
|
|
35
|
+
"@fluidframework/driver-utils": "^0.56.2",
|
|
36
36
|
"@fluidframework/protocol-definitions": "^0.1026.0",
|
|
37
|
-
"@fluidframework/telemetry-utils": "^0.
|
|
37
|
+
"@fluidframework/telemetry-utils": "^0.56.2"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@fluidframework/build-common": "^0.23.0",
|
package/src/packageVersion.ts
CHANGED
package/src/replayController.ts
CHANGED
|
@@ -14,7 +14,7 @@ import * as api from "@fluidframework/protocol-definitions";
|
|
|
14
14
|
* Partial implementation of IDocumentStorageService
|
|
15
15
|
*/
|
|
16
16
|
export abstract class ReadDocumentStorageServiceBase implements IDocumentStorageService {
|
|
17
|
-
public abstract getVersions(versionId: string, count: number): Promise<api.IVersion[]>;
|
|
17
|
+
public abstract getVersions(versionId: string | null, count: number): Promise<api.IVersion[]>;
|
|
18
18
|
public abstract getSnapshotTree(version?: api.IVersion): Promise<api.ISnapshotTree | null>;
|
|
19
19
|
public abstract readBlob(blobId: string): Promise<ArrayBufferLike>;
|
|
20
20
|
|
|
@@ -57,7 +57,7 @@ export class ReplayControllerStatic extends ReplayController {
|
|
|
57
57
|
return true;
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
public async getVersions(versionId: string, count: number): Promise<IVersion[]> {
|
|
60
|
+
public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
|
|
61
61
|
return [];
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -51,10 +51,13 @@ export class FileSnapshotReader extends ReadDocumentStorageServiceBase implement
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
public async getVersions(
|
|
54
|
-
versionId: string,
|
|
54
|
+
versionId: string | null,
|
|
55
55
|
count: number): Promise<IVersion[]> {
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
|
|
57
|
+
if (this.docId === undefined || this.docId === versionId || versionId === null) {
|
|
58
|
+
if (versionId !== null){
|
|
59
|
+
this.docId = versionId;
|
|
60
|
+
}
|
|
58
61
|
return [{ id: "latest", treeId: "" }];
|
|
59
62
|
}
|
|
60
63
|
|
|
@@ -103,9 +106,11 @@ export class SnapshotStorage extends ReadDocumentStorageServiceBase {
|
|
|
103
106
|
assert(!!this.docTree, 0x0b0 /* "Missing document snapshot tree!" */);
|
|
104
107
|
}
|
|
105
108
|
|
|
106
|
-
public async getVersions(versionId: string, count: number): Promise<IVersion[]> {
|
|
107
|
-
if (this.docId === undefined || this.docId === versionId) {
|
|
108
|
-
|
|
109
|
+
public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
|
|
110
|
+
if (this.docId === undefined || this.docId === versionId || versionId === null) {
|
|
111
|
+
if (versionId !== null){
|
|
112
|
+
this.docId = versionId;
|
|
113
|
+
}
|
|
109
114
|
return [{ id: "latest", treeId: "" }];
|
|
110
115
|
}
|
|
111
116
|
return this.storage.getVersions(versionId, count);
|
|
@@ -125,7 +130,7 @@ export class SnapshotStorage extends ReadDocumentStorageServiceBase {
|
|
|
125
130
|
}
|
|
126
131
|
|
|
127
132
|
export class OpStorage extends ReadDocumentStorageServiceBase {
|
|
128
|
-
public async getVersions(versionId: string, count: number): Promise<IVersion[]> {
|
|
133
|
+
public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {
|
|
129
134
|
return [];
|
|
130
135
|
}
|
|
131
136
|
|