@soulcraft/sdk 3.1.0 → 3.2.0
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/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/modules/kits/index.d.ts +45 -14
- package/dist/modules/kits/index.d.ts.map +1 -1
- package/dist/modules/kits/index.js +359 -35
- package/dist/modules/kits/index.js.map +1 -1
- package/dist/modules/kits/types.d.ts +133 -38
- package/dist/modules/kits/types.d.ts.map +1 -1
- package/dist/modules/kits/types.js +15 -5
- package/dist/modules/kits/types.js.map +1 -1
- package/dist/venue/index.d.ts +11 -7
- package/dist/venue/index.d.ts.map +1 -1
- package/dist/venue/index.js +11 -7
- package/dist/venue/index.js.map +1 -1
- package/dist/venue/proxy.d.ts +54 -0
- package/dist/venue/proxy.d.ts.map +1 -0
- package/dist/venue/proxy.js +326 -0
- package/dist/venue/proxy.js.map +1 -0
- package/package.json +1 -1
package/dist/client/index.d.ts
CHANGED
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
*/
|
|
33
33
|
export { createSoulcraftProxy } from './namespace-proxy.js';
|
|
34
34
|
export type { NamespaceTransport } from './namespace-proxy.js';
|
|
35
|
+
export { createVenueProxy } from '../venue/proxy.js';
|
|
35
36
|
export { HttpNamespaceTransport, PostMessageNamespaceTransport, HttpRpcTransport, PostMessageRpcTransport, } from '../transports/http-namespace.js';
|
|
36
37
|
export type { HttpNamespaceTransportOptions } from '../transports/http-namespace.js';
|
|
37
38
|
export { WsTransport } from '../transports/ws.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAG9D,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAGpF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAGhE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAChG,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAC5F,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,0BAA0B,CAAA;AAGjC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGpD,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAA;AAGpF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAGhE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAChG,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAC5F,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,qBAAqB,EACrB,WAAW,GACZ,MAAM,0BAA0B,CAAA;AAGjC,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AACpE,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
|
package/dist/client/index.js
CHANGED
|
@@ -32,6 +32,8 @@
|
|
|
32
32
|
*/
|
|
33
33
|
// ── Namespace proxy factory ─────────────────────────────────────────────────
|
|
34
34
|
export { createSoulcraftProxy } from './namespace-proxy.js';
|
|
35
|
+
// ── Venue proxy factory ────────────────────────────────────────────────────
|
|
36
|
+
export { createVenueProxy } from '../venue/proxy.js';
|
|
35
37
|
// ── Namespace-aware transports ──────────────────────────────────────────────
|
|
36
38
|
export { HttpNamespaceTransport, PostMessageNamespaceTransport, HttpRpcTransport, PostMessageRpcTransport, } from '../transports/http-namespace.js';
|
|
37
39
|
// ── Real-time transports ────────────────────────────────────────────────────
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+EAA+E;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG3D,+EAA+E;AAC/E,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AAGxC,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAGjE,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAgChG,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,+EAA+E;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAG3D,8EAA8E;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,+EAA+E;AAC/E,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iCAAiC,CAAA;AAGxC,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,+EAA+E;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAGjE,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAgChG,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,sBAAsB,GACvB,MAAM,6BAA6B,CAAA"}
|
|
@@ -2,38 +2,69 @@
|
|
|
2
2
|
* @module kits
|
|
3
3
|
* @description Factory for sdk.kits.* — the Soulcraft kit registry module.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* package. The package is an optional peer dependency loaded lazily via
|
|
7
|
-
* `createRequire` so that the SDK compiles and runs without it installed;
|
|
8
|
-
* calls gracefully return `null` / empty array when it is absent.
|
|
5
|
+
* Supports two operating modes:
|
|
9
6
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* **Registry mode** (recommended) — fetches kits from the Forge Kit Registry
|
|
8
|
+
* (`forge.soulcraft.com`) over HTTP. Archives (.sck) are downloaded, unpacked
|
|
9
|
+
* to a local disk cache, and served as local filesystem paths. ETag-based
|
|
10
|
+
* revalidation minimizes network traffic. Set `registryUrl` to enable.
|
|
12
11
|
*
|
|
13
|
-
*
|
|
12
|
+
* **Bundled mode** (legacy) — loads kits from the `@soulcraft/kits` npm
|
|
13
|
+
* package via `createRequire()`. This is the backwards-compatible default
|
|
14
|
+
* that products use today. Will be removed once all products migrate to
|
|
15
|
+
* registry mode.
|
|
16
|
+
*
|
|
17
|
+
* The factory returns the same `KitsModule` interface regardless of mode.
|
|
18
|
+
* Callers never need to know which backing store is active.
|
|
19
|
+
*
|
|
20
|
+
* @example Registry mode (production)
|
|
14
21
|
* ```typescript
|
|
15
22
|
* import { createKitsModule } from '@soulcraft/sdk/server'
|
|
16
23
|
*
|
|
24
|
+
* const kits = createKitsModule({
|
|
25
|
+
* registryUrl: process.env.FORGE_REGISTRY_URL, // 'https://forge.soulcraft.com'
|
|
26
|
+
* cachePath: '/home/app/.soulcraft/kits-cache',
|
|
27
|
+
* })
|
|
28
|
+
* const kit = await kits.load('wicks-and-whiskers')
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example Bundled mode (legacy, no registryUrl)
|
|
32
|
+
* ```typescript
|
|
17
33
|
* const kits = createKitsModule()
|
|
18
34
|
* const kit = await kits.load('wicks-and-whiskers')
|
|
19
|
-
* console.log(kit?.name) // "Wicks & Whiskers"
|
|
20
35
|
* ```
|
|
21
36
|
*/
|
|
22
37
|
import type { KitsModule, CreateKitsModuleOptions } from './types.js';
|
|
23
38
|
/**
|
|
24
39
|
* Create the `sdk.kits.*` module.
|
|
25
40
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
41
|
+
* The mode is determined by the options:
|
|
42
|
+
* - `bundledRegistry` set → static in-memory registry (for tests)
|
|
43
|
+
* - `registryUrl` set → HTTP-based registry mode (production)
|
|
44
|
+
* - Neither set → legacy bundled mode via `@soulcraft/kits` package
|
|
28
45
|
*
|
|
29
|
-
* @
|
|
46
|
+
* @param options - Configuration for the kits module.
|
|
47
|
+
* @returns A `KitsModule` instance.
|
|
48
|
+
*
|
|
49
|
+
* @example Registry mode (production)
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const kits = createKitsModule({
|
|
52
|
+
* registryUrl: 'https://forge.soulcraft.com',
|
|
53
|
+
* cachePath: '/home/app/.soulcraft/kits-cache',
|
|
54
|
+
* })
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @example Bundled mode (legacy — no options needed)
|
|
30
58
|
* ```typescript
|
|
31
|
-
* // In production:
|
|
32
59
|
* const kits = createKitsModule()
|
|
60
|
+
* ```
|
|
33
61
|
*
|
|
34
|
-
*
|
|
62
|
+
* @example Test mode — inject mock kits
|
|
63
|
+
* ```typescript
|
|
35
64
|
* const kits = createKitsModule({
|
|
36
|
-
* bundledRegistry: {
|
|
65
|
+
* bundledRegistry: {
|
|
66
|
+
* 'test-kit': { id: 'test-kit', name: 'Test Kit', version: '1.0.0', ... }
|
|
67
|
+
* }
|
|
37
68
|
* })
|
|
38
69
|
* ```
|
|
39
70
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/kits/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/kits/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,OAAO,KAAK,EAEV,UAAU,EACV,uBAAuB,EAExB,MAAM,YAAY,CAAA;AA2YnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,UAAU,CAoBlF"}
|
|
@@ -2,31 +2,51 @@
|
|
|
2
2
|
* @module kits
|
|
3
3
|
* @description Factory for sdk.kits.* — the Soulcraft kit registry module.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* package. The package is an optional peer dependency loaded lazily via
|
|
7
|
-
* `createRequire` so that the SDK compiles and runs without it installed;
|
|
8
|
-
* calls gracefully return `null` / empty array when it is absent.
|
|
5
|
+
* Supports two operating modes:
|
|
9
6
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
7
|
+
* **Registry mode** (recommended) — fetches kits from the Forge Kit Registry
|
|
8
|
+
* (`forge.soulcraft.com`) over HTTP. Archives (.sck) are downloaded, unpacked
|
|
9
|
+
* to a local disk cache, and served as local filesystem paths. ETag-based
|
|
10
|
+
* revalidation minimizes network traffic. Set `registryUrl` to enable.
|
|
12
11
|
*
|
|
13
|
-
*
|
|
12
|
+
* **Bundled mode** (legacy) — loads kits from the `@soulcraft/kits` npm
|
|
13
|
+
* package via `createRequire()`. This is the backwards-compatible default
|
|
14
|
+
* that products use today. Will be removed once all products migrate to
|
|
15
|
+
* registry mode.
|
|
16
|
+
*
|
|
17
|
+
* The factory returns the same `KitsModule` interface regardless of mode.
|
|
18
|
+
* Callers never need to know which backing store is active.
|
|
19
|
+
*
|
|
20
|
+
* @example Registry mode (production)
|
|
14
21
|
* ```typescript
|
|
15
22
|
* import { createKitsModule } from '@soulcraft/sdk/server'
|
|
16
23
|
*
|
|
24
|
+
* const kits = createKitsModule({
|
|
25
|
+
* registryUrl: process.env.FORGE_REGISTRY_URL, // 'https://forge.soulcraft.com'
|
|
26
|
+
* cachePath: '/home/app/.soulcraft/kits-cache',
|
|
27
|
+
* })
|
|
28
|
+
* const kit = await kits.load('wicks-and-whiskers')
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @example Bundled mode (legacy, no registryUrl)
|
|
32
|
+
* ```typescript
|
|
17
33
|
* const kits = createKitsModule()
|
|
18
34
|
* const kit = await kits.load('wicks-and-whiskers')
|
|
19
|
-
* console.log(kit?.name) // "Wicks & Whiskers"
|
|
20
35
|
* ```
|
|
21
36
|
*/
|
|
22
37
|
import { createRequire } from 'node:module';
|
|
23
|
-
|
|
24
|
-
|
|
38
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync, readdirSync } from 'node:fs';
|
|
39
|
+
import { join, resolve } from 'node:path';
|
|
40
|
+
import { homedir } from 'node:os';
|
|
41
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// Bundled mode — load from @soulcraft/kits npm package (legacy)
|
|
43
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
25
44
|
const _require = createRequire(import.meta.url);
|
|
45
|
+
/** Module-level cache — loaded once per process. */
|
|
26
46
|
let _kitsPackage = undefined;
|
|
27
47
|
/**
|
|
28
|
-
* Lazily load the `@soulcraft/kits` optional peer dependency.
|
|
29
|
-
* Returns `null` when the package is not installed
|
|
48
|
+
* @description Lazily load the `@soulcraft/kits` optional peer dependency.
|
|
49
|
+
* Returns `null` when the package is not installed.
|
|
30
50
|
*/
|
|
31
51
|
function _loadKitsPackage() {
|
|
32
52
|
if (_kitsPackage !== undefined)
|
|
@@ -40,36 +60,20 @@ function _loadKitsPackage() {
|
|
|
40
60
|
return _kitsPackage;
|
|
41
61
|
}
|
|
42
62
|
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
63
|
+
* @description Get the bundled registry from the @soulcraft/kits package.
|
|
64
|
+
* @returns The kit registry, or null if the package is absent.
|
|
45
65
|
*/
|
|
46
66
|
function _getBundledRegistry() {
|
|
47
67
|
return _loadKitsPackage()?.kitRegistry ?? null;
|
|
48
68
|
}
|
|
49
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
50
|
-
// Factory
|
|
51
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
69
|
/**
|
|
53
|
-
* Create the
|
|
54
|
-
*
|
|
55
|
-
* @param options - Optional overrides, primarily for testing.
|
|
56
|
-
* @returns A `KitsModule` backed by the `@soulcraft/kits` registry.
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```typescript
|
|
60
|
-
* // In production:
|
|
61
|
-
* const kits = createKitsModule()
|
|
70
|
+
* @description Create a KitsModule backed by the @soulcraft/kits npm package.
|
|
71
|
+
* This is the legacy mode, retained for backwards compatibility.
|
|
62
72
|
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
* bundledRegistry: { 'test-kit': { id: 'test-kit', name: 'Test Kit', ... } }
|
|
66
|
-
* })
|
|
67
|
-
* ```
|
|
73
|
+
* @param getRegistry - Function that returns the bundled registry (or null).
|
|
74
|
+
* @returns A KitsModule that reads from the installed npm package.
|
|
68
75
|
*/
|
|
69
|
-
|
|
70
|
-
const getRegistry = options.bundledRegistry !== undefined
|
|
71
|
-
? () => options.bundledRegistry ?? null
|
|
72
|
-
: _getBundledRegistry;
|
|
76
|
+
function _createBundledKitsModule(getRegistry) {
|
|
73
77
|
return {
|
|
74
78
|
async load(kitId) {
|
|
75
79
|
const registry = getRegistry();
|
|
@@ -103,4 +107,324 @@ export function createKitsModule(options = {}) {
|
|
|
103
107
|
},
|
|
104
108
|
};
|
|
105
109
|
}
|
|
110
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
111
|
+
// Registry mode — fetch from Forge Kit Registry over HTTP
|
|
112
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
113
|
+
/** Default cache freshness: 5 minutes. */
|
|
114
|
+
const DEFAULT_CACHE_TTL_MS = 300_000;
|
|
115
|
+
/** Default local cache directory: ~/.soulcraft/kits-cache */
|
|
116
|
+
const DEFAULT_CACHE_PATH = join(homedir(), '.soulcraft', 'kits-cache');
|
|
117
|
+
/**
|
|
118
|
+
* @description Read the cache metadata file for a kit.
|
|
119
|
+
* @param cachePath - Root cache directory.
|
|
120
|
+
* @param kitId - Kit identifier.
|
|
121
|
+
* @returns Parsed CacheMeta, or null if missing or invalid.
|
|
122
|
+
*/
|
|
123
|
+
function _readCacheMeta(cachePath, kitId) {
|
|
124
|
+
const metaPath = join(cachePath, kitId, '_cache-meta.json');
|
|
125
|
+
if (!existsSync(metaPath))
|
|
126
|
+
return null;
|
|
127
|
+
try {
|
|
128
|
+
return JSON.parse(readFileSync(metaPath, 'utf-8'));
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* @description Write cache metadata for a kit.
|
|
136
|
+
* @param cachePath - Root cache directory.
|
|
137
|
+
* @param kitId - Kit identifier.
|
|
138
|
+
* @param meta - Metadata to persist.
|
|
139
|
+
*/
|
|
140
|
+
function _writeCacheMeta(cachePath, kitId, meta) {
|
|
141
|
+
const metaPath = join(cachePath, kitId, '_cache-meta.json');
|
|
142
|
+
mkdirSync(join(cachePath, kitId), { recursive: true });
|
|
143
|
+
writeFileSync(metaPath, JSON.stringify(meta, null, 2));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* @description Read a cached kit manifest from disk.
|
|
147
|
+
* @param cachePath - Root cache directory.
|
|
148
|
+
* @param kitId - Kit identifier.
|
|
149
|
+
* @returns Parsed manifest, or null if kit.json is missing.
|
|
150
|
+
*/
|
|
151
|
+
function _readCachedManifest(cachePath, kitId) {
|
|
152
|
+
const kitJsonPath = join(cachePath, kitId, 'kit.json');
|
|
153
|
+
if (!existsSync(kitJsonPath))
|
|
154
|
+
return null;
|
|
155
|
+
try {
|
|
156
|
+
return JSON.parse(readFileSync(kitJsonPath, 'utf-8'));
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* @description Unpack a .sck (ZIP) archive buffer to a target directory.
|
|
164
|
+
*
|
|
165
|
+
* Uses dynamic import of `fflate` to avoid adding it as a hard SDK dependency.
|
|
166
|
+
* All Soulcraft products have fflate installed (Venue uses it for .sca archives,
|
|
167
|
+
* the registry uses it for .sck archives). If fflate is unavailable, the unpack
|
|
168
|
+
* fails with an actionable error message.
|
|
169
|
+
*
|
|
170
|
+
* @param buffer - The .sck archive as a Uint8Array.
|
|
171
|
+
* @param targetDir - Directory to extract into.
|
|
172
|
+
*/
|
|
173
|
+
async function _unpackArchive(buffer, targetDir) {
|
|
174
|
+
// Dynamic import avoids a hard dependency on fflate in the SDK package.json.
|
|
175
|
+
// The type assertion is safe because we only call unzipSync which is stable API.
|
|
176
|
+
let unzipSync;
|
|
177
|
+
try {
|
|
178
|
+
const fflate = await Function('return import("fflate")')();
|
|
179
|
+
unzipSync = fflate.unzipSync;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
throw new Error('[sdk.kits] Cannot unpack .sck archive: fflate is not installed. ' +
|
|
183
|
+
'Run: bun add fflate (or npm install fflate)');
|
|
184
|
+
}
|
|
185
|
+
const files = unzipSync(buffer);
|
|
186
|
+
for (const [relPath, content] of Object.entries(files)) {
|
|
187
|
+
const fullPath = join(targetDir, relPath);
|
|
188
|
+
const dir = join(fullPath, '..');
|
|
189
|
+
mkdirSync(dir, { recursive: true });
|
|
190
|
+
writeFileSync(fullPath, content);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* @description Create a KitsModule backed by the Forge Kit Registry.
|
|
195
|
+
*
|
|
196
|
+
* Downloads .sck archives over HTTP, unpacks them to a local disk cache,
|
|
197
|
+
* and serves filesystem paths from the cache. Uses ETag-based revalidation
|
|
198
|
+
* to minimize bandwidth.
|
|
199
|
+
*
|
|
200
|
+
* @param registryUrl - Base URL of the registry (e.g. 'https://forge.soulcraft.com').
|
|
201
|
+
* @param cachePath - Absolute path to the local cache directory.
|
|
202
|
+
* @param cacheTtlMs - Cache freshness duration in milliseconds.
|
|
203
|
+
* @returns A KitsModule that fetches kits from the registry.
|
|
204
|
+
*/
|
|
205
|
+
function _createRegistryKitsModule(registryUrl, cachePath, cacheTtlMs) {
|
|
206
|
+
/** In-memory manifest cache — avoids disk reads on repeated calls. */
|
|
207
|
+
const memCache = new Map();
|
|
208
|
+
/** Strip trailing slash from registry URL for consistent URL building. */
|
|
209
|
+
const baseUrl = registryUrl.replace(/\/+$/, '');
|
|
210
|
+
mkdirSync(cachePath, { recursive: true });
|
|
211
|
+
/**
|
|
212
|
+
* @description Ensure a kit is available in the local cache.
|
|
213
|
+
*
|
|
214
|
+
* Cache flow:
|
|
215
|
+
* 1. Check in-memory cache → if within TTL, return immediately.
|
|
216
|
+
* 2. Check disk cache meta → if within TTL, load manifest from disk.
|
|
217
|
+
* 3. Send HEAD with If-None-Match → if 304, refresh TTL and return cached.
|
|
218
|
+
* 4. GET /api/kits/:id/archive → download, unpack, write cache meta.
|
|
219
|
+
*
|
|
220
|
+
* @param kitId - Kit identifier.
|
|
221
|
+
* @returns CachedKitEntry, or null if the kit doesn't exist.
|
|
222
|
+
*/
|
|
223
|
+
async function ensureCached(kitId) {
|
|
224
|
+
const now = Date.now();
|
|
225
|
+
// 1. In-memory cache hit within TTL
|
|
226
|
+
const mem = memCache.get(kitId);
|
|
227
|
+
if (mem && (now - mem.fetchedAt) < cacheTtlMs) {
|
|
228
|
+
return mem;
|
|
229
|
+
}
|
|
230
|
+
// 2. Disk cache hit within TTL
|
|
231
|
+
const diskMeta = _readCacheMeta(cachePath, kitId);
|
|
232
|
+
if (diskMeta && (now - new Date(diskMeta.fetchedAt).getTime()) < cacheTtlMs) {
|
|
233
|
+
const manifest = _readCachedManifest(cachePath, kitId);
|
|
234
|
+
if (manifest) {
|
|
235
|
+
const entry = {
|
|
236
|
+
manifest,
|
|
237
|
+
etag: diskMeta.etag,
|
|
238
|
+
localPath: join(cachePath, kitId),
|
|
239
|
+
fetchedAt: new Date(diskMeta.fetchedAt).getTime()
|
|
240
|
+
};
|
|
241
|
+
memCache.set(kitId, entry);
|
|
242
|
+
return entry;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// 3. Revalidate with ETag (conditional GET on archive endpoint)
|
|
246
|
+
const existingEtag = diskMeta?.etag || mem?.etag || null;
|
|
247
|
+
try {
|
|
248
|
+
const archiveUrl = `${baseUrl}/api/kits/${encodeURIComponent(kitId)}/archive`;
|
|
249
|
+
const headers = {};
|
|
250
|
+
if (existingEtag) {
|
|
251
|
+
headers['If-None-Match'] = existingEtag;
|
|
252
|
+
}
|
|
253
|
+
const response = await fetch(archiveUrl, { headers });
|
|
254
|
+
// 304 Not Modified — cache is still valid
|
|
255
|
+
if (response.status === 304) {
|
|
256
|
+
const manifest = _readCachedManifest(cachePath, kitId) || mem?.manifest || null;
|
|
257
|
+
if (manifest) {
|
|
258
|
+
const entry = {
|
|
259
|
+
manifest,
|
|
260
|
+
etag: existingEtag,
|
|
261
|
+
localPath: join(cachePath, kitId),
|
|
262
|
+
fetchedAt: now
|
|
263
|
+
};
|
|
264
|
+
memCache.set(kitId, entry);
|
|
265
|
+
_writeCacheMeta(cachePath, kitId, {
|
|
266
|
+
etag: existingEtag,
|
|
267
|
+
fetchedAt: new Date(now).toISOString(),
|
|
268
|
+
version: manifest.version
|
|
269
|
+
});
|
|
270
|
+
return entry;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// 404 — kit doesn't exist
|
|
274
|
+
if (response.status === 404) {
|
|
275
|
+
memCache.delete(kitId);
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
// 200 — download and unpack
|
|
279
|
+
if (response.ok) {
|
|
280
|
+
const buffer = new Uint8Array(await response.arrayBuffer());
|
|
281
|
+
const etag = response.headers.get('etag');
|
|
282
|
+
const kitDir = join(cachePath, kitId);
|
|
283
|
+
// Clear existing cache for this kit (preserve _cache-meta.json)
|
|
284
|
+
if (existsSync(kitDir)) {
|
|
285
|
+
rmSync(kitDir, { recursive: true, force: true });
|
|
286
|
+
}
|
|
287
|
+
await _unpackArchive(buffer, kitDir);
|
|
288
|
+
const manifest = _readCachedManifest(cachePath, kitId);
|
|
289
|
+
if (!manifest) {
|
|
290
|
+
console.error(`[sdk.kits] Downloaded archive for "${kitId}" has no kit.json`);
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
const entry = {
|
|
294
|
+
manifest,
|
|
295
|
+
etag,
|
|
296
|
+
localPath: kitDir,
|
|
297
|
+
fetchedAt: now
|
|
298
|
+
};
|
|
299
|
+
memCache.set(kitId, entry);
|
|
300
|
+
_writeCacheMeta(cachePath, kitId, {
|
|
301
|
+
etag,
|
|
302
|
+
fetchedAt: new Date(now).toISOString(),
|
|
303
|
+
version: manifest.version
|
|
304
|
+
});
|
|
305
|
+
return entry;
|
|
306
|
+
}
|
|
307
|
+
// Other errors — log and fall through to cached data
|
|
308
|
+
console.error(`[sdk.kits] Registry returned ${response.status} for "${kitId}"`);
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
// Network error — use stale cache if available
|
|
312
|
+
console.error(`[sdk.kits] Failed to reach registry for "${kitId}":`, err);
|
|
313
|
+
}
|
|
314
|
+
// Stale cache fallback — return whatever we have
|
|
315
|
+
if (mem)
|
|
316
|
+
return mem;
|
|
317
|
+
const manifest = _readCachedManifest(cachePath, kitId);
|
|
318
|
+
if (manifest) {
|
|
319
|
+
const entry = {
|
|
320
|
+
manifest,
|
|
321
|
+
etag: diskMeta?.etag ?? null,
|
|
322
|
+
localPath: join(cachePath, kitId),
|
|
323
|
+
fetchedAt: diskMeta ? new Date(diskMeta.fetchedAt).getTime() : 0
|
|
324
|
+
};
|
|
325
|
+
memCache.set(kitId, entry);
|
|
326
|
+
return entry;
|
|
327
|
+
}
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
async load(kitId) {
|
|
332
|
+
const entry = await ensureCached(kitId);
|
|
333
|
+
return entry?.manifest ?? null;
|
|
334
|
+
},
|
|
335
|
+
async list() {
|
|
336
|
+
try {
|
|
337
|
+
const response = await fetch(`${baseUrl}/api/kits`);
|
|
338
|
+
if (!response.ok)
|
|
339
|
+
return [];
|
|
340
|
+
const data = await response.json();
|
|
341
|
+
return data.kits ?? [];
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// Offline fallback — read manifests from all cached kit directories
|
|
345
|
+
if (!existsSync(cachePath))
|
|
346
|
+
return [];
|
|
347
|
+
const dirs = readdirSync(cachePath, { withFileTypes: true })
|
|
348
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.') && !d.name.startsWith('_'));
|
|
349
|
+
const results = [];
|
|
350
|
+
for (const dir of dirs) {
|
|
351
|
+
const manifest = _readCachedManifest(cachePath, dir.name);
|
|
352
|
+
if (manifest)
|
|
353
|
+
results.push(manifest);
|
|
354
|
+
}
|
|
355
|
+
return results;
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
async resolveFilesPath(kitId, product) {
|
|
359
|
+
const entry = await ensureCached(kitId);
|
|
360
|
+
if (!entry)
|
|
361
|
+
return null;
|
|
362
|
+
const filesDir = join(entry.localPath, product, 'files');
|
|
363
|
+
return existsSync(filesDir) ? filesDir : null;
|
|
364
|
+
},
|
|
365
|
+
async resolveSkillsPath(kitId) {
|
|
366
|
+
const entry = await ensureCached(kitId);
|
|
367
|
+
if (!entry)
|
|
368
|
+
return null;
|
|
369
|
+
const skillsDir = join(entry.localPath, 'skills');
|
|
370
|
+
return existsSync(skillsDir) ? skillsDir : null;
|
|
371
|
+
},
|
|
372
|
+
async resolveKitsRoot() {
|
|
373
|
+
return cachePath;
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
378
|
+
// Public factory
|
|
379
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
380
|
+
/**
|
|
381
|
+
* Create the `sdk.kits.*` module.
|
|
382
|
+
*
|
|
383
|
+
* The mode is determined by the options:
|
|
384
|
+
* - `bundledRegistry` set → static in-memory registry (for tests)
|
|
385
|
+
* - `registryUrl` set → HTTP-based registry mode (production)
|
|
386
|
+
* - Neither set → legacy bundled mode via `@soulcraft/kits` package
|
|
387
|
+
*
|
|
388
|
+
* @param options - Configuration for the kits module.
|
|
389
|
+
* @returns A `KitsModule` instance.
|
|
390
|
+
*
|
|
391
|
+
* @example Registry mode (production)
|
|
392
|
+
* ```typescript
|
|
393
|
+
* const kits = createKitsModule({
|
|
394
|
+
* registryUrl: 'https://forge.soulcraft.com',
|
|
395
|
+
* cachePath: '/home/app/.soulcraft/kits-cache',
|
|
396
|
+
* })
|
|
397
|
+
* ```
|
|
398
|
+
*
|
|
399
|
+
* @example Bundled mode (legacy — no options needed)
|
|
400
|
+
* ```typescript
|
|
401
|
+
* const kits = createKitsModule()
|
|
402
|
+
* ```
|
|
403
|
+
*
|
|
404
|
+
* @example Test mode — inject mock kits
|
|
405
|
+
* ```typescript
|
|
406
|
+
* const kits = createKitsModule({
|
|
407
|
+
* bundledRegistry: {
|
|
408
|
+
* 'test-kit': { id: 'test-kit', name: 'Test Kit', version: '1.0.0', ... }
|
|
409
|
+
* }
|
|
410
|
+
* })
|
|
411
|
+
* ```
|
|
412
|
+
*/
|
|
413
|
+
export function createKitsModule(options = {}) {
|
|
414
|
+
// Test mode — static in-memory registry takes highest precedence
|
|
415
|
+
if (options.bundledRegistry !== undefined) {
|
|
416
|
+
const getRegistry = () => options.bundledRegistry ?? null;
|
|
417
|
+
return _createBundledKitsModule(getRegistry);
|
|
418
|
+
}
|
|
419
|
+
// Registry mode — fetch from Forge Kit Registry over HTTP
|
|
420
|
+
if (options.registryUrl) {
|
|
421
|
+
const cachePath = options.cachePath
|
|
422
|
+
? resolve(options.cachePath)
|
|
423
|
+
: DEFAULT_CACHE_PATH;
|
|
424
|
+
const cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
425
|
+
return _createRegistryKitsModule(options.registryUrl, cachePath, cacheTtlMs);
|
|
426
|
+
}
|
|
427
|
+
// Bundled mode (legacy) — load from @soulcraft/kits npm package
|
|
428
|
+
return _createBundledKitsModule(_getBundledRegistry);
|
|
429
|
+
}
|
|
106
430
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/kits/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/kits/index.ts"],"names":[],"mappings":"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"}
|