vector-framework 1.2.1 → 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 +3817 -350
- 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 +3 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +35 -10
- 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/errors/index.cjs +2 -0
- 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 +2657 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -1433
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1301 -77
- 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 +332 -16
- 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 +9 -14
- 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 +51 -11
- 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 +380 -13
- package/src/types/index.ts +83 -30
- package/src/utils/validation.ts +5 -3
package/README.md
CHANGED
|
@@ -29,14 +29,26 @@ Requirements:
|
|
|
29
29
|
import type { VectorConfigSchema } from "vector-framework";
|
|
30
30
|
|
|
31
31
|
const config: VectorConfigSchema = {
|
|
32
|
-
|
|
32
|
+
// number | string: TCP port for Bun.serve (string is coerced with Number() at runtime)
|
|
33
|
+
port: process.env.PORT ?? 3000,
|
|
34
|
+
// string: host/interface to bind
|
|
33
35
|
hostname: "localhost",
|
|
36
|
+
// boolean: enables dev-oriented defaults (OpenAPI JSON on by default)
|
|
34
37
|
development: process.env.NODE_ENV !== "production",
|
|
38
|
+
// string: route discovery directory
|
|
35
39
|
routesDir: "./routes",
|
|
40
|
+
// number (seconds): keep-alive timeout for idle connections
|
|
41
|
+
idleTimeout: 60,
|
|
36
42
|
defaults: {
|
|
37
43
|
route: {
|
|
44
|
+
// boolean: expose route publicly by default
|
|
38
45
|
expose: true,
|
|
46
|
+
// boolean | AuthKind: auth requirement default for routes
|
|
39
47
|
auth: false,
|
|
48
|
+
// boolean: enable schema.input validation by default
|
|
49
|
+
validate: true,
|
|
50
|
+
// boolean: return handler value as-is when true
|
|
51
|
+
rawResponse: false,
|
|
40
52
|
},
|
|
41
53
|
},
|
|
42
54
|
};
|
|
@@ -51,9 +63,9 @@ export default config;
|
|
|
51
63
|
import { route } from "vector-framework";
|
|
52
64
|
|
|
53
65
|
export const hello = route(
|
|
54
|
-
{ method: "GET", path: "/hello
|
|
55
|
-
async (
|
|
56
|
-
return { message:
|
|
66
|
+
{ method: "GET", path: "/hello", expose: true },
|
|
67
|
+
async (ctx) => {
|
|
68
|
+
return { message: "Hello world" };
|
|
57
69
|
},
|
|
58
70
|
);
|
|
59
71
|
```
|
|
@@ -130,8 +142,8 @@ const CreateUserSchema = { input: CreateUserInput };
|
|
|
130
142
|
|
|
131
143
|
export const createUser = route(
|
|
132
144
|
{ method: "POST", path: "/users", expose: true, schema: CreateUserSchema },
|
|
133
|
-
async (
|
|
134
|
-
return { created: true, email:
|
|
145
|
+
async (ctx) => {
|
|
146
|
+
return { created: true, email: ctx.validatedInput.body.email };
|
|
135
147
|
},
|
|
136
148
|
);
|
|
137
149
|
```
|
package/dist/auth/protected.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { DefaultVectorTypes, GetAuthType, ProtectedHandler,
|
|
1
|
+
import type { DefaultVectorTypes, GetAuthType, ProtectedHandler, VectorContext, VectorTypes } from '../types';
|
|
2
2
|
export declare class AuthManager<TTypes extends VectorTypes = DefaultVectorTypes> {
|
|
3
3
|
private protectedHandler;
|
|
4
4
|
setProtectedHandler(handler: ProtectedHandler<TTypes>): void;
|
|
5
5
|
clearProtectedHandler(): void;
|
|
6
|
-
authenticate(
|
|
7
|
-
isAuthenticated(
|
|
8
|
-
getUser(
|
|
6
|
+
authenticate(context: VectorContext<TTypes>): Promise<GetAuthType<TTypes> | null>;
|
|
7
|
+
isAuthenticated(context: VectorContext<TTypes>): boolean;
|
|
8
|
+
getUser(context: VectorContext<TTypes>): GetAuthType<TTypes> | null;
|
|
9
9
|
}
|
|
10
10
|
//# sourceMappingURL=protected.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected.d.ts","sourceRoot":"","sources":["../../src/auth/protected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE9G,qBAAa,WAAW,CAAC,MAAM,SAAS,WAAW,GAAG,kBAAkB;IACtE,OAAO,CAAC,gBAAgB,CAAyC;IAEjE,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC;IAIrD,qBAAqB;IAIf,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"protected.d.ts","sourceRoot":"","sources":["../../src/auth/protected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE9G,qBAAa,WAAW,CAAC,MAAM,SAAS,WAAW,GAAG,kBAAkB;IACtE,OAAO,CAAC,gBAAgB,CAAyC;IAEjE,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC;IAIrD,qBAAqB;IAIf,YAAY,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAiBvF,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO;IAIxD,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;CAGpE"}
|
package/dist/auth/protected.js
CHANGED
|
@@ -6,24 +6,27 @@ export class AuthManager {
|
|
|
6
6
|
clearProtectedHandler() {
|
|
7
7
|
this.protectedHandler = null;
|
|
8
8
|
}
|
|
9
|
-
async authenticate(
|
|
9
|
+
async authenticate(context) {
|
|
10
10
|
if (!this.protectedHandler) {
|
|
11
11
|
throw new Error('Protected handler not configured. Use vector.protected() to set authentication handler.');
|
|
12
12
|
}
|
|
13
|
+
if (!context || typeof context !== 'object' || !context.request) {
|
|
14
|
+
throw new Error('Authentication context is invalid: missing request');
|
|
15
|
+
}
|
|
13
16
|
try {
|
|
14
|
-
const authUser = await this.protectedHandler(
|
|
15
|
-
|
|
17
|
+
const authUser = await this.protectedHandler(context);
|
|
18
|
+
context.authUser = authUser;
|
|
16
19
|
return authUser;
|
|
17
20
|
}
|
|
18
21
|
catch (error) {
|
|
19
22
|
throw new Error(`Authentication failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
20
23
|
}
|
|
21
24
|
}
|
|
22
|
-
isAuthenticated(
|
|
23
|
-
return !!
|
|
25
|
+
isAuthenticated(context) {
|
|
26
|
+
return !!context.authUser;
|
|
24
27
|
}
|
|
25
|
-
getUser(
|
|
26
|
-
return
|
|
28
|
+
getUser(context) {
|
|
29
|
+
return context.authUser || null;
|
|
27
30
|
}
|
|
28
31
|
}
|
|
29
32
|
//# sourceMappingURL=protected.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected.js","sourceRoot":"","sources":["../../src/auth/protected.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACd,gBAAgB,GAAoC,IAAI,CAAC;IAEjE,mBAAmB,CAAC,OAAiC;QACnD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;IAClC,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA8B;QAC/C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;QAC7G,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,eAAe,CAAC,OAA8B;QAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,OAA8B;QACpC,OAAO,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAClC,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"protected.js","sourceRoot":"","sources":["../../src/auth/protected.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IACd,gBAAgB,GAAoC,IAAI,CAAC;IAEjE,mBAAmB,CAAC,OAAiC;QACnD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;IAClC,CAAC;IAED,qBAAqB;QACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA8B;QAC/C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yFAAyF,CAAC,CAAC;QAC7G,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAE,OAAe,CAAC,OAAO,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,eAAe,CAAC,OAA8B;QAC5C,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,OAA8B;QACpC,OAAO,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;IAClC,CAAC;CACF"}
|
package/dist/cache/manager.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export declare class CacheManager<TTypes extends VectorTypes = DefaultVectorType
|
|
|
10
10
|
private getFromMemoryCache;
|
|
11
11
|
private isCacheValid;
|
|
12
12
|
private setInMemoryCache;
|
|
13
|
+
private cloneForStore;
|
|
14
|
+
private cloneCachedValue;
|
|
13
15
|
private scheduleCleanup;
|
|
14
16
|
private cleanupExpired;
|
|
15
17
|
clear(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cache/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAO5F,qBAAa,YAAY,CAAC,MAAM,SAAS,WAAW,GAAG,kBAAkB;IACvE,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAwC;IAExD,eAAe,CAAC,OAAO,EAAE,YAAY;IAIrC,iBAAiB;IAIX,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,GAAG,GAAE,MAAiC,GACrC,OAAO,CAAC,CAAC,CAAC;YAYC,kBAAkB;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/cache/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAO5F,qBAAa,YAAY,CAAC,MAAM,SAAS,WAAW,GAAG,kBAAkB;IACvE,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAwC;IAExD,eAAe,CAAC,OAAO,EAAE,YAAY;IAIrC,iBAAiB;IAIX,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,GAAG,GAAE,MAAiC,GACrC,OAAO,CAAC,CAAC,CAAC;YAYC,kBAAkB;IA4BhC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IActB,KAAK,IAAI,IAAI;IAQP,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAE,MAAiC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAYzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG;QAAE,UAAU,CAAC,EAAE,GAAG,CAAA;KAAE,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,MAAM;CAK3F"}
|
package/dist/cache/manager.js
CHANGED
|
@@ -23,11 +23,12 @@ export class CacheManager {
|
|
|
23
23
|
const now = Date.now();
|
|
24
24
|
const cached = this.memoryCache.get(key);
|
|
25
25
|
if (this.isCacheValid(cached, now)) {
|
|
26
|
-
return cached.value;
|
|
26
|
+
return this.cloneCachedValue(cached.value);
|
|
27
27
|
}
|
|
28
28
|
// Deduplicate concurrent requests for the same key (cache stampede prevention)
|
|
29
29
|
if (this.inflight.has(key)) {
|
|
30
|
-
|
|
30
|
+
const inflightValue = (await this.inflight.get(key));
|
|
31
|
+
return this.cloneCachedValue(inflightValue);
|
|
31
32
|
}
|
|
32
33
|
const promise = (async () => {
|
|
33
34
|
const value = await factory();
|
|
@@ -47,15 +48,31 @@ export class CacheManager {
|
|
|
47
48
|
}
|
|
48
49
|
setInMemoryCache(key, value, ttl) {
|
|
49
50
|
const expires = Date.now() + ttl * 1000;
|
|
50
|
-
this.memoryCache.set(key, { value, expires });
|
|
51
|
+
this.memoryCache.set(key, { value: this.cloneForStore(value), expires });
|
|
51
52
|
this.scheduleCleanup();
|
|
52
53
|
}
|
|
54
|
+
cloneForStore(value) {
|
|
55
|
+
if (value instanceof Response) {
|
|
56
|
+
return value.clone();
|
|
57
|
+
}
|
|
58
|
+
return value;
|
|
59
|
+
}
|
|
60
|
+
cloneCachedValue(value) {
|
|
61
|
+
if (value instanceof Response) {
|
|
62
|
+
return value.clone();
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
53
66
|
scheduleCleanup() {
|
|
54
67
|
if (this.cleanupInterval)
|
|
55
68
|
return;
|
|
56
|
-
|
|
69
|
+
const timer = setInterval(() => {
|
|
57
70
|
this.cleanupExpired();
|
|
58
71
|
}, 60000); // Clean up every minute
|
|
72
|
+
if (typeof timer.unref === 'function') {
|
|
73
|
+
timer.unref();
|
|
74
|
+
}
|
|
75
|
+
this.cleanupInterval = timer;
|
|
59
76
|
}
|
|
60
77
|
cleanupExpired() {
|
|
61
78
|
const now = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/cache/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAQ9C,MAAM,OAAO,YAAY;IACf,YAAY,GAAwB,IAAI,CAAC;IACzC,WAAW,GAA4B,IAAI,GAAG,EAAE,CAAC;IACjD,eAAe,GAAiB,IAAI,CAAC;IACrC,QAAQ,GAA8B,IAAI,GAAG,EAAE,CAAC;IAExD,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;IAC9B,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,OAAyB,EACzB,MAAc,cAAc,CAAC,SAAS;QAEtC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,OAAO,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAe,CAAC;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAI,GAAW,EAAE,OAAyB,EAAE,GAAW;QACrF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,MAAO,CAAC,KAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/cache/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CheckpointCompressionCodec } from '../types';
|
|
2
|
+
export declare const DEFAULT_ASSET_CODEC: CheckpointCompressionCodec;
|
|
3
|
+
export declare function compressBytes(input: Uint8Array, codec?: CheckpointCompressionCodec): Uint8Array;
|
|
4
|
+
export declare function decompressBytes(input: Uint8Array, codec?: CheckpointCompressionCodec): Uint8Array;
|
|
5
|
+
//# sourceMappingURL=compressor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressor.d.ts","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/compressor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAE3D,eAAO,MAAM,mBAAmB,EAAE,0BAAmC,CAAC;AAEtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,GAAE,0BAAgD,GAAG,UAAU,CAUpH;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,KAAK,GAAE,0BAAgD,GACtD,UAAU,CAUZ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const DEFAULT_ASSET_CODEC = 'gzip';
|
|
2
|
+
export function compressBytes(input, codec = DEFAULT_ASSET_CODEC) {
|
|
3
|
+
const normalized = new Uint8Array(input);
|
|
4
|
+
switch (codec) {
|
|
5
|
+
case 'none':
|
|
6
|
+
return normalized;
|
|
7
|
+
case 'gzip':
|
|
8
|
+
return Bun.gzipSync(normalized);
|
|
9
|
+
default:
|
|
10
|
+
throw new Error(`Unsupported compression codec: ${codec}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function decompressBytes(input, codec = DEFAULT_ASSET_CODEC) {
|
|
14
|
+
const normalized = new Uint8Array(input);
|
|
15
|
+
switch (codec) {
|
|
16
|
+
case 'none':
|
|
17
|
+
return normalized;
|
|
18
|
+
case 'gzip':
|
|
19
|
+
return Bun.gunzipSync(normalized);
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unsupported compression codec: ${codec}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=compressor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compressor.js","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/compressor.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAA+B,MAAM,CAAC;AAEtE,MAAM,UAAU,aAAa,CAAC,KAAiB,EAAE,QAAoC,mBAAmB;IACtG,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACzC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAClC;YACE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,QAAoC,mBAAmB;IAEvD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACzC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC;YACE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decompress-worker.d.ts","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/decompress-worker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const worker = globalThis;
|
|
2
|
+
worker.onmessage = (event) => {
|
|
3
|
+
const request = event.data;
|
|
4
|
+
const response = { id: request.id };
|
|
5
|
+
try {
|
|
6
|
+
const input = new Uint8Array(request.input);
|
|
7
|
+
const output = decompressInWorker(input, request.codec);
|
|
8
|
+
const outputBuffer = toArrayBuffer(output);
|
|
9
|
+
response.output = outputBuffer;
|
|
10
|
+
worker.postMessage(response, [outputBuffer]);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
response.error = error instanceof Error ? error.message : String(error);
|
|
14
|
+
worker.postMessage(response);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
function decompressInWorker(input, codec) {
|
|
18
|
+
switch (codec) {
|
|
19
|
+
case 'none':
|
|
20
|
+
return input;
|
|
21
|
+
case 'gzip':
|
|
22
|
+
return Bun.gunzipSync(input);
|
|
23
|
+
default:
|
|
24
|
+
throw new Error(`Unsupported compression codec: ${codec}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function toArrayBuffer(input) {
|
|
28
|
+
return new Uint8Array(input).buffer;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=decompress-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decompress-worker.js","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/decompress-worker.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,GAAG,UAA+B,CAAC;AAE/C,MAAM,CAAC,SAAS,GAAG,CAAC,KAA4C,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAA6B,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC;QAC/B,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF,SAAS,kBAAkB,CACzB,KAA8B,EAC9B,KAAiC;IAEjC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B;YACE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAkC;IACvD,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/hasher.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAKnE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function sha256Hex(content) {
|
|
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
|
+
}
|
|
7
|
+
//# sourceMappingURL=hasher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/hasher.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,OAAiC;IACzD,MAAM,KAAK,GAAG,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAClG,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CheckpointAssetRecord } from '../types';
|
|
2
|
+
export declare function normalizeLogicalPath(input: string): string;
|
|
3
|
+
export declare function normalizeRelativePath(input: string): string;
|
|
4
|
+
export declare function isAbsolutePathPortable(input: string): boolean;
|
|
5
|
+
export declare function computeAssetFingerprint(assets: CheckpointAssetRecord[]): string;
|
|
6
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/manifest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAMtD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG7D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,CAkB/E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { basename, isAbsolute, relative } from 'node:path';
|
|
2
|
+
const UNSAFE_SEGMENT_PATTERN = /[^a-zA-Z0-9._/-]/g;
|
|
3
|
+
const WINDOWS_DRIVE_ABS_PATTERN = /^[a-zA-Z]:[\\/]/;
|
|
4
|
+
const WINDOWS_UNC_ABS_PATTERN = /^\\\\[^\\]+\\[^\\]+/;
|
|
5
|
+
export function normalizeLogicalPath(input) {
|
|
6
|
+
const normalizedInput = normalizeSlashes(input).trim();
|
|
7
|
+
const rel = isAbsolutePathPortable(normalizedInput) ? toPortableRelativePath(normalizedInput) : normalizedInput;
|
|
8
|
+
const cleaned = rel
|
|
9
|
+
.split('/')
|
|
10
|
+
.filter((segment) => segment.length > 0 && segment !== '.' && segment !== '..')
|
|
11
|
+
.join('/');
|
|
12
|
+
const sanitized = cleaned.replace(UNSAFE_SEGMENT_PATTERN, '_').replace(/^\/+/, '');
|
|
13
|
+
if (sanitized.length > 0) {
|
|
14
|
+
return sanitized;
|
|
15
|
+
}
|
|
16
|
+
const fallback = basename(normalizedInput).replace(UNSAFE_SEGMENT_PATTERN, '_');
|
|
17
|
+
return fallback.length > 0 ? `external/${fallback}` : 'external/asset.bin';
|
|
18
|
+
}
|
|
19
|
+
export function normalizeRelativePath(input) {
|
|
20
|
+
return normalizeSlashes(input).replace(/^\/+/, '');
|
|
21
|
+
}
|
|
22
|
+
export function isAbsolutePathPortable(input) {
|
|
23
|
+
const normalized = normalizeSlashes(input).trim();
|
|
24
|
+
return isAbsolute(normalized) || WINDOWS_DRIVE_ABS_PATTERN.test(normalized) || WINDOWS_UNC_ABS_PATTERN.test(input);
|
|
25
|
+
}
|
|
26
|
+
export function computeAssetFingerprint(assets) {
|
|
27
|
+
const stable = assets
|
|
28
|
+
.map((asset) => ({
|
|
29
|
+
type: asset.type,
|
|
30
|
+
logicalPath: asset.logicalPath,
|
|
31
|
+
contentHash: asset.contentHash ?? asset.hash,
|
|
32
|
+
blobHash: asset.blobHash ?? '',
|
|
33
|
+
blobPath: asset.blobPath ?? asset.storedPath,
|
|
34
|
+
codec: asset.codec ?? 'none',
|
|
35
|
+
size: asset.contentSize ?? asset.size,
|
|
36
|
+
}))
|
|
37
|
+
.sort((a, b) => `${a.type}:${a.logicalPath}:${a.contentHash}:${a.blobHash}`.localeCompare(`${b.type}:${b.logicalPath}:${b.contentHash}:${b.blobHash}`));
|
|
38
|
+
return JSON.stringify(stable);
|
|
39
|
+
}
|
|
40
|
+
function normalizeSlashes(value) {
|
|
41
|
+
return value.replace(/\\/g, '/');
|
|
42
|
+
}
|
|
43
|
+
function toPortableRelativePath(input) {
|
|
44
|
+
const normalized = normalizeSlashes(input);
|
|
45
|
+
if (WINDOWS_DRIVE_ABS_PATTERN.test(normalized)) {
|
|
46
|
+
return normalized.replace(/^[a-zA-Z]:/, '').replace(/^\/+/, '');
|
|
47
|
+
}
|
|
48
|
+
if (WINDOWS_UNC_ABS_PATTERN.test(input)) {
|
|
49
|
+
return normalizeSlashes(input)
|
|
50
|
+
.replace(/^\\\\[^\\]+\\[^\\]+/, '')
|
|
51
|
+
.replace(/^\/+/, '');
|
|
52
|
+
}
|
|
53
|
+
return normalizeSlashes(relative(process.cwd(), normalized));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CheckpointManifest } from '../types';
|
|
2
|
+
import type { CheckpointArtifactMaterializerOptions } from './types';
|
|
3
|
+
export declare class CheckpointArtifactMaterializer {
|
|
4
|
+
private verifyChecksums;
|
|
5
|
+
private materializedDirName;
|
|
6
|
+
private lockTimeoutMs;
|
|
7
|
+
constructor(options?: CheckpointArtifactMaterializerOptions);
|
|
8
|
+
materialize(manifest: CheckpointManifest, storageDir: string): Promise<void>;
|
|
9
|
+
private materializeAsset;
|
|
10
|
+
private writeDecompressedCache;
|
|
11
|
+
private resolveSourcePath;
|
|
12
|
+
private linkWithFallback;
|
|
13
|
+
private acquireLock;
|
|
14
|
+
private isReady;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=materializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.d.ts","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/materializer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAG1E,OAAO,KAAK,EAAE,qCAAqC,EAAE,MAAM,SAAS,CAAC;AAYrE,qBAAa,8BAA8B;IACzC,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,GAAE,qCAA0C;IAMzD,WAAW,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAwCpE,gBAAgB;YAoChB,sBAAsB;IAuBpC,OAAO,CAAC,iBAAiB;YAQX,gBAAgB;YAkBhB,WAAW;YAiBX,OAAO;CA0BtB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { existsSync, promises as fs } from 'node:fs';
|
|
2
|
+
import { dirname, extname, join, relative } from 'node:path';
|
|
3
|
+
import { sha256Hex } from './hasher';
|
|
4
|
+
import { computeAssetFingerprint, isAbsolutePathPortable, normalizeLogicalPath } from './manifest';
|
|
5
|
+
import { CheckpointWorkerDecompressor } from './worker-decompressor';
|
|
6
|
+
const DEFAULT_MATERIALIZED_DIR = '_materialized';
|
|
7
|
+
const DEFAULT_LOCK_TIMEOUT_MS = 15_000;
|
|
8
|
+
const DEFAULT_LOCK_POLL_MS = 50;
|
|
9
|
+
export class CheckpointArtifactMaterializer {
|
|
10
|
+
verifyChecksums;
|
|
11
|
+
materializedDirName;
|
|
12
|
+
lockTimeoutMs;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.verifyChecksums = options.verifyChecksums ?? true;
|
|
15
|
+
this.materializedDirName = options.materializedDirName ?? DEFAULT_MATERIALIZED_DIR;
|
|
16
|
+
this.lockTimeoutMs = options.lockTimeoutMs ?? DEFAULT_LOCK_TIMEOUT_MS;
|
|
17
|
+
}
|
|
18
|
+
async materialize(manifest, storageDir) {
|
|
19
|
+
const versionDir = join(storageDir, manifest.version);
|
|
20
|
+
const markerPath = join(versionDir, '.assets.ready.json');
|
|
21
|
+
const lockPath = join(versionDir, '.assets.lock');
|
|
22
|
+
const fingerprint = computeAssetFingerprint(manifest.assets);
|
|
23
|
+
if (await this.isReady(markerPath, fingerprint, manifest.assets, join(versionDir, this.materializedDirName))) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await this.acquireLock(lockPath);
|
|
27
|
+
try {
|
|
28
|
+
if (await this.isReady(markerPath, fingerprint, manifest.assets, join(versionDir, this.materializedDirName))) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const materializedRoot = join(versionDir, this.materializedDirName);
|
|
32
|
+
await fs.rm(materializedRoot, { recursive: true, force: true });
|
|
33
|
+
await fs.mkdir(materializedRoot, { recursive: true });
|
|
34
|
+
const decompressor = new CheckpointWorkerDecompressor();
|
|
35
|
+
try {
|
|
36
|
+
for (const asset of manifest.assets) {
|
|
37
|
+
const result = await this.materializeAsset(asset, storageDir, versionDir, materializedRoot, decompressor);
|
|
38
|
+
asset.materializedPath = result;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await decompressor.dispose();
|
|
43
|
+
}
|
|
44
|
+
const marker = {
|
|
45
|
+
fingerprint,
|
|
46
|
+
createdAt: new Date().toISOString(),
|
|
47
|
+
};
|
|
48
|
+
await fs.writeFile(markerPath, JSON.stringify(marker, null, 2), 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
await fs.rm(lockPath, { recursive: true, force: true });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async materializeAsset(asset, storageDir, versionDir, root, decompressor) {
|
|
55
|
+
const sourcePath = this.resolveSourcePath(asset, storageDir);
|
|
56
|
+
if (!existsSync(sourcePath)) {
|
|
57
|
+
throw new Error(`Checkpoint asset blob not found: ${sourcePath}`);
|
|
58
|
+
}
|
|
59
|
+
const blob = await fs.readFile(sourcePath);
|
|
60
|
+
const blobBytes = new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength);
|
|
61
|
+
const expectedBlobHash = asset.blobHash;
|
|
62
|
+
if (this.verifyChecksums && expectedBlobHash && sha256Hex(blobBytes) !== expectedBlobHash) {
|
|
63
|
+
throw new Error(`Checkpoint asset blob checksum mismatch for ${asset.logicalPath}`);
|
|
64
|
+
}
|
|
65
|
+
const codec = asset.codec ?? (asset.blobHash ? 'gzip' : 'none');
|
|
66
|
+
const contentBytes = await decompressor.decompress(blobBytes, codec);
|
|
67
|
+
const expectedContentHash = asset.contentHash ?? asset.hash;
|
|
68
|
+
if (this.verifyChecksums && expectedContentHash && sha256Hex(contentBytes) !== expectedContentHash) {
|
|
69
|
+
throw new Error(`Checkpoint asset content checksum mismatch for ${asset.logicalPath}`);
|
|
70
|
+
}
|
|
71
|
+
const cachedFile = await this.writeDecompressedCache(asset, storageDir, contentBytes);
|
|
72
|
+
const safeLogicalPath = normalizeLogicalPath(asset.logicalPath);
|
|
73
|
+
const destinationPath = join(root, safeLogicalPath);
|
|
74
|
+
await fs.mkdir(dirname(destinationPath), { recursive: true });
|
|
75
|
+
await fs.rm(destinationPath, { force: true });
|
|
76
|
+
await this.linkWithFallback(cachedFile, destinationPath);
|
|
77
|
+
return normalizePath(relative(versionDir, destinationPath));
|
|
78
|
+
}
|
|
79
|
+
async writeDecompressedCache(asset, storageDir, bytes) {
|
|
80
|
+
const hash = asset.contentHash ?? asset.hash;
|
|
81
|
+
const extension = extname(asset.logicalPath) || '.bin';
|
|
82
|
+
const cacheFile = join(storageDir, '_assets/cache', `${hash}${extension}`);
|
|
83
|
+
await fs.mkdir(dirname(cacheFile), { recursive: true });
|
|
84
|
+
if (existsSync(cacheFile)) {
|
|
85
|
+
if (!this.verifyChecksums) {
|
|
86
|
+
return cacheFile;
|
|
87
|
+
}
|
|
88
|
+
const existing = await fs.readFile(cacheFile);
|
|
89
|
+
const existingBytes = new Uint8Array(existing.buffer, existing.byteOffset, existing.byteLength);
|
|
90
|
+
if (sha256Hex(existingBytes) === hash) {
|
|
91
|
+
return cacheFile;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
await fs.writeFile(cacheFile, bytes);
|
|
95
|
+
return cacheFile;
|
|
96
|
+
}
|
|
97
|
+
resolveSourcePath(asset, storageDir) {
|
|
98
|
+
const rawPath = asset.blobPath ?? asset.storedPath;
|
|
99
|
+
if (isAbsolutePathPortable(rawPath)) {
|
|
100
|
+
return rawPath;
|
|
101
|
+
}
|
|
102
|
+
return join(storageDir, rawPath);
|
|
103
|
+
}
|
|
104
|
+
async linkWithFallback(sourcePath, destinationPath) {
|
|
105
|
+
try {
|
|
106
|
+
await fs.link(sourcePath, destinationPath);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Fall through to symlink/copy.
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
await fs.symlink(sourcePath, destinationPath);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Fall through to copy.
|
|
118
|
+
}
|
|
119
|
+
await fs.copyFile(sourcePath, destinationPath);
|
|
120
|
+
}
|
|
121
|
+
async acquireLock(lockPath) {
|
|
122
|
+
const deadline = Date.now() + this.lockTimeoutMs;
|
|
123
|
+
while (Date.now() < deadline) {
|
|
124
|
+
try {
|
|
125
|
+
await fs.mkdir(lockPath);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (!isAlreadyExists(error)) {
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
await sleep(DEFAULT_LOCK_POLL_MS);
|
|
134
|
+
}
|
|
135
|
+
throw new Error(`Timed out waiting for checkpoint asset lock: ${lockPath}`);
|
|
136
|
+
}
|
|
137
|
+
async isReady(markerPath, fingerprint, assets, materializedRoot) {
|
|
138
|
+
if (!existsSync(markerPath)) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const marker = JSON.parse(await fs.readFile(markerPath, 'utf-8'));
|
|
143
|
+
if (marker.fingerprint !== fingerprint) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
for (const asset of assets) {
|
|
147
|
+
const expectedPath = join(materializedRoot, normalizeLogicalPath(asset.logicalPath));
|
|
148
|
+
if (!existsSync(expectedPath)) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function normalizePath(path) {
|
|
160
|
+
return path.replace(/\\/g, '/');
|
|
161
|
+
}
|
|
162
|
+
function isAlreadyExists(error) {
|
|
163
|
+
return (typeof error === 'object' && error !== null && 'code' in error && error.code === 'EEXIST');
|
|
164
|
+
}
|
|
165
|
+
function sleep(ms) {
|
|
166
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=materializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"materializer.js","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/materializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CheckpointCompressionCodec } from '../types';
|
|
2
|
+
import type { CheckpointArtifactPackageRecord } from './types';
|
|
3
|
+
export declare class CheckpointPackager {
|
|
4
|
+
private storageDir;
|
|
5
|
+
private codec;
|
|
6
|
+
constructor(storageDir: string, codec?: CheckpointCompressionCodec);
|
|
7
|
+
packageVersion(version: string): Promise<CheckpointArtifactPackageRecord>;
|
|
8
|
+
private buildArchiveBytes;
|
|
9
|
+
private buildArchiveWithTar;
|
|
10
|
+
private archiveSuffix;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=packager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packager.d.ts","sourceRoot":"","sources":["../../../src/checkpoint/artifacts/packager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAE3D,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,SAAS,CAAC;AAI/D,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAA6B;gBAE9B,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,0BAAmC;IAKpE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,+BAA+B,CAAC;YAiBjE,iBAAiB;YAsBjB,mBAAmB;IAoBjC,OAAO,CAAC,aAAa;CAGtB"}
|