vector-framework 1.2.2 → 1.2.3
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/README.md +18 -6
- package/dist/auth/protected.d.ts +4 -4
- package/dist/auth/protected.d.ts.map +1 -1
- package/dist/auth/protected.js +10 -7
- package/dist/auth/protected.js.map +1 -1
- package/dist/cache/manager.d.ts +2 -0
- package/dist/cache/manager.d.ts.map +1 -1
- package/dist/cache/manager.js +21 -4
- package/dist/cache/manager.js.map +1 -1
- package/dist/checkpoint/artifacts/compressor.d.ts +5 -0
- package/dist/checkpoint/artifacts/compressor.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/compressor.js +24 -0
- package/dist/checkpoint/artifacts/compressor.js.map +1 -0
- package/dist/checkpoint/artifacts/decompress-worker.d.ts +2 -0
- package/dist/checkpoint/artifacts/decompress-worker.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/decompress-worker.js +31 -0
- package/dist/checkpoint/artifacts/decompress-worker.js.map +1 -0
- package/dist/checkpoint/artifacts/hasher.d.ts +2 -0
- package/dist/checkpoint/artifacts/hasher.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/hasher.js +7 -0
- package/dist/checkpoint/artifacts/hasher.js.map +1 -0
- package/dist/checkpoint/artifacts/manifest.d.ts +6 -0
- package/dist/checkpoint/artifacts/manifest.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/manifest.js +55 -0
- package/dist/checkpoint/artifacts/manifest.js.map +1 -0
- package/dist/checkpoint/artifacts/materializer.d.ts +16 -0
- package/dist/checkpoint/artifacts/materializer.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/materializer.js +168 -0
- package/dist/checkpoint/artifacts/materializer.js.map +1 -0
- package/dist/checkpoint/artifacts/packager.d.ts +12 -0
- package/dist/checkpoint/artifacts/packager.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/packager.js +82 -0
- package/dist/checkpoint/artifacts/packager.js.map +1 -0
- package/dist/checkpoint/artifacts/repository.d.ts +11 -0
- package/dist/checkpoint/artifacts/repository.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/repository.js +29 -0
- package/dist/checkpoint/artifacts/repository.js.map +1 -0
- package/dist/checkpoint/artifacts/store.d.ts +13 -0
- package/dist/checkpoint/artifacts/store.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/store.js +85 -0
- package/dist/checkpoint/artifacts/store.js.map +1 -0
- package/dist/checkpoint/artifacts/types.d.ts +21 -0
- package/dist/checkpoint/artifacts/types.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/types.js +2 -0
- package/dist/checkpoint/artifacts/types.js.map +1 -0
- package/dist/checkpoint/artifacts/worker-decompressor.d.ts +17 -0
- package/dist/checkpoint/artifacts/worker-decompressor.d.ts.map +1 -0
- package/dist/checkpoint/artifacts/worker-decompressor.js +148 -0
- package/dist/checkpoint/artifacts/worker-decompressor.js.map +1 -0
- package/dist/checkpoint/asset-store.d.ts +10 -0
- package/dist/checkpoint/asset-store.d.ts.map +1 -0
- package/dist/checkpoint/asset-store.js +46 -0
- package/dist/checkpoint/asset-store.js.map +1 -0
- package/dist/checkpoint/bundler.d.ts +15 -0
- package/dist/checkpoint/bundler.d.ts.map +1 -0
- package/dist/checkpoint/bundler.js +45 -0
- package/dist/checkpoint/bundler.js.map +1 -0
- package/dist/checkpoint/cli.d.ts +2 -0
- package/dist/checkpoint/cli.d.ts.map +1 -0
- package/dist/checkpoint/cli.js +157 -0
- package/dist/checkpoint/cli.js.map +1 -0
- package/dist/checkpoint/entrypoint-generator.d.ts +17 -0
- package/dist/checkpoint/entrypoint-generator.d.ts.map +1 -0
- package/dist/checkpoint/entrypoint-generator.js +251 -0
- package/dist/checkpoint/entrypoint-generator.js.map +1 -0
- package/dist/checkpoint/forwarder.d.ts +6 -0
- package/dist/checkpoint/forwarder.d.ts.map +1 -0
- package/dist/checkpoint/forwarder.js +74 -0
- package/dist/checkpoint/forwarder.js.map +1 -0
- package/dist/checkpoint/gateway.d.ts +11 -0
- package/dist/checkpoint/gateway.d.ts.map +1 -0
- package/dist/checkpoint/gateway.js +30 -0
- package/dist/checkpoint/gateway.js.map +1 -0
- package/dist/checkpoint/ipc.d.ts +12 -0
- package/dist/checkpoint/ipc.d.ts.map +1 -0
- package/dist/checkpoint/ipc.js +96 -0
- package/dist/checkpoint/ipc.js.map +1 -0
- package/dist/checkpoint/manager.d.ts +20 -0
- package/dist/checkpoint/manager.d.ts.map +1 -0
- package/dist/checkpoint/manager.js +214 -0
- package/dist/checkpoint/manager.js.map +1 -0
- package/dist/checkpoint/process-manager.d.ts +35 -0
- package/dist/checkpoint/process-manager.d.ts.map +1 -0
- package/dist/checkpoint/process-manager.js +203 -0
- package/dist/checkpoint/process-manager.js.map +1 -0
- package/dist/checkpoint/resolver.d.ts +25 -0
- package/dist/checkpoint/resolver.d.ts.map +1 -0
- package/dist/checkpoint/resolver.js +95 -0
- package/dist/checkpoint/resolver.js.map +1 -0
- package/dist/checkpoint/socket-path.d.ts +2 -0
- package/dist/checkpoint/socket-path.d.ts.map +1 -0
- package/dist/checkpoint/socket-path.js +51 -0
- package/dist/checkpoint/socket-path.js.map +1 -0
- package/dist/checkpoint/types.d.ts +54 -0
- package/dist/checkpoint/types.d.ts.map +1 -0
- package/dist/checkpoint/types.js +2 -0
- package/dist/checkpoint/types.js.map +1 -0
- package/dist/cli/index.js +10 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/option-resolution.d.ts +1 -1
- package/dist/cli/option-resolution.d.ts.map +1 -1
- package/dist/cli/option-resolution.js.map +1 -1
- package/dist/cli.js +3709 -328
- package/dist/core/config-loader.d.ts +1 -0
- package/dist/core/config-loader.d.ts.map +1 -1
- package/dist/core/config-loader.js +10 -2
- package/dist/core/config-loader.js.map +1 -1
- package/dist/core/router.d.ts +24 -3
- package/dist/core/router.d.ts.map +1 -1
- package/dist/core/router.js +398 -249
- package/dist/core/router.js.map +1 -1
- package/dist/core/server.d.ts +2 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +22 -8
- package/dist/core/server.js.map +1 -1
- package/dist/core/vector.d.ts +3 -0
- package/dist/core/vector.d.ts.map +1 -1
- package/dist/core/vector.js +51 -1
- package/dist/core/vector.js.map +1 -1
- package/dist/dev/route-scanner.d.ts.map +1 -1
- package/dist/dev/route-scanner.js +2 -1
- package/dist/dev/route-scanner.js.map +1 -1
- package/dist/http.d.ts +32 -7
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +144 -13
- package/dist/http.js.map +1 -1
- package/dist/index.cjs +1297 -74
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1296 -73
- package/dist/middleware/manager.d.ts +3 -3
- package/dist/middleware/manager.d.ts.map +1 -1
- package/dist/middleware/manager.js +9 -8
- package/dist/middleware/manager.js.map +1 -1
- package/dist/openapi/docs-ui.d.ts.map +1 -1
- package/dist/openapi/docs-ui.js +1097 -61
- package/dist/openapi/docs-ui.js.map +1 -1
- package/dist/openapi/generator.d.ts +2 -1
- package/dist/openapi/generator.d.ts.map +1 -1
- package/dist/openapi/generator.js +240 -7
- package/dist/openapi/generator.js.map +1 -1
- package/dist/types/index.d.ts +71 -28
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +24 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +3 -2
- package/dist/utils/validation.js.map +1 -1
- package/package.json +2 -1
- package/src/auth/protected.ts +11 -8
- package/src/cache/manager.ts +23 -4
- package/src/checkpoint/artifacts/compressor.ts +30 -0
- package/src/checkpoint/artifacts/decompress-worker.ts +49 -0
- package/src/checkpoint/artifacts/hasher.ts +6 -0
- package/src/checkpoint/artifacts/manifest.ts +72 -0
- package/src/checkpoint/artifacts/materializer.ts +211 -0
- package/src/checkpoint/artifacts/packager.ts +100 -0
- package/src/checkpoint/artifacts/repository.ts +36 -0
- package/src/checkpoint/artifacts/store.ts +102 -0
- package/src/checkpoint/artifacts/types.ts +24 -0
- package/src/checkpoint/artifacts/worker-decompressor.ts +192 -0
- package/src/checkpoint/asset-store.ts +61 -0
- package/src/checkpoint/bundler.ts +64 -0
- package/src/checkpoint/cli.ts +177 -0
- package/src/checkpoint/entrypoint-generator.ts +275 -0
- package/src/checkpoint/forwarder.ts +84 -0
- package/src/checkpoint/gateway.ts +40 -0
- package/src/checkpoint/ipc.ts +107 -0
- package/src/checkpoint/manager.ts +254 -0
- package/src/checkpoint/process-manager.ts +250 -0
- package/src/checkpoint/resolver.ts +124 -0
- package/src/checkpoint/socket-path.ts +61 -0
- package/src/checkpoint/types.ts +63 -0
- package/src/cli/index.ts +11 -2
- package/src/cli/option-resolution.ts +5 -1
- package/src/core/config-loader.ts +11 -2
- package/src/core/router.ts +505 -264
- package/src/core/server.ts +36 -9
- package/src/core/vector.ts +60 -1
- package/src/dev/route-scanner.ts +2 -1
- package/src/http.ts +219 -19
- package/src/index.ts +3 -2
- package/src/middleware/manager.ts +10 -10
- package/src/openapi/docs-ui.ts +1097 -61
- package/src/openapi/generator.ts +265 -6
- package/src/types/index.ts +83 -30
- package/src/utils/validation.ts +5 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.js
CHANGED
|
@@ -1,2 +1,25 @@
|
|
|
1
|
-
export
|
|
1
|
+
export var OpenApiSecuritySchemeType;
|
|
2
|
+
(function (OpenApiSecuritySchemeType) {
|
|
3
|
+
OpenApiSecuritySchemeType["ApiKey"] = "apiKey";
|
|
4
|
+
OpenApiSecuritySchemeType["Http"] = "http";
|
|
5
|
+
OpenApiSecuritySchemeType["MutualTls"] = "mutualTLS";
|
|
6
|
+
OpenApiSecuritySchemeType["OAuth2"] = "oauth2";
|
|
7
|
+
OpenApiSecuritySchemeType["OpenIdConnect"] = "openIdConnect";
|
|
8
|
+
})(OpenApiSecuritySchemeType || (OpenApiSecuritySchemeType = {}));
|
|
9
|
+
export var HttpAuthScheme;
|
|
10
|
+
(function (HttpAuthScheme) {
|
|
11
|
+
HttpAuthScheme["Basic"] = "basic";
|
|
12
|
+
HttpAuthScheme["Bearer"] = "bearer";
|
|
13
|
+
HttpAuthScheme["Digest"] = "digest";
|
|
14
|
+
})(HttpAuthScheme || (HttpAuthScheme = {}));
|
|
15
|
+
export var AuthKind;
|
|
16
|
+
(function (AuthKind) {
|
|
17
|
+
AuthKind["ApiKey"] = "ApiKey";
|
|
18
|
+
AuthKind["HttpBasic"] = "HttpBasic";
|
|
19
|
+
AuthKind["HttpBearer"] = "HttpBearer";
|
|
20
|
+
AuthKind["HttpDigest"] = "HttpDigest";
|
|
21
|
+
AuthKind["OAuth2"] = "OAuth2";
|
|
22
|
+
AuthKind["OpenIdConnect"] = "OpenIdConnect";
|
|
23
|
+
AuthKind["MutualTls"] = "MutualTls";
|
|
24
|
+
})(AuthKind || (AuthKind = {}));
|
|
2
25
|
//# sourceMappingURL=index.js.map
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAyGA,MAAM,CAAN,IAAY,yBAMX;AAND,WAAY,yBAAyB;IACnC,8CAAiB,CAAA;IACjB,0CAAa,CAAA;IACb,oDAAuB,CAAA;IACvB,8CAAiB,CAAA;IACjB,4DAA+B,CAAA;AACjC,CAAC,EANW,yBAAyB,KAAzB,yBAAyB,QAMpC;AAED,MAAM,CAAN,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,iCAAe,CAAA;IACf,mCAAiB,CAAA;IACjB,mCAAiB,CAAA;AACnB,CAAC,EAJW,cAAc,KAAd,cAAc,QAIzB;AAED,MAAM,CAAN,IAAY,QAQX;AARD,WAAY,QAAQ;IAClB,6BAAiB,CAAA;IACjB,mCAAuB,CAAA;IACvB,qCAAyB,CAAA;IACzB,qCAAyB,CAAA;IACzB,6BAAiB,CAAA;IACjB,2CAA+B,CAAA;IAC/B,mCAAuB,CAAA;AACzB,CAAC,EARW,QAAQ,KAAR,QAAQ,QAQnB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiBjE;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1D,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAiBjE;AAmCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD"}
|
package/dist/utils/validation.js
CHANGED
|
@@ -20,10 +20,11 @@ function validatePort(port) {
|
|
|
20
20
|
if (port === undefined) {
|
|
21
21
|
return DEFAULT_CONFIG.PORT;
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
const normalizedPort = Number(port);
|
|
24
|
+
if (!Number.isInteger(normalizedPort) || normalizedPort < 1 || normalizedPort > 65535) {
|
|
24
25
|
throw new Error(`Invalid port: ${port}. Port must be between 1 and 65535.`);
|
|
25
26
|
}
|
|
26
|
-
return
|
|
27
|
+
return normalizedPort;
|
|
27
28
|
}
|
|
28
29
|
function validateCorsOptions(cors) {
|
|
29
30
|
if (cors === false) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,eAAe,GAAiB;QACpC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;QACpD,SAAS,EAAE,MAAM,CAAC,SAAS,KAAK,KAAK;QACrC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;QACxC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,cAAc,CAAC,UAAU;QACxD,YAAY,EAAE,MAAM,CAAC,YAAY,KAAK,KAAK;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAChE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,MAAM,eAAe,GAAiB;QACpC,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ;QACpD,SAAS,EAAE,MAAM,CAAC,SAAS,KAAK,KAAK;QACrC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,KAAK;QACxC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,cAAc,CAAC,UAAU;QACxD,YAAY,EAAE,MAAM,CAAC,YAAY,KAAK,KAAK;QAC3C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAChE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;IAEF,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,IAAsB;IAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,qCAAqC,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA2B;IACtD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO;YACL,MAAM,EAAE,GAAG;YACX,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;YAC/C,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;YAClE,aAAa,EAAE,CAAC,eAAe,CAAC;YAChC,MAAM,EAAE,cAAc,CAAC,YAAY;SACpC,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAClF,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vector-framework",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"author": "webhie-com",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -88,6 +88,7 @@
|
|
|
88
88
|
"test:load": "bun run tests/e2e/load.test.ts",
|
|
89
89
|
"test:soak": "bun run tests/e2e/soak.test.ts",
|
|
90
90
|
"test:benchmark": "bun run tests/e2e/benchmark.test.ts",
|
|
91
|
+
"test:benchmark:checkpoint": "bun run tests/e2e/checkpoint-raw-fetch-no-rate-limit.ts",
|
|
91
92
|
"test:benchmark:io-schema": "bun run tests/e2e/concurrency-io-schema-benchmark.ts",
|
|
92
93
|
"test:all": "bun test ./tests/**/*.test.ts",
|
|
93
94
|
"test:perf": "bun run test:load && bun run test:soak && bun run test:benchmark",
|
package/src/auth/protected.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DefaultVectorTypes, GetAuthType, ProtectedHandler,
|
|
1
|
+
import type { DefaultVectorTypes, GetAuthType, ProtectedHandler, VectorContext, VectorTypes } from '../types';
|
|
2
2
|
|
|
3
3
|
export class AuthManager<TTypes extends VectorTypes = DefaultVectorTypes> {
|
|
4
4
|
private protectedHandler: ProtectedHandler<TTypes> | null = null;
|
|
@@ -11,25 +11,28 @@ export class AuthManager<TTypes extends VectorTypes = DefaultVectorTypes> {
|
|
|
11
11
|
this.protectedHandler = null;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
async authenticate(
|
|
14
|
+
async authenticate(context: VectorContext<TTypes>): Promise<GetAuthType<TTypes> | null> {
|
|
15
15
|
if (!this.protectedHandler) {
|
|
16
16
|
throw new Error('Protected handler not configured. Use vector.protected() to set authentication handler.');
|
|
17
17
|
}
|
|
18
|
+
if (!context || typeof context !== 'object' || !(context as any).request) {
|
|
19
|
+
throw new Error('Authentication context is invalid: missing request');
|
|
20
|
+
}
|
|
18
21
|
|
|
19
22
|
try {
|
|
20
|
-
const authUser = await this.protectedHandler(
|
|
21
|
-
|
|
23
|
+
const authUser = await this.protectedHandler(context);
|
|
24
|
+
context.authUser = authUser;
|
|
22
25
|
return authUser;
|
|
23
26
|
} catch (error) {
|
|
24
27
|
throw new Error(`Authentication failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
25
28
|
}
|
|
26
29
|
}
|
|
27
30
|
|
|
28
|
-
isAuthenticated(
|
|
29
|
-
return !!
|
|
31
|
+
isAuthenticated(context: VectorContext<TTypes>): boolean {
|
|
32
|
+
return !!context.authUser;
|
|
30
33
|
}
|
|
31
34
|
|
|
32
|
-
getUser(
|
|
33
|
-
return
|
|
35
|
+
getUser(context: VectorContext<TTypes>): GetAuthType<TTypes> | null {
|
|
36
|
+
return context.authUser || null;
|
|
34
37
|
}
|
|
35
38
|
}
|
package/src/cache/manager.ts
CHANGED
|
@@ -41,12 +41,13 @@ export class CacheManager<TTypes extends VectorTypes = DefaultVectorTypes> {
|
|
|
41
41
|
const cached = this.memoryCache.get(key);
|
|
42
42
|
|
|
43
43
|
if (this.isCacheValid(cached, now)) {
|
|
44
|
-
return cached!.value as T;
|
|
44
|
+
return this.cloneCachedValue(cached!.value as T);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
// Deduplicate concurrent requests for the same key (cache stampede prevention)
|
|
48
48
|
if (this.inflight.has(key)) {
|
|
49
|
-
|
|
49
|
+
const inflightValue = (await this.inflight.get(key)!) as T;
|
|
50
|
+
return this.cloneCachedValue(inflightValue);
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
const promise = (async () => {
|
|
@@ -69,17 +70,35 @@ export class CacheManager<TTypes extends VectorTypes = DefaultVectorTypes> {
|
|
|
69
70
|
|
|
70
71
|
private setInMemoryCache(key: string, value: any, ttl: number): void {
|
|
71
72
|
const expires = Date.now() + ttl * 1000;
|
|
72
|
-
this.memoryCache.set(key, { value, expires });
|
|
73
|
+
this.memoryCache.set(key, { value: this.cloneForStore(value), expires });
|
|
73
74
|
|
|
74
75
|
this.scheduleCleanup();
|
|
75
76
|
}
|
|
76
77
|
|
|
78
|
+
private cloneForStore<T>(value: T): T {
|
|
79
|
+
if (value instanceof Response) {
|
|
80
|
+
return value.clone() as unknown as T;
|
|
81
|
+
}
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private cloneCachedValue<T>(value: T): T {
|
|
86
|
+
if (value instanceof Response) {
|
|
87
|
+
return value.clone() as unknown as T;
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
|
|
77
92
|
private scheduleCleanup(): void {
|
|
78
93
|
if (this.cleanupInterval) return;
|
|
79
94
|
|
|
80
|
-
|
|
95
|
+
const timer = setInterval(() => {
|
|
81
96
|
this.cleanupExpired();
|
|
82
97
|
}, 60000); // Clean up every minute
|
|
98
|
+
if (typeof (timer as any).unref === 'function') {
|
|
99
|
+
(timer as any).unref();
|
|
100
|
+
}
|
|
101
|
+
this.cleanupInterval = timer;
|
|
83
102
|
}
|
|
84
103
|
|
|
85
104
|
private cleanupExpired(): void {
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CheckpointCompressionCodec } from '../types';
|
|
2
|
+
|
|
3
|
+
export const DEFAULT_ASSET_CODEC: CheckpointCompressionCodec = 'gzip';
|
|
4
|
+
|
|
5
|
+
export function compressBytes(input: Uint8Array, codec: CheckpointCompressionCodec = DEFAULT_ASSET_CODEC): Uint8Array {
|
|
6
|
+
const normalized = new Uint8Array(input);
|
|
7
|
+
switch (codec) {
|
|
8
|
+
case 'none':
|
|
9
|
+
return normalized;
|
|
10
|
+
case 'gzip':
|
|
11
|
+
return Bun.gzipSync(normalized);
|
|
12
|
+
default:
|
|
13
|
+
throw new Error(`Unsupported compression codec: ${codec}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function decompressBytes(
|
|
18
|
+
input: Uint8Array,
|
|
19
|
+
codec: CheckpointCompressionCodec = DEFAULT_ASSET_CODEC
|
|
20
|
+
): Uint8Array {
|
|
21
|
+
const normalized = new Uint8Array(input);
|
|
22
|
+
switch (codec) {
|
|
23
|
+
case 'none':
|
|
24
|
+
return normalized;
|
|
25
|
+
case 'gzip':
|
|
26
|
+
return Bun.gunzipSync(normalized);
|
|
27
|
+
default:
|
|
28
|
+
throw new Error(`Unsupported compression codec: ${codec}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { CheckpointCompressionCodec } from '../types';
|
|
2
|
+
|
|
3
|
+
interface DecompressWorkerRequest {
|
|
4
|
+
id: number;
|
|
5
|
+
codec: CheckpointCompressionCodec;
|
|
6
|
+
input: ArrayBuffer;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
interface DecompressWorkerResponse {
|
|
10
|
+
id: number;
|
|
11
|
+
output?: ArrayBuffer;
|
|
12
|
+
error?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const worker = globalThis as unknown as Worker;
|
|
16
|
+
|
|
17
|
+
worker.onmessage = (event: MessageEvent<DecompressWorkerRequest>) => {
|
|
18
|
+
const request = event.data;
|
|
19
|
+
const response: DecompressWorkerResponse = { id: request.id };
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const input = new Uint8Array(request.input);
|
|
23
|
+
const output = decompressInWorker(input, request.codec);
|
|
24
|
+
const outputBuffer = toArrayBuffer(output);
|
|
25
|
+
response.output = outputBuffer;
|
|
26
|
+
worker.postMessage(response, [outputBuffer]);
|
|
27
|
+
} catch (error) {
|
|
28
|
+
response.error = error instanceof Error ? error.message : String(error);
|
|
29
|
+
worker.postMessage(response);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function decompressInWorker(
|
|
34
|
+
input: Uint8Array<ArrayBuffer>,
|
|
35
|
+
codec: CheckpointCompressionCodec
|
|
36
|
+
): Uint8Array<ArrayBufferLike> {
|
|
37
|
+
switch (codec) {
|
|
38
|
+
case 'none':
|
|
39
|
+
return input;
|
|
40
|
+
case 'gzip':
|
|
41
|
+
return Bun.gunzipSync(input);
|
|
42
|
+
default:
|
|
43
|
+
throw new Error(`Unsupported compression codec: ${codec}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function toArrayBuffer(input: Uint8Array<ArrayBufferLike>): ArrayBuffer {
|
|
48
|
+
return new Uint8Array(input).buffer;
|
|
49
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function sha256Hex(content: Uint8Array | ArrayBuffer): string {
|
|
2
|
+
const bytes = content instanceof Uint8Array ? content : new Uint8Array(content);
|
|
3
|
+
const hashBuffer = Bun.SHA256.hash(bytes);
|
|
4
|
+
const hashBytes = new Uint8Array(hashBuffer.buffer, hashBuffer.byteOffset, hashBuffer.byteLength);
|
|
5
|
+
return Buffer.from(hashBytes).toString('hex');
|
|
6
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { basename, isAbsolute, relative } from 'node:path';
|
|
2
|
+
import type { CheckpointAssetRecord } from '../types';
|
|
3
|
+
|
|
4
|
+
const UNSAFE_SEGMENT_PATTERN = /[^a-zA-Z0-9._/-]/g;
|
|
5
|
+
const WINDOWS_DRIVE_ABS_PATTERN = /^[a-zA-Z]:[\\/]/;
|
|
6
|
+
const WINDOWS_UNC_ABS_PATTERN = /^\\\\[^\\]+\\[^\\]+/;
|
|
7
|
+
|
|
8
|
+
export function normalizeLogicalPath(input: string): string {
|
|
9
|
+
const normalizedInput = normalizeSlashes(input).trim();
|
|
10
|
+
const rel = isAbsolutePathPortable(normalizedInput) ? toPortableRelativePath(normalizedInput) : normalizedInput;
|
|
11
|
+
|
|
12
|
+
const cleaned = rel
|
|
13
|
+
.split('/')
|
|
14
|
+
.filter((segment) => segment.length > 0 && segment !== '.' && segment !== '..')
|
|
15
|
+
.join('/');
|
|
16
|
+
|
|
17
|
+
const sanitized = cleaned.replace(UNSAFE_SEGMENT_PATTERN, '_').replace(/^\/+/, '');
|
|
18
|
+
if (sanitized.length > 0) {
|
|
19
|
+
return sanitized;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const fallback = basename(normalizedInput).replace(UNSAFE_SEGMENT_PATTERN, '_');
|
|
23
|
+
return fallback.length > 0 ? `external/${fallback}` : 'external/asset.bin';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function normalizeRelativePath(input: string): string {
|
|
27
|
+
return normalizeSlashes(input).replace(/^\/+/, '');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function isAbsolutePathPortable(input: string): boolean {
|
|
31
|
+
const normalized = normalizeSlashes(input).trim();
|
|
32
|
+
return isAbsolute(normalized) || WINDOWS_DRIVE_ABS_PATTERN.test(normalized) || WINDOWS_UNC_ABS_PATTERN.test(input);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function computeAssetFingerprint(assets: CheckpointAssetRecord[]): string {
|
|
36
|
+
const stable = assets
|
|
37
|
+
.map((asset) => ({
|
|
38
|
+
type: asset.type,
|
|
39
|
+
logicalPath: asset.logicalPath,
|
|
40
|
+
contentHash: asset.contentHash ?? asset.hash,
|
|
41
|
+
blobHash: asset.blobHash ?? '',
|
|
42
|
+
blobPath: asset.blobPath ?? asset.storedPath,
|
|
43
|
+
codec: asset.codec ?? 'none',
|
|
44
|
+
size: asset.contentSize ?? asset.size,
|
|
45
|
+
}))
|
|
46
|
+
.sort((a, b) =>
|
|
47
|
+
`${a.type}:${a.logicalPath}:${a.contentHash}:${a.blobHash}`.localeCompare(
|
|
48
|
+
`${b.type}:${b.logicalPath}:${b.contentHash}:${b.blobHash}`
|
|
49
|
+
)
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
return JSON.stringify(stable);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function normalizeSlashes(value: string): string {
|
|
56
|
+
return value.replace(/\\/g, '/');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function toPortableRelativePath(input: string): string {
|
|
60
|
+
const normalized = normalizeSlashes(input);
|
|
61
|
+
if (WINDOWS_DRIVE_ABS_PATTERN.test(normalized)) {
|
|
62
|
+
return normalized.replace(/^[a-zA-Z]:/, '').replace(/^\/+/, '');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (WINDOWS_UNC_ABS_PATTERN.test(input)) {
|
|
66
|
+
return normalizeSlashes(input)
|
|
67
|
+
.replace(/^\\\\[^\\]+\\[^\\]+/, '')
|
|
68
|
+
.replace(/^\/+/, '');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return normalizeSlashes(relative(process.cwd(), normalized));
|
|
72
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { existsSync, promises as fs } from 'node:fs';
|
|
2
|
+
import { dirname, extname, join, relative } from 'node:path';
|
|
3
|
+
import type { CheckpointAssetRecord, CheckpointManifest } from '../types';
|
|
4
|
+
import { sha256Hex } from './hasher';
|
|
5
|
+
import { computeAssetFingerprint, isAbsolutePathPortable, normalizeLogicalPath } from './manifest';
|
|
6
|
+
import type { CheckpointArtifactMaterializerOptions } from './types';
|
|
7
|
+
import { CheckpointWorkerDecompressor } from './worker-decompressor';
|
|
8
|
+
|
|
9
|
+
const DEFAULT_MATERIALIZED_DIR = '_materialized';
|
|
10
|
+
const DEFAULT_LOCK_TIMEOUT_MS = 15_000;
|
|
11
|
+
const DEFAULT_LOCK_POLL_MS = 50;
|
|
12
|
+
|
|
13
|
+
interface MaterializedMarker {
|
|
14
|
+
fingerprint: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class CheckpointArtifactMaterializer {
|
|
19
|
+
private verifyChecksums: boolean;
|
|
20
|
+
private materializedDirName: string;
|
|
21
|
+
private lockTimeoutMs: number;
|
|
22
|
+
|
|
23
|
+
constructor(options: CheckpointArtifactMaterializerOptions = {}) {
|
|
24
|
+
this.verifyChecksums = options.verifyChecksums ?? true;
|
|
25
|
+
this.materializedDirName = options.materializedDirName ?? DEFAULT_MATERIALIZED_DIR;
|
|
26
|
+
this.lockTimeoutMs = options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async materialize(manifest: CheckpointManifest, storageDir: string): Promise<void> {
|
|
30
|
+
const versionDir = join(storageDir, manifest.version);
|
|
31
|
+
const markerPath = join(versionDir, '.assets.ready.json');
|
|
32
|
+
const lockPath = join(versionDir, '.assets.lock');
|
|
33
|
+
const fingerprint = computeAssetFingerprint(manifest.assets);
|
|
34
|
+
|
|
35
|
+
if (await this.isReady(markerPath, fingerprint, manifest.assets, join(versionDir, this.materializedDirName))) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
await this.acquireLock(lockPath);
|
|
40
|
+
try {
|
|
41
|
+
if (await this.isReady(markerPath, fingerprint, manifest.assets, join(versionDir, this.materializedDirName))) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const materializedRoot = join(versionDir, this.materializedDirName);
|
|
46
|
+
await fs.rm(materializedRoot, { recursive: true, force: true });
|
|
47
|
+
await fs.mkdir(materializedRoot, { recursive: true });
|
|
48
|
+
|
|
49
|
+
const decompressor = new CheckpointWorkerDecompressor();
|
|
50
|
+
try {
|
|
51
|
+
for (const asset of manifest.assets) {
|
|
52
|
+
const result = await this.materializeAsset(asset, storageDir, versionDir, materializedRoot, decompressor);
|
|
53
|
+
asset.materializedPath = result;
|
|
54
|
+
}
|
|
55
|
+
} finally {
|
|
56
|
+
await decompressor.dispose();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const marker: MaterializedMarker = {
|
|
60
|
+
fingerprint,
|
|
61
|
+
createdAt: new Date().toISOString(),
|
|
62
|
+
};
|
|
63
|
+
await fs.writeFile(markerPath, JSON.stringify(marker, null, 2), 'utf-8');
|
|
64
|
+
} finally {
|
|
65
|
+
await fs.rm(lockPath, { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private async materializeAsset(
|
|
70
|
+
asset: CheckpointAssetRecord,
|
|
71
|
+
storageDir: string,
|
|
72
|
+
versionDir: string,
|
|
73
|
+
root: string,
|
|
74
|
+
decompressor: CheckpointWorkerDecompressor
|
|
75
|
+
): Promise<string> {
|
|
76
|
+
const sourcePath = this.resolveSourcePath(asset, storageDir);
|
|
77
|
+
if (!existsSync(sourcePath)) {
|
|
78
|
+
throw new Error(`Checkpoint asset blob not found: ${sourcePath}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const blob = await fs.readFile(sourcePath);
|
|
82
|
+
const blobBytes = new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength);
|
|
83
|
+
const expectedBlobHash = asset.blobHash;
|
|
84
|
+
if (this.verifyChecksums && expectedBlobHash && sha256Hex(blobBytes) !== expectedBlobHash) {
|
|
85
|
+
throw new Error(`Checkpoint asset blob checksum mismatch for ${asset.logicalPath}`);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const codec = asset.codec ?? (asset.blobHash ? 'gzip' : 'none');
|
|
89
|
+
const contentBytes = await decompressor.decompress(blobBytes, codec);
|
|
90
|
+
const expectedContentHash = asset.contentHash ?? asset.hash;
|
|
91
|
+
if (this.verifyChecksums && expectedContentHash && sha256Hex(contentBytes) !== expectedContentHash) {
|
|
92
|
+
throw new Error(`Checkpoint asset content checksum mismatch for ${asset.logicalPath}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const cachedFile = await this.writeDecompressedCache(asset, storageDir, contentBytes);
|
|
96
|
+
const safeLogicalPath = normalizeLogicalPath(asset.logicalPath);
|
|
97
|
+
const destinationPath = join(root, safeLogicalPath);
|
|
98
|
+
await fs.mkdir(dirname(destinationPath), { recursive: true });
|
|
99
|
+
await fs.rm(destinationPath, { force: true });
|
|
100
|
+
await this.linkWithFallback(cachedFile, destinationPath);
|
|
101
|
+
|
|
102
|
+
return normalizePath(relative(versionDir, destinationPath));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private async writeDecompressedCache(
|
|
106
|
+
asset: CheckpointAssetRecord,
|
|
107
|
+
storageDir: string,
|
|
108
|
+
bytes: Uint8Array
|
|
109
|
+
): Promise<string> {
|
|
110
|
+
const hash = asset.contentHash ?? asset.hash;
|
|
111
|
+
const extension = extname(asset.logicalPath) || '.bin';
|
|
112
|
+
const cacheFile = join(storageDir, '_assets/cache', `${hash}${extension}`);
|
|
113
|
+
await fs.mkdir(dirname(cacheFile), { recursive: true });
|
|
114
|
+
if (existsSync(cacheFile)) {
|
|
115
|
+
if (!this.verifyChecksums) {
|
|
116
|
+
return cacheFile;
|
|
117
|
+
}
|
|
118
|
+
const existing = await fs.readFile(cacheFile);
|
|
119
|
+
const existingBytes = new Uint8Array(existing.buffer, existing.byteOffset, existing.byteLength);
|
|
120
|
+
if (sha256Hex(existingBytes) === hash) {
|
|
121
|
+
return cacheFile;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
await fs.writeFile(cacheFile, bytes);
|
|
125
|
+
return cacheFile;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
private resolveSourcePath(asset: CheckpointAssetRecord, storageDir: string): string {
|
|
129
|
+
const rawPath = asset.blobPath ?? asset.storedPath;
|
|
130
|
+
if (isAbsolutePathPortable(rawPath)) {
|
|
131
|
+
return rawPath;
|
|
132
|
+
}
|
|
133
|
+
return join(storageDir, rawPath);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private async linkWithFallback(sourcePath: string, destinationPath: string): Promise<void> {
|
|
137
|
+
try {
|
|
138
|
+
await fs.link(sourcePath, destinationPath);
|
|
139
|
+
return;
|
|
140
|
+
} catch {
|
|
141
|
+
// Fall through to symlink/copy.
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
try {
|
|
145
|
+
await fs.symlink(sourcePath, destinationPath);
|
|
146
|
+
return;
|
|
147
|
+
} catch {
|
|
148
|
+
// Fall through to copy.
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
await fs.copyFile(sourcePath, destinationPath);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private async acquireLock(lockPath: string): Promise<void> {
|
|
155
|
+
const deadline = Date.now() + this.lockTimeoutMs;
|
|
156
|
+
while (Date.now() < deadline) {
|
|
157
|
+
try {
|
|
158
|
+
await fs.mkdir(lockPath);
|
|
159
|
+
return;
|
|
160
|
+
} catch (error) {
|
|
161
|
+
if (!isAlreadyExists(error)) {
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
await sleep(DEFAULT_LOCK_POLL_MS);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
throw new Error(`Timed out waiting for checkpoint asset lock: ${lockPath}`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private async isReady(
|
|
172
|
+
markerPath: string,
|
|
173
|
+
fingerprint: string,
|
|
174
|
+
assets: CheckpointAssetRecord[],
|
|
175
|
+
materializedRoot: string
|
|
176
|
+
): Promise<boolean> {
|
|
177
|
+
if (!existsSync(markerPath)) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
const marker = JSON.parse(await fs.readFile(markerPath, 'utf-8')) as MaterializedMarker;
|
|
183
|
+
if (marker.fingerprint !== fingerprint) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
for (const asset of assets) {
|
|
187
|
+
const expectedPath = join(materializedRoot, normalizeLogicalPath(asset.logicalPath));
|
|
188
|
+
if (!existsSync(expectedPath)) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return true;
|
|
193
|
+
} catch {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function normalizePath(path: string): string {
|
|
200
|
+
return path.replace(/\\/g, '/');
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function isAlreadyExists(error: unknown): boolean {
|
|
204
|
+
return (
|
|
205
|
+
typeof error === 'object' && error !== null && 'code' in error && (error as { code?: string }).code === 'EEXIST'
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function sleep(ms: number): Promise<void> {
|
|
210
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
211
|
+
}
|