@fluidframework/odsp-driver 0.58.1001 → 0.58.2001
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/createFile.d.ts.map +1 -1
- package/dist/createFile.js +6 -2
- package/dist/createFile.js.map +1 -1
- package/dist/fetchSnapshot.js +1 -1
- package/dist/fetchSnapshot.js.map +1 -1
- package/dist/getFileLink.d.ts.map +1 -1
- package/dist/getFileLink.js +8 -5
- package/dist/getFileLink.js.map +1 -1
- package/dist/getSocketIo.d.ts +2 -2
- package/dist/getSocketIo.d.ts.map +1 -1
- package/dist/getSocketIo.js.map +1 -1
- package/dist/odspCache.d.ts +4 -1
- package/dist/odspCache.d.ts.map +1 -1
- package/dist/odspCache.js +25 -36
- package/dist/odspCache.js.map +1 -1
- package/dist/odspDocumentDeltaConnection.d.ts +2 -2
- package/dist/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/dist/odspDocumentDeltaConnection.js.map +1 -1
- package/dist/odspDocumentService.d.ts +7 -6
- package/dist/odspDocumentService.d.ts.map +1 -1
- package/dist/odspDocumentService.js +24 -15
- package/dist/odspDocumentService.js.map +1 -1
- package/dist/odspDocumentServiceFactoryCore.d.ts +2 -2
- package/dist/odspDocumentServiceFactoryCore.d.ts.map +1 -1
- package/dist/odspDocumentServiceFactoryCore.js +13 -3
- package/dist/odspDocumentServiceFactoryCore.js.map +1 -1
- package/dist/odspDriverUrlResolver.js.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.d.ts +0 -1
- package/dist/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/dist/odspDriverUrlResolverForShareLink.js +1 -16
- package/dist/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/dist/odspError.d.ts.map +1 -1
- package/dist/odspError.js +1 -0
- package/dist/odspError.js.map +1 -1
- package/dist/odspUtils.d.ts +2 -2
- package/dist/odspUtils.d.ts.map +1 -1
- package/dist/odspUtils.js +20 -8
- package/dist/odspUtils.js.map +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/packageVersion.js.map +1 -1
- package/dist/prefetchLatestSnapshot.d.ts.map +1 -1
- package/dist/prefetchLatestSnapshot.js +6 -1
- package/dist/prefetchLatestSnapshot.js.map +1 -1
- package/dist/retryErrorsStorageAdapter.d.ts.map +1 -1
- package/dist/retryErrorsStorageAdapter.js +1 -0
- package/dist/retryErrorsStorageAdapter.js.map +1 -1
- package/dist/vroom.d.ts.map +1 -1
- package/dist/vroom.js +3 -2
- package/dist/vroom.js.map +1 -1
- package/lib/createFile.d.ts.map +1 -1
- package/lib/createFile.js +6 -2
- package/lib/createFile.js.map +1 -1
- package/lib/fetchSnapshot.js +1 -1
- package/lib/fetchSnapshot.js.map +1 -1
- package/lib/getFileLink.d.ts.map +1 -1
- package/lib/getFileLink.js +9 -6
- package/lib/getFileLink.js.map +1 -1
- package/lib/getSocketIo.d.ts +2 -2
- package/lib/getSocketIo.d.ts.map +1 -1
- package/lib/getSocketIo.js.map +1 -1
- package/lib/odspCache.d.ts +4 -1
- package/lib/odspCache.d.ts.map +1 -1
- package/lib/odspCache.js +23 -34
- package/lib/odspCache.js.map +1 -1
- package/lib/odspDocumentDeltaConnection.d.ts +2 -2
- package/lib/odspDocumentDeltaConnection.d.ts.map +1 -1
- package/lib/odspDocumentDeltaConnection.js.map +1 -1
- package/lib/odspDocumentService.d.ts +7 -6
- package/lib/odspDocumentService.d.ts.map +1 -1
- package/lib/odspDocumentService.js +25 -16
- package/lib/odspDocumentService.js.map +1 -1
- package/lib/odspDocumentServiceFactoryCore.d.ts +2 -2
- package/lib/odspDocumentServiceFactoryCore.d.ts.map +1 -1
- package/lib/odspDocumentServiceFactoryCore.js +13 -3
- package/lib/odspDocumentServiceFactoryCore.js.map +1 -1
- package/lib/odspDriverUrlResolver.js.map +1 -1
- package/lib/odspDriverUrlResolverForShareLink.d.ts +0 -1
- package/lib/odspDriverUrlResolverForShareLink.d.ts.map +1 -1
- package/lib/odspDriverUrlResolverForShareLink.js +1 -16
- package/lib/odspDriverUrlResolverForShareLink.js.map +1 -1
- package/lib/odspError.d.ts.map +1 -1
- package/lib/odspError.js +1 -0
- package/lib/odspError.js.map +1 -1
- package/lib/odspUtils.d.ts +2 -2
- package/lib/odspUtils.d.ts.map +1 -1
- package/lib/odspUtils.js +20 -8
- package/lib/odspUtils.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/prefetchLatestSnapshot.d.ts.map +1 -1
- package/lib/prefetchLatestSnapshot.js +6 -1
- package/lib/prefetchLatestSnapshot.js.map +1 -1
- package/lib/retryErrorsStorageAdapter.d.ts.map +1 -1
- package/lib/retryErrorsStorageAdapter.js +1 -0
- package/lib/retryErrorsStorageAdapter.js.map +1 -1
- package/lib/vroom.d.ts.map +1 -1
- package/lib/vroom.js +3 -2
- package/lib/vroom.js.map +1 -1
- package/package.json +13 -10
- package/src/createFile.ts +2 -0
- package/src/fetchSnapshot.ts +1 -1
- package/src/getFileLink.ts +23 -6
- package/src/getSocketIo.ts +1 -1
- package/src/odspCache.ts +43 -57
- package/src/odspDocumentDeltaConnection.ts +6 -5
- package/src/odspDocumentService.ts +52 -25
- package/src/odspDocumentServiceFactoryCore.ts +16 -4
- package/src/odspDriverUrlResolver.ts +4 -4
- package/src/odspDriverUrlResolverForShareLink.ts +5 -31
- package/src/odspError.ts +1 -0
- package/src/odspUtils.ts +9 -4
- package/src/packageVersion.ts +1 -1
- package/src/prefetchLatestSnapshot.ts +7 -1
- package/src/retryErrorsStorageAdapter.ts +1 -0
- package/src/vroom.ts +10 -3
|
@@ -24,7 +24,12 @@ import { downloadSnapshot, fetchSnapshotWithRedeem } from "./fetchSnapshot";
|
|
|
24
24
|
export async function prefetchLatestSnapshot(resolvedUrl, getStorageToken, persistedCache, forceAccessTokenViaAuthorizationHeader, logger, hostSnapshotFetchOptions, enableRedeemFallback, fetchBinarySnapshotFormat) {
|
|
25
25
|
const odspLogger = createOdspLogger(ChildLogger.create(logger, "PrefetchSnapshot"));
|
|
26
26
|
const odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);
|
|
27
|
-
const
|
|
27
|
+
const resolvedUrlData = {
|
|
28
|
+
siteUrl: odspResolvedUrl.siteUrl,
|
|
29
|
+
driveId: odspResolvedUrl.driveId,
|
|
30
|
+
itemId: odspResolvedUrl.itemId,
|
|
31
|
+
};
|
|
32
|
+
const storageTokenFetcher = toInstrumentedOdspTokenFetcher(odspLogger, resolvedUrlData, getStorageToken, true /* throwOnNullToken */);
|
|
28
33
|
const snapshotDownloader = async (finalOdspResolvedUrl, storageToken, snapshotOptions, controller) => {
|
|
29
34
|
return downloadSnapshot(finalOdspResolvedUrl, storageToken, odspLogger, snapshotOptions, fetchBinarySnapshotFormat, controller);
|
|
30
35
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefetchLatestSnapshot.js","sourceRoot":"","sources":["../src/prefetchLatestSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"prefetchLatestSnapshot.js","sourceRoot":"","sources":["../src/prefetchLatestSnapshot.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAUtD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACH,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,8BAA8B,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAG5E;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,WAAyB,EACzB,eAA4D,EAC5D,cAA+B,EAC/B,sCAA+C,EAC/C,MAA4B,EAC5B,wBAAsD,EACtD,oBAA8B,EAC9B,yBAAmC;IAEnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACpF,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAExD,MAAM,eAAe,GAAkB;QACnC,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,MAAM,EAAE,eAAe,CAAC,MAAM;KACjC,CAAC;IACF,MAAM,mBAAmB,GAAG,8BAA8B,CACtD,UAAU,EACV,eAAe,EACf,eAAe,EACf,IAAI,CAAC,sBAAsB,CAC9B,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,EAC5B,oBAAsC,EACtC,YAAoB,EACpB,eAA6C,EAC7C,UAA4B,EAC9B,EAAE;QACA,OAAO,gBAAgB,CACnB,oBAAoB,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,yBAAyB,EAAE,UAAU,CAAC,CAAC;IAChH,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,sBAAsB,CAAC,eAAe,CAAC,CAAC;IAC5D,IAAI,MAAiC,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,EAAE,cAAwC,EAAE,EAAE;QAClE,MAAM,GAAG,cAAc,CAAC,GAAG,CACvB,WAAW,EACX,cAAc,CACjB,CAAC;QACF,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACjF,OAAO,gBAAgB,CAAC,cAAc,CAClC,UAAU,EACV,EAAE,SAAS,EAAE,wBAAwB,EAAE,EACvC,KAAK,IAAI,EAAE;QACP,MAAM,uBAAuB,CACrB,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,sCAAsC,EACtC,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,oBAAoB,CACvB,CAAC;QACN,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACvE,MAAM,MAAM,CAAC;QACb,OAAO,IAAI,CAAC;IACpB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { default as AbortController } from \"abort-controller\";\nimport { ITelemetryBaseLogger } from \"@fluidframework/common-definitions\";\nimport { assert } from \"@fluidframework/common-utils\";\nimport { IResolvedUrl } from \"@fluidframework/driver-definitions\";\nimport {\n IOdspResolvedUrl,\n IPersistedCache,\n ISnapshotOptions,\n OdspResourceTokenFetchOptions,\n TokenFetcher,\n IOdspUrlParts,\n} from \"@fluidframework/odsp-driver-definitions\";\nimport { ChildLogger, PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport {\n createCacheSnapshotKey,\n createOdspLogger,\n getOdspResolvedUrl,\n toInstrumentedOdspTokenFetcher,\n} from \"./odspUtils\";\nimport { downloadSnapshot, fetchSnapshotWithRedeem } from \"./fetchSnapshot\";\nimport { IVersionedValueWithEpoch } from \"./contracts\";\n\n/**\n * Function to prefetch the snapshot and cached it in the persistant cache, so that when the container is loaded\n * the cached latest snapshot could be used and removes the network call from the critical path.\n * @param resolvedUrl - Resolved url to fetch the snapshot.\n * @param getStorageToken - function that can provide the storage token for a given site. This is\n * is also referred to as the \"VROOM\" token in SPO.\n * @param persistedCache - Cache to store the fetched snapshot.\n * @param forceAccessTokenViaAuthorizationHeader - whether to force passing given token via authorization header.\n * @param logger - Logger to have telemetry events.\n * @param hostSnapshotFetchOptions - Options to fetch the snapshot if any. Otherwise default will be used.\n * @param enableRedeemFallback - True to have the sharing link redeem fallback in case the Trees Latest/Redeem\n * 1RT call fails with redeem error. During fallback it will first redeem the sharing link and then make\n * the Trees latest call.\n * @returns - True if the snapshot is cached, false otherwise.\n */\nexport async function prefetchLatestSnapshot(\n resolvedUrl: IResolvedUrl,\n getStorageToken: TokenFetcher<OdspResourceTokenFetchOptions>,\n persistedCache: IPersistedCache,\n forceAccessTokenViaAuthorizationHeader: boolean,\n logger: ITelemetryBaseLogger,\n hostSnapshotFetchOptions: ISnapshotOptions | undefined,\n enableRedeemFallback?: boolean,\n fetchBinarySnapshotFormat?: boolean,\n): Promise<boolean> {\n const odspLogger = createOdspLogger(ChildLogger.create(logger, \"PrefetchSnapshot\"));\n const odspResolvedUrl = getOdspResolvedUrl(resolvedUrl);\n\n const resolvedUrlData: IOdspUrlParts = {\n siteUrl: odspResolvedUrl.siteUrl,\n driveId: odspResolvedUrl.driveId,\n itemId: odspResolvedUrl.itemId,\n };\n const storageTokenFetcher = toInstrumentedOdspTokenFetcher(\n odspLogger,\n resolvedUrlData,\n getStorageToken,\n true /* throwOnNullToken */,\n );\n\n const snapshotDownloader = async (\n finalOdspResolvedUrl: IOdspResolvedUrl,\n storageToken: string,\n snapshotOptions: ISnapshotOptions | undefined,\n controller?: AbortController,\n ) => {\n return downloadSnapshot(\n finalOdspResolvedUrl, storageToken, odspLogger, snapshotOptions, fetchBinarySnapshotFormat, controller);\n };\n const snapshotKey = createCacheSnapshotKey(odspResolvedUrl);\n let cacheP: Promise<void> | undefined;\n const putInCache = async (valueWithEpoch: IVersionedValueWithEpoch) => {\n cacheP = persistedCache.put(\n snapshotKey,\n valueWithEpoch,\n );\n return cacheP;\n };\n const removeEntries = async () => persistedCache.removeEntries(snapshotKey.file);\n return PerformanceEvent.timedExecAsync(\n odspLogger,\n { eventName: \"PrefetchLatestSnapshot\" },\n async () => {\n await fetchSnapshotWithRedeem(\n odspResolvedUrl,\n storageTokenFetcher,\n hostSnapshotFetchOptions,\n forceAccessTokenViaAuthorizationHeader,\n odspLogger,\n snapshotDownloader,\n putInCache,\n removeEntries,\n enableRedeemFallback,\n );\n assert(cacheP !== undefined, 0x1e7 /* \"caching was not performed!\" */);\n await cacheP;\n return true;\n }).catch(async (error) => false);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryErrorsStorageAdapter.d.ts","sourceRoot":"","sources":["../src/retryErrorsStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,uBAAuB,EACvB,+BAA+B,EAC/B,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,KAAK,EACL,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGnF,qBAAa,yBAA0B,YAAW,uBAAuB,EAAE,WAAW;IAG9E,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH3B,OAAO,CAAC,SAAS,CAAS;gBAEL,sBAAsB,EAAE,uBAAuB,EAC/C,MAAM,EAAE,gBAAgB;IAI7C,IAAW,QAAQ,IAAI,+BAA+B,GAAG,SAAS,CAEjE;IACD,IAAW,QAAQ,YAA2B;IACvC,OAAO;IAId,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEY,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAOlE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAO9C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAOzE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOtF,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1F,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAO9D,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO5E,OAAO,CAAC,oBAAoB;
|
|
1
|
+
{"version":3,"file":"retryErrorsStorageAdapter.d.ts","sourceRoot":"","sources":["../src/retryErrorsStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACH,uBAAuB,EACvB,+BAA+B,EAC/B,eAAe,EAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,KAAK,EACL,QAAQ,EACX,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAGnF,qBAAa,yBAA0B,YAAW,uBAAuB,EAAE,WAAW;IAG9E,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAH3B,OAAO,CAAC,SAAS,CAAS;gBAEL,sBAAsB,EAAE,uBAAuB,EAC/C,MAAM,EAAE,gBAAgB;IAI7C,IAAW,QAAQ,IAAI,+BAA+B,GAAG,SAAS,CAEjE;IACD,IAAW,QAAQ,YAA2B;IACvC,OAAO;IAId,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEY,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAOlE,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAO9C,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAOzE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOtF,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAQ1F,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IAO9D,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO5E,OAAO,CAAC,oBAAoB;YAOd,YAAY;CAQ7B"}
|
|
@@ -44,6 +44,7 @@ export class RetryErrorsStorageAdapter {
|
|
|
44
44
|
}
|
|
45
45
|
checkStorageDisposed() {
|
|
46
46
|
if (this._disposed) {
|
|
47
|
+
// pre-0.58 error message: storageServiceDisposedCannotRetry
|
|
47
48
|
throw new LoggingError("Storage Service is disposed. Cannot retry", { canRetry: false });
|
|
48
49
|
}
|
|
49
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryErrorsStorageAdapter.js","sourceRoot":"","sources":["../src/retryErrorsStorageAdapter.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 { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport {\n IDocumentStorageService,\n IDocumentStorageServicePolicies,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n ITree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDisposable, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { runWithRetry } from \"./retryUtils\";\n\nexport class RetryErrorsStorageAdapter implements IDocumentStorageService, IDisposable {\n private _disposed = false;\n constructor(\n private readonly internalStorageService: IDocumentStorageService,\n private readonly logger: ITelemetryLogger,\n ) {\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n return this.internalStorageService.policies;\n }\n public get disposed() {return this._disposed;}\n public dispose() {\n this._disposed = true;\n }\n\n public get repositoryUrl(): string {\n return this.internalStorageService.repositoryUrl;\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n return this.runWithRetry(\n async () => this.internalStorageService.getSnapshotTree(version),\n \"storage_getSnapshotTree\",\n );\n }\n\n public async readBlob(id: string): Promise<ArrayBufferLike> {\n return this.runWithRetry(\n async () => this.internalStorageService.readBlob(id),\n \"storage_readBlob\",\n );\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n return this.runWithRetry(\n async () => this.internalStorageService.getVersions(versionId, count),\n \"storage_getVersions\",\n );\n }\n\n public async write(tree: ITree, parents: string[], message: string, ref: string): Promise<IVersion> {\n return this.runWithRetry(\n async () => this.internalStorageService.write(tree, parents, message, ref),\n \"storage_write\",\n );\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n // Creation flow with attachment blobs - need to do retries!\n return this.runWithRetry(\n async () => this.internalStorageService.uploadSummaryWithContext(summary, context),\n \"storage_uploadSummaryWithContext\",\n );\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n return this.runWithRetry(\n async () => this.internalStorageService.downloadSummary(handle),\n \"storage_downloadSummary\",\n );\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.runWithRetry(\n async () => this.internalStorageService.createBlob(file),\n \"storage_createBlob\",\n );\n }\n\n private checkStorageDisposed() {\n if (this._disposed) {\n throw new LoggingError(\"Storage Service is disposed. Cannot retry\", { canRetry: false });\n }\n }\n\n private async runWithRetry<T>(api: () => Promise<T>, callName: string): Promise<T> {\n return runWithRetry(\n api,\n callName,\n this.logger,\n () => this.checkStorageDisposed(),\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"retryErrorsStorageAdapter.js","sourceRoot":"","sources":["../src/retryErrorsStorageAdapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAe/D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,OAAO,yBAAyB;IAElC,YACqB,sBAA+C,EAC/C,MAAwB;QADxB,2BAAsB,GAAtB,sBAAsB,CAAyB;QAC/C,WAAM,GAAN,MAAM,CAAkB;QAHrC,cAAS,GAAG,KAAK,CAAC;IAK1B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;IAChD,CAAC;IACD,IAAW,QAAQ,KAAI,OAAO,IAAI,CAAC,SAAS,CAAC,CAAA,CAAC;IACvC,OAAO;QACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,OAAkB;QAC3C,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,OAAO,CAAC,EAChE,yBAAyB,CAC5B,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,EAAU;QAC5B,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,EACpD,kBAAkB,CACrB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,SAAwB,EAAE,KAAa;QAC5D,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,EACrE,qBAAqB,CACxB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAW,EAAE,OAAiB,EAAE,OAAe,EAAE,GAAW;QAC3E,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAC1E,eAAe,CAClB,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,wBAAwB,CAAC,OAAqB,EAAE,OAAwB;QACjF,4DAA4D;QAC5D,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,EAClF,kCAAkC,CACrC,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAAsB;QAC/C,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC,MAAM,CAAC,EAC/D,yBAAyB,CAC5B,CAAC;IACN,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,IAAqB;QACzC,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,EACxD,oBAAoB,CACvB,CAAC;IACN,CAAC;IAEO,oBAAoB;QACxB,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,4DAA4D;YAC5D,MAAM,IAAI,YAAY,CAAC,2CAA2C,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;SAC5F;IACL,CAAC;IAEO,KAAK,CAAC,YAAY,CAAI,GAAqB,EAAE,QAAgB;QACjE,OAAO,YAAY,CACf,GAAG,EACH,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,CACpC,CAAC;IACN,CAAC;CACJ","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { LoggingError } from \"@fluidframework/telemetry-utils\";\nimport {\n IDocumentStorageService,\n IDocumentStorageServicePolicies,\n ISummaryContext,\n} from \"@fluidframework/driver-definitions\";\nimport {\n ICreateBlobResponse,\n ISnapshotTree,\n ISummaryHandle,\n ISummaryTree,\n ITree,\n IVersion,\n} from \"@fluidframework/protocol-definitions\";\nimport { IDisposable, ITelemetryLogger } from \"@fluidframework/common-definitions\";\nimport { runWithRetry } from \"./retryUtils\";\n\nexport class RetryErrorsStorageAdapter implements IDocumentStorageService, IDisposable {\n private _disposed = false;\n constructor(\n private readonly internalStorageService: IDocumentStorageService,\n private readonly logger: ITelemetryLogger,\n ) {\n }\n\n public get policies(): IDocumentStorageServicePolicies | undefined {\n return this.internalStorageService.policies;\n }\n public get disposed() {return this._disposed;}\n public dispose() {\n this._disposed = true;\n }\n\n public get repositoryUrl(): string {\n return this.internalStorageService.repositoryUrl;\n }\n\n public async getSnapshotTree(version?: IVersion): Promise<ISnapshotTree | null> {\n return this.runWithRetry(\n async () => this.internalStorageService.getSnapshotTree(version),\n \"storage_getSnapshotTree\",\n );\n }\n\n public async readBlob(id: string): Promise<ArrayBufferLike> {\n return this.runWithRetry(\n async () => this.internalStorageService.readBlob(id),\n \"storage_readBlob\",\n );\n }\n\n public async getVersions(versionId: string | null, count: number): Promise<IVersion[]> {\n return this.runWithRetry(\n async () => this.internalStorageService.getVersions(versionId, count),\n \"storage_getVersions\",\n );\n }\n\n public async write(tree: ITree, parents: string[], message: string, ref: string): Promise<IVersion> {\n return this.runWithRetry(\n async () => this.internalStorageService.write(tree, parents, message, ref),\n \"storage_write\",\n );\n }\n\n public async uploadSummaryWithContext(summary: ISummaryTree, context: ISummaryContext): Promise<string> {\n // Creation flow with attachment blobs - need to do retries!\n return this.runWithRetry(\n async () => this.internalStorageService.uploadSummaryWithContext(summary, context),\n \"storage_uploadSummaryWithContext\",\n );\n }\n\n public async downloadSummary(handle: ISummaryHandle): Promise<ISummaryTree> {\n return this.runWithRetry(\n async () => this.internalStorageService.downloadSummary(handle),\n \"storage_downloadSummary\",\n );\n }\n\n public async createBlob(file: ArrayBufferLike): Promise<ICreateBlobResponse> {\n return this.runWithRetry(\n async () => this.internalStorageService.createBlob(file),\n \"storage_createBlob\",\n );\n }\n\n private checkStorageDisposed() {\n if (this._disposed) {\n // pre-0.58 error message: storageServiceDisposedCannotRetry\n throw new LoggingError(\"Storage Service is disposed. Cannot retry\", { canRetry: false });\n }\n }\n\n private async runWithRetry<T>(api: () => Promise<T>, callName: string): Promise<T> {\n return runWithRetry(\n api,\n callName,\n this.logger,\n () => this.checkStorageDisposed(),\n );\n }\n}\n"]}
|
package/lib/vroom.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vroom.d.ts","sourceRoot":"","sources":["../src/vroom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"vroom.d.ts","sourceRoot":"","sources":["../src/vroom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAwB,MAAM,oCAAoC,CAAC;AAE5F,OAAO,EAAE,+BAA+B,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACzG,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAa,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CAClC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,eAAe,EAAE,+BAA+B,EAChD,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,OAAO,EAC3B,OAAO,EAAE,mBAAmB,EAC5B,yBAAyB,EAAE,OAAO,GAAG,SAAS,EAC9C,gBAAgB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,uBAAuB,CAAC,CA2ElC"}
|
package/lib/vroom.js
CHANGED
|
@@ -24,10 +24,11 @@ import { runWithRetry } from "./retryUtils";
|
|
|
24
24
|
*/
|
|
25
25
|
export async function fetchJoinSession(urlParts, path, method, logger, getStorageToken, epochTracker, requestSocketToken, options, disableJoinSessionRefresh, guestDisplayName) {
|
|
26
26
|
const token = await getStorageToken(options, "JoinSession");
|
|
27
|
-
const
|
|
27
|
+
const tokenRefreshProps = options.refresh
|
|
28
28
|
? { hasClaims: !!options.claims, hasTenantId: !!options.tenantId }
|
|
29
29
|
: {};
|
|
30
|
-
|
|
30
|
+
const details = Object.assign({ refreshedToken: options.refresh, requestSocketToken }, tokenRefreshProps);
|
|
31
|
+
return PerformanceEvent.timedExecAsync(logger, Object.assign({ eventName: "JoinSession", attempts: options.refresh ? 2 : 1, details: JSON.stringify(details) }, tokenRefreshProps), async (event) => {
|
|
31
32
|
const siteOrigin = getOrigin(urlParts.siteUrl);
|
|
32
33
|
const formBoundary = uuid();
|
|
33
34
|
let postBody = `--${formBoundary}\r\n`;
|
package/lib/vroom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vroom.js","sourceRoot":"","sources":["../src/vroom.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAuB,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAO5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,QAAuB,EACvB,IAAY,EACZ,MAAc,EACd,MAAwB,EACxB,eAAgD,EAChD,YAA0B,EAC1B,kBAA2B,EAC3B,OAA4B,EAC5B,yBAA8C,EAC9C,gBAAyB;IAEzB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAE5D,MAAM,
|
|
1
|
+
{"version":3,"file":"vroom.js","sourceRoot":"","sources":["../src/vroom.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 { v4 as uuid } from \"uuid\";\nimport { ITelemetryLogger, ITelemetryProperties } from \"@fluidframework/common-definitions\";\nimport { PerformanceEvent } from \"@fluidframework/telemetry-utils\";\nimport { InstrumentedStorageTokenFetcher, IOdspUrlParts } from \"@fluidframework/odsp-driver-definitions\";\nimport { ISocketStorageDiscovery } from \"./contracts\";\nimport { getOrigin, TokenFetchOptionsEx } from \"./odspUtils\";\nimport { getApiRoot } from \"./odspUrlHelper\";\nimport { EpochTracker } from \"./epochTracker\";\nimport { runWithRetry } from \"./retryUtils\";\n\ninterface IJoinSessionBody {\n requestSocketToken: boolean;\n guestDisplayName: string;\n}\n\n/**\n * Makes join session call on SPO to get information about the web socket for a document\n * @param urlParts - The SPO drive id, itemId, siteUrl that this request should be made against\n * @param path - The API path that is relevant to this request\n * @param method - The type of request, such as GET or POST\n * @param logger - A logger to use for this request\n * @param getStorageToken - A function that is able to provide the access token for this request\n * @param epochTracker - fetch wrapper which incorporates epoch logic around joinSession call\n * @param requestSocketToken - flag indicating whether joinSession is expected to return access token\n * which is used when establishing websocket connection with collab session backend service.\n * @param options - Options to fetch the token.\n * @param disableJoinSessionRefresh - Whether the caller wants to disable refreshing join session periodically.\n * @param guestDisplayName - display name used to identify guest user joining a session.\n * This is optional and used only when collab session is being joined via invite.\n */\nexport async function fetchJoinSession(\n urlParts: IOdspUrlParts,\n path: string,\n method: string,\n logger: ITelemetryLogger,\n getStorageToken: InstrumentedStorageTokenFetcher,\n epochTracker: EpochTracker,\n requestSocketToken: boolean,\n options: TokenFetchOptionsEx,\n disableJoinSessionRefresh: boolean | undefined,\n guestDisplayName?: string,\n): Promise<ISocketStorageDiscovery> {\n const token = await getStorageToken(options, \"JoinSession\");\n\n const tokenRefreshProps = options.refresh\n ? { hasClaims: !!options.claims, hasTenantId: !!options.tenantId }\n : {};\n const details: ITelemetryProperties = {\n refreshedToken: options.refresh,\n requestSocketToken,\n ...tokenRefreshProps,\n };\n\n return PerformanceEvent.timedExecAsync(\n logger, {\n eventName: \"JoinSession\",\n attempts: options.refresh ? 2 : 1,\n details: JSON.stringify(details),\n ...tokenRefreshProps,\n },\n async (event) => {\n const siteOrigin = getOrigin(urlParts.siteUrl);\n const formBoundary = uuid();\n let postBody = `--${formBoundary}\\r\\n`;\n postBody += `Authorization: Bearer ${token}\\r\\n`;\n postBody += `X-HTTP-Method-Override: POST\\r\\n`;\n postBody += `Content-Type: application/json\\r\\n`;\n if (!disableJoinSessionRefresh) {\n postBody += `prefer: FluidRemoveCheckAccess\\r\\n`;\n }\n postBody += `_post: 1\\r\\n`;\n // Name should be there when socket token is requested and vice-versa.\n if (requestSocketToken && guestDisplayName !== undefined) {\n const body: IJoinSessionBody = {\n requestSocketToken: true,\n guestDisplayName,\n };\n postBody += `\\r\\n${JSON.stringify(body)}\\r\\n`;\n }\n postBody += `\\r\\n--${formBoundary}--`;\n const headers: {[index: string]: string} = {\n \"Content-Type\": `multipart/form-data;boundary=${formBoundary}`,\n };\n\n const response = await runWithRetry(\n async () => epochTracker.fetchAndParseAsJSON<ISocketStorageDiscovery>(\n `${getApiRoot(siteOrigin)}/drives/${\n urlParts.driveId\n }/items/${urlParts.itemId}/${path}?ump=1`,\n { method, headers, body: postBody },\n \"joinSession\",\n true,\n ),\n \"joinSession\",\n logger,\n );\n\n const socketUrl = response.content.deltaStreamSocketUrl;\n // expecting socketUrl to be something like https://{hostName}/...\n const webSocketHostName = socketUrl.split(\"/\")[2];\n\n // TODO SPO-specific telemetry\n event.end({\n ...response.propsToLog,\n // pushV2 websocket urls will contain pushf\n pushv2: socketUrl.includes(\"pushf\"),\n webSocketHostName,\n refreshSessionDurationSeconds: response.content.refreshSessionDurationSeconds,\n });\n\n if (response.content.runtimeTenantId && !response.content.tenantId) {\n response.content.tenantId = response.content.runtimeTenantId;\n }\n\n return response.content;\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/odsp-driver",
|
|
3
|
-
"version": "0.58.
|
|
3
|
+
"version": "0.58.2001",
|
|
4
4
|
"description": "Socket storage implementation for SPO and ODC",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
|
-
"repository":
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/microsoft/FluidFramework.git",
|
|
9
|
+
"directory": "packages/drivers/odsp-driver"
|
|
10
|
+
},
|
|
7
11
|
"license": "MIT",
|
|
8
12
|
"author": "Microsoft and contributors",
|
|
9
13
|
"sideEffects": false,
|
|
@@ -58,15 +62,15 @@
|
|
|
58
62
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
59
63
|
"@fluidframework/common-utils": "^0.32.1",
|
|
60
64
|
"@fluidframework/core-interfaces": "^0.42.0",
|
|
61
|
-
"@fluidframework/driver-base": "^0.58.
|
|
65
|
+
"@fluidframework/driver-base": "^0.58.2001",
|
|
62
66
|
"@fluidframework/driver-definitions": "^0.45.1000",
|
|
63
|
-
"@fluidframework/driver-utils": "^0.58.
|
|
67
|
+
"@fluidframework/driver-utils": "^0.58.2001",
|
|
64
68
|
"@fluidframework/gitresources": "^0.1035.1000",
|
|
65
|
-
"@fluidframework/odsp-doclib-utils": "^0.58.
|
|
66
|
-
"@fluidframework/odsp-driver-definitions": "^0.58.
|
|
69
|
+
"@fluidframework/odsp-doclib-utils": "^0.58.2001",
|
|
70
|
+
"@fluidframework/odsp-driver-definitions": "^0.58.2001",
|
|
67
71
|
"@fluidframework/protocol-base": "^0.1035.1000",
|
|
68
72
|
"@fluidframework/protocol-definitions": "^0.1027.1000",
|
|
69
|
-
"@fluidframework/telemetry-utils": "^0.58.
|
|
73
|
+
"@fluidframework/telemetry-utils": "^0.58.2001",
|
|
70
74
|
"abort-controller": "^3.0.0",
|
|
71
75
|
"node-fetch": "^2.6.1",
|
|
72
76
|
"socket.io-client": "^4.4.1",
|
|
@@ -74,14 +78,13 @@
|
|
|
74
78
|
},
|
|
75
79
|
"devDependencies": {
|
|
76
80
|
"@fluidframework/build-common": "^0.23.0",
|
|
77
|
-
"@fluidframework/eslint-config-fluid": "^0.
|
|
78
|
-
"@fluidframework/mocha-test-setup": "^0.58.
|
|
81
|
+
"@fluidframework/eslint-config-fluid": "^0.27.0",
|
|
82
|
+
"@fluidframework/mocha-test-setup": "^0.58.2001",
|
|
79
83
|
"@microsoft/api-extractor": "^7.16.1",
|
|
80
84
|
"@rushstack/eslint-config": "^2.5.1",
|
|
81
85
|
"@types/mocha": "^8.2.2",
|
|
82
86
|
"@types/node-fetch": "^2.5.10",
|
|
83
87
|
"@types/sha.js": "^2.4.0",
|
|
84
|
-
"@types/socket.io-client": "^1.4.32",
|
|
85
88
|
"@typescript-eslint/eslint-plugin": "~5.9.0",
|
|
86
89
|
"@typescript-eslint/parser": "~5.9.0",
|
|
87
90
|
"concurrently": "^6.2.0",
|
package/src/createFile.ts
CHANGED
|
@@ -61,6 +61,7 @@ export async function createNewFluidFile(
|
|
|
61
61
|
// Check for valid filename before the request to create file is actually made.
|
|
62
62
|
if (isInvalidFileName(newFileInfo.filename)) {
|
|
63
63
|
throw new NonRetryableError(
|
|
64
|
+
// pre-0.58 error message: Invalid filename
|
|
64
65
|
"Invalid filename for createNew", OdspErrorType.invalidFileNameError, { driverVersion });
|
|
65
66
|
}
|
|
66
67
|
|
|
@@ -154,6 +155,7 @@ export async function createNewEmptyFluidFile(
|
|
|
154
155
|
const content = fetchResponse.content;
|
|
155
156
|
if (!content || !content.id) {
|
|
156
157
|
throw new NonRetryableError(
|
|
158
|
+
// pre-0.58 error message: ODSP CreateFile call returned no item ID
|
|
157
159
|
"ODSP CreateFile call returned no item ID (for empty file)",
|
|
158
160
|
DriverErrorType.incorrectServerResponse,
|
|
159
161
|
{ driverVersion });
|
package/src/fetchSnapshot.ts
CHANGED
|
@@ -382,7 +382,7 @@ async function fetchSnapshotContentsCoreV1(
|
|
|
382
382
|
// Adding below header will make VROOM API return 404 instead of 308 and browser can intercept it.
|
|
383
383
|
// This error thrown by server will contain the new redirect location. Look at the 404 error parsing
|
|
384
384
|
// for futher reference here: \packages\utils\odsp-doclib-utils\src\odspErrorUtils.ts
|
|
385
|
-
const header = {
|
|
385
|
+
const header = { prefer: "manualredirect" };
|
|
386
386
|
const { body, headers } = getFormBodyAndHeaders(
|
|
387
387
|
odspResolvedUrl, storageToken, snapshotOptions, header);
|
|
388
388
|
headers.accept = "application/json";
|
package/src/getFileLink.ts
CHANGED
|
@@ -13,10 +13,9 @@ import {
|
|
|
13
13
|
OdspResourceTokenFetchOptions,
|
|
14
14
|
IdentityType,
|
|
15
15
|
TokenFetcher,
|
|
16
|
-
tokenFromResponse,
|
|
17
16
|
} from "@fluidframework/odsp-driver-definitions";
|
|
18
17
|
import { getUrlAndHeadersWithAuth } from "./getUrlAndHeadersWithAuth";
|
|
19
|
-
import { fetchHelper, getWithRetryForTokenRefresh } from "./odspUtils";
|
|
18
|
+
import { fetchHelper, getWithRetryForTokenRefresh, toInstrumentedOdspTokenFetcher } from "./odspUtils";
|
|
20
19
|
import { pkgVersion as driverVersion } from "./packageVersion";
|
|
21
20
|
|
|
22
21
|
// Store cached responses for the lifetime of web session as file link remains the same for given file item
|
|
@@ -101,12 +100,21 @@ async function getFileLinkCore(
|
|
|
101
100
|
let additionalProps;
|
|
102
101
|
const fileLink = await getWithRetryForTokenRefresh(async (options) => {
|
|
103
102
|
attempts++;
|
|
104
|
-
const
|
|
103
|
+
const storageTokenFetcher = toInstrumentedOdspTokenFetcher(
|
|
104
|
+
logger,
|
|
105
|
+
odspUrlParts,
|
|
106
|
+
getToken,
|
|
107
|
+
true /* throwOnNullToken */,
|
|
108
|
+
);
|
|
109
|
+
const storageToken = await storageTokenFetcher(options,"GetFileLinkCore");
|
|
110
|
+
assert(storageToken !== null,
|
|
111
|
+
0x2bb /* "Instrumented token fetcher with throwOnNullToken = true should never return null" */);
|
|
112
|
+
|
|
105
113
|
const { url, headers } = getUrlAndHeadersWithAuth(
|
|
106
114
|
`${odspUrlParts.siteUrl}/_api/web/GetFileByUrl(@a1)/ListItemAllFields/GetSharingInformation?@a1=${
|
|
107
115
|
encodeURIComponent(`'${fileItem.webDavUrl}'`)
|
|
108
116
|
}`,
|
|
109
|
-
|
|
117
|
+
storageToken,
|
|
110
118
|
false,
|
|
111
119
|
);
|
|
112
120
|
const requestInit = {
|
|
@@ -167,10 +175,19 @@ async function getFileItemLite(
|
|
|
167
175
|
const fileItem = await getWithRetryForTokenRefresh(async (options) => {
|
|
168
176
|
attempts++;
|
|
169
177
|
const {siteUrl, driveId, itemId} = odspUrlParts;
|
|
170
|
-
const
|
|
178
|
+
const storageTokenFetcher = toInstrumentedOdspTokenFetcher(
|
|
179
|
+
logger,
|
|
180
|
+
odspUrlParts,
|
|
181
|
+
getToken,
|
|
182
|
+
true /* throwOnNullToken */,
|
|
183
|
+
);
|
|
184
|
+
const storageToken = await storageTokenFetcher(options,"GetFileItemLite");
|
|
185
|
+
assert(storageToken !== null,
|
|
186
|
+
0x2bc /* "Instrumented token fetcher with throwOnNullToken =true should never return null" */);
|
|
187
|
+
|
|
171
188
|
const { url, headers } = getUrlAndHeadersWithAuth(
|
|
172
189
|
`${siteUrl}/_api/v2.0/drives/${driveId}/items/${itemId}?select=webUrl,webDavUrl`,
|
|
173
|
-
|
|
190
|
+
storageToken,
|
|
174
191
|
forceAccessTokenViaAuthorizationHeader,
|
|
175
192
|
);
|
|
176
193
|
const requestInit = { method: "GET", headers };
|
package/src/getSocketIo.ts
CHANGED
|
@@ -9,6 +9,6 @@ import io from "socket.io-client";
|
|
|
9
9
|
* This function only exists to create an ESM wrapper around the socket.io client module
|
|
10
10
|
* for compatibility with ESM dynamic imports
|
|
11
11
|
*/
|
|
12
|
-
export function getSocketIo():
|
|
12
|
+
export function getSocketIo(): typeof io {
|
|
13
13
|
return io;
|
|
14
14
|
}
|
package/src/odspCache.ts
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Copyright (c) Microsoft Corporation and contributors. All rights reserved.
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
5
|
import { PromiseCache } from "@fluidframework/common-utils";
|
|
7
6
|
import {
|
|
8
7
|
IOdspResolvedUrl,
|
|
@@ -21,52 +20,16 @@ export interface IPersistedFileCache {
|
|
|
21
20
|
removeEntries(): Promise<void>;
|
|
22
21
|
}
|
|
23
22
|
|
|
24
|
-
/**
|
|
25
|
-
* Handles garbage collection of expiring cache entries.
|
|
26
|
-
* Not exported.
|
|
27
|
-
* (Based off of the same class in promiseCache.ts, could be consolidated)
|
|
28
|
-
*/
|
|
29
|
-
class GarbageCollector<TKey> {
|
|
30
|
-
private readonly gcTimeouts = new Map<TKey, ReturnType<typeof setTimeout>>();
|
|
31
|
-
|
|
32
|
-
constructor(
|
|
33
|
-
private readonly cleanup: (key: TKey) => void,
|
|
34
|
-
) { }
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Schedule GC for the given key, as applicable
|
|
38
|
-
*/
|
|
39
|
-
public schedule(key: TKey, durationMs: number) {
|
|
40
|
-
this.gcTimeouts.set(
|
|
41
|
-
key,
|
|
42
|
-
setTimeout(
|
|
43
|
-
() => { this.cleanup(key); this.cancel(key); },
|
|
44
|
-
durationMs,
|
|
45
|
-
),
|
|
46
|
-
);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Cancel any pending GC for the given key
|
|
51
|
-
*/
|
|
52
|
-
public cancel(key: TKey) {
|
|
53
|
-
const timeout = this.gcTimeouts.get(key);
|
|
54
|
-
if (timeout !== undefined) {
|
|
55
|
-
clearTimeout(timeout);
|
|
56
|
-
this.gcTimeouts.delete(key);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
23
|
/**
|
|
62
24
|
* Default local-only implementation of IPersistedCache,
|
|
63
25
|
* used if no persisted cache is provided by the host
|
|
64
26
|
*/
|
|
65
27
|
export class LocalPersistentCache implements IPersistedCache {
|
|
66
28
|
private readonly cache = new Map<string, any>();
|
|
67
|
-
|
|
29
|
+
// For every document id there will be a single expiration entry inspite of the number of cache entries.
|
|
30
|
+
private readonly docIdExpirationMap = new Map<string, ReturnType<typeof setTimeout>>();
|
|
68
31
|
|
|
69
|
-
public constructor(private readonly snapshotExpiryPolicy =
|
|
32
|
+
public constructor(private readonly snapshotExpiryPolicy = 3600 * 1000) { }
|
|
70
33
|
|
|
71
34
|
async get(entry: ICacheEntry): Promise<any> {
|
|
72
35
|
const key = this.keyFromEntry(entry);
|
|
@@ -77,30 +40,52 @@ export class LocalPersistentCache implements IPersistedCache {
|
|
|
77
40
|
async put(entry: ICacheEntry, value: any) {
|
|
78
41
|
const key = this.keyFromEntry(entry);
|
|
79
42
|
this.cache.set(key, value);
|
|
80
|
-
|
|
81
|
-
// Do not keep items too long in memory
|
|
82
|
-
this.gc.cancel(key);
|
|
83
|
-
this.gc.schedule(key, this.snapshotExpiryPolicy);
|
|
43
|
+
this.updateExpirationEntry(entry.file.docId);
|
|
84
44
|
}
|
|
85
45
|
|
|
86
46
|
async removeEntries(file: IFileEntry): Promise<void> {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
47
|
+
this.removeDocIdEntriesFromCache(file.docId);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private removeDocIdEntriesFromCache(docId: string) {
|
|
51
|
+
this.removeExpirationEntry(docId);
|
|
52
|
+
return Array.from(this.cache)
|
|
53
|
+
.filter(([cachekey]) => {
|
|
54
|
+
const docIdFromKey = cachekey.split("_");
|
|
55
|
+
if (docIdFromKey[0] === docId) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
.map(([cachekey]) => {
|
|
60
|
+
this.cache.delete(cachekey);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private removeExpirationEntry(docId: string) {
|
|
65
|
+
const timeout = this.docIdExpirationMap.get(docId);
|
|
66
|
+
if (timeout !== undefined) {
|
|
67
|
+
clearTimeout(timeout);
|
|
68
|
+
this.docIdExpirationMap.delete(docId);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private updateExpirationEntry(docId: string) {
|
|
73
|
+
this.removeExpirationEntry(docId);
|
|
74
|
+
this.docIdExpirationMap.set(
|
|
75
|
+
docId,
|
|
76
|
+
setTimeout(
|
|
77
|
+
() => {
|
|
78
|
+
this.removeDocIdEntriesFromCache(docId);
|
|
79
|
+
},
|
|
80
|
+
this.snapshotExpiryPolicy,
|
|
81
|
+
),
|
|
82
|
+
);
|
|
97
83
|
}
|
|
98
84
|
|
|
99
85
|
private keyFromEntry(entry: ICacheEntry): string {
|
|
100
86
|
return `${entry.file.docId}_${entry.type}_${entry.key}`;
|
|
101
87
|
}
|
|
102
88
|
}
|
|
103
|
-
|
|
104
89
|
export class PromiseCacheWithOneHourSlidingExpiry<T> extends PromiseCache<string, T> {
|
|
105
90
|
constructor(removeOnError?: (e: any) => boolean) {
|
|
106
91
|
super({ expiry: { policy: "sliding", durationMs: 3600000 }, removeOnError });
|
|
@@ -114,7 +99,8 @@ export interface INonPersistentCache {
|
|
|
114
99
|
/**
|
|
115
100
|
* Cache of joined/joining session info
|
|
116
101
|
*/
|
|
117
|
-
readonly sessionJoinCache: PromiseCache<string,
|
|
102
|
+
readonly sessionJoinCache: PromiseCache<string,
|
|
103
|
+
{ entryTime: number, joinSessionResponse: ISocketStorageDiscovery }>;
|
|
118
104
|
|
|
119
105
|
/**
|
|
120
106
|
* Cache of resolved/resolving file URLs
|
|
@@ -134,7 +120,7 @@ export interface IOdspCache extends INonPersistentCache {
|
|
|
134
120
|
|
|
135
121
|
export class NonPersistentCache implements INonPersistentCache {
|
|
136
122
|
public readonly sessionJoinCache =
|
|
137
|
-
new PromiseCache<string, {entryTime: number, joinSessionResponse: ISocketStorageDiscovery}>();
|
|
123
|
+
new PromiseCache<string, { entryTime: number, joinSessionResponse: ISocketStorageDiscovery }>();
|
|
138
124
|
|
|
139
125
|
public readonly fileUrlCache = new PromiseCache<string, IOdspResolvedUrl>();
|
|
140
126
|
}
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
ISequencedDocumentMessage,
|
|
17
17
|
ISignalMessage,
|
|
18
18
|
} from "@fluidframework/protocol-definitions";
|
|
19
|
+
import type { Socket, io as SocketIOClientStatic } from "socket.io-client";
|
|
19
20
|
import { v4 as uuid } from "uuid";
|
|
20
21
|
import { IOdspSocketError, IGetOpsResponse, IFlushOpsResponse } from "./contracts";
|
|
21
22
|
import { EpochTracker } from "./epochTracker";
|
|
@@ -42,7 +43,7 @@ export interface ISocketEvents extends IEvent {
|
|
|
42
43
|
class SocketReference extends TypedEventEmitter<ISocketEvents> {
|
|
43
44
|
private references: number = 1;
|
|
44
45
|
private delayDeleteTimeout: ReturnType<typeof setTimeout> | undefined;
|
|
45
|
-
private _socket:
|
|
46
|
+
private _socket: Socket | undefined;
|
|
46
47
|
|
|
47
48
|
// When making decisions about socket reuse, we do not reuse disconnected socket.
|
|
48
49
|
// But we want to differentiate the following case from disconnected case:
|
|
@@ -106,7 +107,7 @@ class SocketReference extends TypedEventEmitter<ISocketEvents> {
|
|
|
106
107
|
return this._socket;
|
|
107
108
|
}
|
|
108
109
|
|
|
109
|
-
public constructor(public readonly key: string, socket:
|
|
110
|
+
public constructor(public readonly key: string, socket: Socket) {
|
|
110
111
|
super();
|
|
111
112
|
|
|
112
113
|
this._socket = socket;
|
|
@@ -198,7 +199,7 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
|
|
|
198
199
|
tenantId: string,
|
|
199
200
|
documentId: string,
|
|
200
201
|
token: string | null,
|
|
201
|
-
io: SocketIOClientStatic,
|
|
202
|
+
io: typeof SocketIOClientStatic,
|
|
202
203
|
client: IClient,
|
|
203
204
|
url: string,
|
|
204
205
|
telemetryLogger: ITelemetryLogger,
|
|
@@ -300,7 +301,7 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
|
|
|
300
301
|
* Gets or create a socket io connection for the given key
|
|
301
302
|
*/
|
|
302
303
|
private static getOrCreateSocketIoReference(
|
|
303
|
-
io: SocketIOClientStatic,
|
|
304
|
+
io: typeof SocketIOClientStatic,
|
|
304
305
|
timeoutMs: number,
|
|
305
306
|
key: string,
|
|
306
307
|
url: string,
|
|
@@ -337,7 +338,7 @@ export class OdspDocumentDeltaConnection extends DocumentDeltaConnection {
|
|
|
337
338
|
* @param enableMultiplexing - If the websocket is multiplexing multiple documents
|
|
338
339
|
*/
|
|
339
340
|
private constructor(
|
|
340
|
-
socket:
|
|
341
|
+
socket: Socket,
|
|
341
342
|
documentId: string,
|
|
342
343
|
socketReference: SocketReference,
|
|
343
344
|
logger: ITelemetryLogger,
|