@selvajs/platform 0.14.3-beta.0 → 0.15.0-beta.1
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/LICENSE +1 -1
- package/dist/auth.d.ts +60 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +12 -0
- package/dist/auth.js.map +1 -0
- package/dist/compute.d.ts +47 -0
- package/dist/compute.d.ts.map +1 -0
- package/dist/compute.js +11 -0
- package/dist/compute.js.map +1 -0
- package/dist/data/interface.d.ts +33 -0
- package/dist/data/interface.d.ts.map +1 -1
- package/dist/definitions/interface.d.ts +10 -0
- package/dist/definitions/interface.d.ts.map +1 -1
- package/dist/definitions/schemas.d.ts +1 -0
- package/dist/definitions/schemas.d.ts.map +1 -1
- package/dist/definitions/schemas.js +3 -0
- package/dist/definitions/schemas.js.map +1 -1
- package/dist/definitions/service.d.ts +62 -0
- package/dist/definitions/service.d.ts.map +1 -0
- package/dist/definitions/service.js +149 -0
- package/dist/definitions/service.js.map +1 -0
- package/dist/definitions/types.d.ts +24 -1
- package/dist/definitions/types.d.ts.map +1 -1
- package/dist/definitions.d.ts +146 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +23 -0
- package/dist/definitions.js.map +1 -0
- package/dist/events/interface.d.ts +23 -0
- package/dist/events/interface.d.ts.map +1 -1
- package/dist/events/interface.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/invites/schemas.d.ts +24 -0
- package/dist/invites/schemas.d.ts.map +1 -0
- package/dist/invites/schemas.js +17 -0
- package/dist/invites/schemas.js.map +1 -0
- package/dist/metrics/interface.d.ts +6 -0
- package/dist/metrics/interface.d.ts.map +1 -1
- package/dist/metrics/interface.js.map +1 -1
- package/dist/organizations.d.ts +93 -0
- package/dist/organizations.d.ts.map +1 -0
- package/dist/organizations.js +14 -0
- package/dist/organizations.js.map +1 -0
- package/dist/solveCache/interface.d.ts +86 -0
- package/dist/solveCache/interface.d.ts.map +1 -0
- package/dist/solveCache/interface.js +12 -0
- package/dist/solveCache/interface.js.map +1 -0
- package/dist/testing/adapterSuite.d.ts +33 -0
- package/dist/testing/adapterSuite.d.ts.map +1 -0
- package/dist/testing/adapterSuite.js +166 -0
- package/dist/testing/adapterSuite.js.map +1 -0
- package/dist/testing/suites/definitionStoreSuite.d.ts.map +1 -1
- package/dist/testing/suites/definitionStoreSuite.js +57 -0
- package/dist/testing/suites/definitionStoreSuite.js.map +1 -1
- package/dist/testing/suites/eventSinkSuite.js +1 -0
- package/dist/testing/suites/eventSinkSuite.js.map +1 -1
- package/dist/testing/suites/platformPermissionStoreSuite.d.ts +9 -0
- package/dist/testing/suites/platformPermissionStoreSuite.d.ts.map +1 -1
- package/dist/testing/suites/platformPermissionStoreSuite.js +34 -1
- package/dist/testing/suites/platformPermissionStoreSuite.js.map +1 -1
- package/dist/testing/suites/runner.d.ts +21 -0
- package/dist/testing/suites/runner.d.ts.map +1 -0
- package/dist/testing/suites/runner.js +7 -0
- package/dist/testing/suites/runner.js.map +1 -0
- package/package.json +9 -24
- package/src/access/index.ts +0 -23
- package/src/access/rules.ts +0 -276
- package/src/auth/index.ts +0 -8
- package/src/auth/interface.ts +0 -279
- package/src/auth/types.ts +0 -32
- package/src/bindings/index.ts +0 -2
- package/src/bindings/interface.ts +0 -61
- package/src/computeServer/index.ts +0 -28
- package/src/computeServer/interface.ts +0 -73
- package/src/computeServer/secrets.ts +0 -102
- package/src/computeServer/types.ts +0 -74
- package/src/computeServer/utils.ts +0 -112
- package/src/config.ts +0 -99
- package/src/context.ts +0 -80
- package/src/data/index.ts +0 -1
- package/src/data/interface.ts +0 -70
- package/src/definitions/index.ts +0 -26
- package/src/definitions/interface.ts +0 -87
- package/src/definitions/paths.ts +0 -31
- package/src/definitions/schemas.ts +0 -64
- package/src/definitions/types.ts +0 -111
- package/src/errors/interface.ts +0 -45
- package/src/errors.ts +0 -16
- package/src/events/audit.ts +0 -67
- package/src/events/index.ts +0 -9
- package/src/events/interface.ts +0 -102
- package/src/index.ts +0 -247
- package/src/invites/index.ts +0 -2
- package/src/invites/interface.ts +0 -38
- package/src/invites/types.ts +0 -39
- package/src/metrics/interface.ts +0 -86
- package/src/organizations/index.ts +0 -23
- package/src/organizations/interface.ts +0 -68
- package/src/organizations/paths.ts +0 -45
- package/src/organizations/schemas.ts +0 -61
- package/src/organizations/types.ts +0 -41
- package/src/pagination.ts +0 -45
- package/src/permissions/index.ts +0 -3
- package/src/permissions/interface.ts +0 -60
- package/src/permissions/types.ts +0 -21
- package/src/platformProjects/index.ts +0 -3
- package/src/platformProjects/interface.ts +0 -27
- package/src/platformProjects/schemas.ts +0 -13
- package/src/platformProjects/types.ts +0 -22
- package/src/projects/index.ts +0 -4
- package/src/projects/interface.ts +0 -58
- package/src/projects/schemas.ts +0 -28
- package/src/projects/types.ts +0 -36
- package/src/shareLinks/index.ts +0 -5
- package/src/shareLinks/interface.ts +0 -35
- package/src/shareLinks/schemas.ts +0 -21
- package/src/shareLinks/types.ts +0 -34
- package/src/storage/assetClasses.ts +0 -134
- package/src/storage/cacheBust.ts +0 -26
- package/src/storage/image.ts +0 -82
- package/src/storage/index.ts +0 -12
- package/src/storage/interface.ts +0 -27
- package/src/testing/index.ts +0 -47
- package/src/testing/suites/authProviderSuite.ts +0 -207
- package/src/testing/suites/computeServerStoreSuite.ts +0 -195
- package/src/testing/suites/definitionStoreSuite.ts +0 -630
- package/src/testing/suites/emailLinkAuthSuite.ts +0 -83
- package/src/testing/suites/eventSinkSuite.ts +0 -379
- package/src/testing/suites/helpers.ts +0 -87
- package/src/testing/suites/inviteStoreSuite.ts +0 -143
- package/src/testing/suites/orgStoreSuite.ts +0 -429
- package/src/testing/suites/platformPermissionStoreSuite.ts +0 -196
- package/src/testing/suites/platformProjectGrantStoreSuite.ts +0 -166
- package/src/testing/suites/projectStoreSuite.ts +0 -381
- package/src/testing/suites/shareLinkStoreSuite.ts +0 -203
- package/src/testing/suites/solveMetricSinkSuite.ts +0 -135
- package/src/testing/suites/storageProviderSuite.ts +0 -196
- package/src/testing/suites/userProfileStoreSuite.ts +0 -134
- package/src/userProfile/index.ts +0 -3
- package/src/userProfile/interface.ts +0 -48
- package/src/userProfile/types.ts +0 -24
- package/src/utils/audit.ts +0 -46
- package/src/utils/index.ts +0 -2
package/LICENSE
CHANGED
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Implement this to plug in any auth backend:
|
|
5
|
+
* - Local HMAC sessions (built-in default)
|
|
6
|
+
* - Firebase Auth
|
|
7
|
+
* - Supabase Auth
|
|
8
|
+
* - AWS Cognito
|
|
9
|
+
* - Any OIDC/JWT provider
|
|
10
|
+
*/
|
|
11
|
+
export type UserRole = 'platform_admin' | 'user';
|
|
12
|
+
export interface AuthUser {
|
|
13
|
+
id: string;
|
|
14
|
+
email?: string;
|
|
15
|
+
displayName?: string;
|
|
16
|
+
role: UserRole;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface IAuthProvider {
|
|
20
|
+
/**
|
|
21
|
+
* Verify a token string — session cookie value, JWT, Firebase ID token, etc.
|
|
22
|
+
* Returns the authenticated user, or null if the token is invalid or expired.
|
|
23
|
+
*/
|
|
24
|
+
verifyToken(token: string): Promise<AuthUser | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Look up a user by their provider-specific ID.
|
|
27
|
+
* Returns null if the user does not exist.
|
|
28
|
+
*/
|
|
29
|
+
getUser(id: string): Promise<AuthUser | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Create a new opaque session token for an authenticated user.
|
|
32
|
+
* Stored in a cookie by the transport layer. Format is provider-specific:
|
|
33
|
+
* HMAC string, signed JWT, Firebase custom token, etc.
|
|
34
|
+
*/
|
|
35
|
+
createSessionToken(user: AuthUser): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Verify login credentials (email + password).
|
|
38
|
+
* Returns the authenticated user, or null if credentials are invalid.
|
|
39
|
+
* Email may be an empty string for password-only auth (no users.json configured).
|
|
40
|
+
*/
|
|
41
|
+
verifyLoginCredentials(email: string, password: string): Promise<AuthUser | null>;
|
|
42
|
+
/**
|
|
43
|
+
* List all users. Returns null if this provider does not support user management
|
|
44
|
+
* (e.g. single-password mode).
|
|
45
|
+
*/
|
|
46
|
+
listUsers(): Promise<AuthUser[] | null>;
|
|
47
|
+
/**
|
|
48
|
+
* Create a new user. Returns null if not supported.
|
|
49
|
+
*/
|
|
50
|
+
createUser(email: string, password: string, role: UserRole): Promise<AuthUser | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Update a user's role. Returns false if not supported or user not found.
|
|
53
|
+
*/
|
|
54
|
+
updateUserRole(id: string, role: UserRole): Promise<boolean>;
|
|
55
|
+
/**
|
|
56
|
+
* Delete a user by ID. Returns false if not supported or user not found.
|
|
57
|
+
*/
|
|
58
|
+
deleteUser(id: string): Promise<boolean>;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,QAAQ,GAAG,gBAAgB,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,aAAa;IAC7B;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAErD;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE9C;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEpD;;;;OAIG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAIlF;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;IAExC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEtF;;OAEG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7D;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Implement this to plug in any auth backend:
|
|
5
|
+
* - Local HMAC sessions (built-in default)
|
|
6
|
+
* - Firebase Auth
|
|
7
|
+
* - Supabase Auth
|
|
8
|
+
* - AWS Cognito
|
|
9
|
+
* - Any OIDC/JWT provider
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute server provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Implement to support:
|
|
5
|
+
* - Single server (built-in default)
|
|
6
|
+
* - Server pool with load balancing
|
|
7
|
+
* - Per-definition routing (e.g. definition A always goes to server B)
|
|
8
|
+
* - Dynamic provisioning
|
|
9
|
+
*/
|
|
10
|
+
export interface ComputeServerConfig {
|
|
11
|
+
/** UUID v4 primary key */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Human-readable display label */
|
|
14
|
+
label: string;
|
|
15
|
+
/** Base URL of the Rhino.Compute instance, e.g. http://localhost:5000 */
|
|
16
|
+
serverUrl: string;
|
|
17
|
+
/** Optional API key sent as RhinoComputeKey header */
|
|
18
|
+
apiKey?: string;
|
|
19
|
+
/** Request timeout in milliseconds. Default: 30000 */
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
/** Number of retries on transient failure. Default: 0 */
|
|
22
|
+
retryCount?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface ComputeConfig {
|
|
25
|
+
servers: ComputeServerConfig[];
|
|
26
|
+
/** UUID of the server to use when no routing rule matches. Falls back to servers[0]. */
|
|
27
|
+
defaultServerId?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SolveRequest {
|
|
30
|
+
/** GUID of the definition being solved — enables per-definition routing */
|
|
31
|
+
definitionGuid?: string;
|
|
32
|
+
/** Arbitrary hints for routing decisions (e.g. required plugin versions) */
|
|
33
|
+
hints?: Record<string, string>;
|
|
34
|
+
}
|
|
35
|
+
export interface IComputeServerProvider {
|
|
36
|
+
/** Resolve which compute server to use for a given solve request. */
|
|
37
|
+
getServer(request?: SolveRequest): Promise<ComputeServerConfig>;
|
|
38
|
+
/** Return the default server, or undefined if none configured. */
|
|
39
|
+
getDefaultServer(): Promise<ComputeServerConfig | undefined>;
|
|
40
|
+
/** Look up a specific server by its UUID. Returns undefined if not found. */
|
|
41
|
+
getServerById(id: string): Promise<ComputeServerConfig | undefined>;
|
|
42
|
+
/** Return the full config. Used by the admin UI. */
|
|
43
|
+
getConfig(): Promise<ComputeConfig>;
|
|
44
|
+
/** Replace the full config atomically. Used by the admin UI. */
|
|
45
|
+
saveConfig(config: ComputeConfig): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=compute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,mBAAmB;IACnC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,wFAAwF;IACxF,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC5B,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAsB;IACtC,qEAAqE;IACrE,SAAS,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAEhE,kEAAkE;IAClE,gBAAgB,IAAI,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAE7D,6EAA6E;IAC7E,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC;IAEpE,oDAAoD;IACpD,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpC,gEAAgE;IAChE,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD"}
|
package/dist/compute.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compute server provider interface.
|
|
3
|
+
*
|
|
4
|
+
* Implement to support:
|
|
5
|
+
* - Single server (built-in default)
|
|
6
|
+
* - Server pool with load balancing
|
|
7
|
+
* - Per-definition routing (e.g. definition A always goes to server B)
|
|
8
|
+
* - Dynamic provisioning
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=compute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute.js","sourceRoot":"","sources":["../src/compute.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/dist/data/interface.d.ts
CHANGED
|
@@ -21,7 +21,21 @@ import type { IInviteStore } from '../invites/interface.js';
|
|
|
21
21
|
import type { IUserProfileStore } from '../userProfile/interface.js';
|
|
22
22
|
import type { IPlatformPermissionStore } from '../permissions/interface.js';
|
|
23
23
|
import type { IAuditQuery } from '../events/audit.js';
|
|
24
|
+
import type { IEventSink } from '../events/interface.js';
|
|
24
25
|
import type { RequestContext } from '../context.js';
|
|
26
|
+
/**
|
|
27
|
+
* Result of the app↔DB schema handshake (audit O3). `expected` is the
|
|
28
|
+
* migration head the running app was built against; `actual` is what the
|
|
29
|
+
* database reports (`null` when the database can't even answer — e.g. the
|
|
30
|
+
* handshake function itself was never migrated in).
|
|
31
|
+
*/
|
|
32
|
+
export interface SchemaVersionReport {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
expected: string;
|
|
35
|
+
actual: string | null;
|
|
36
|
+
/** Operator-facing explanation + recovery hint when not ok. */
|
|
37
|
+
message?: string;
|
|
38
|
+
}
|
|
25
39
|
export interface IDataProvider {
|
|
26
40
|
orgs: IOrgStore;
|
|
27
41
|
projects: IProjectStore;
|
|
@@ -38,6 +52,25 @@ export interface IDataProvider {
|
|
|
38
52
|
* `/admin/audit` UI degrades to its "no backend wired" state.
|
|
39
53
|
*/
|
|
40
54
|
auditQuery?: IAuditQuery;
|
|
55
|
+
/**
|
|
56
|
+
* The write-side event sink this provider's stores emit into. Optional —
|
|
57
|
+
* exposed so app code with no store mutation to piggyback on (e.g. the
|
|
58
|
+
* self-update route, audit O2) can emit domain events into the same log.
|
|
59
|
+
* Callers fall back to `NoopEventSink` when absent.
|
|
60
|
+
*/
|
|
61
|
+
events?: IEventSink;
|
|
62
|
+
/**
|
|
63
|
+
* App↔DB schema handshake (audit O3). Optional — implemented by adapters
|
|
64
|
+
* whose schema is migrated out-of-band (Supabase: `supabase db push` is a
|
|
65
|
+
* manual operator step the app can't run itself). Boot health calls this
|
|
66
|
+
* structurally (same pattern as `IComputeServerStore.verifySecrets`) and
|
|
67
|
+
* drives `/api/health` to 503 when the database is behind the app, so
|
|
68
|
+
* monitoring — and the self-update runner's health probe — catch schema
|
|
69
|
+
* skew instead of surfacing it as per-request store errors.
|
|
70
|
+
*
|
|
71
|
+
* MUST NOT throw: report failure via `ok: false`.
|
|
72
|
+
*/
|
|
73
|
+
verifySchemaVersion?(): Promise<SchemaVersionReport>;
|
|
41
74
|
/**
|
|
42
75
|
* Idempotently register a user in the data layer. Called by `hooks.server.ts`
|
|
43
76
|
* after `verifyToken` succeeds, so the data layer always has a row for the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/data/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,mBAAmB,CAAC;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,WAAW,EAAE,wBAAwB,CAAC;IACtC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD;;;;OAIG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/data/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,EAAE,mBAAmB,CAAC;IACnC,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,eAAe,CAAC;IAC5B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,WAAW,EAAE,wBAAwB,CAAC;IACtC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD;;;;OAIG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAErD;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/D;;;;;;;;;;OAUG;IACH,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE"}
|
|
@@ -32,6 +32,16 @@ export interface IDefinitionStore {
|
|
|
32
32
|
deleteByProject(ctx: RequestContext, projectId: string): Promise<void>;
|
|
33
33
|
/** Atomic +1 on the solve counter. No-op if the record doesn't exist. */
|
|
34
34
|
incrementSolveCount(ctx: RequestContext, guid: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Atomically reserve the next `versionNumber` for a new version: returns the
|
|
37
|
+
* current `nextVersionNumber` and advances the counter by 1 in a single
|
|
38
|
+
* operation (so concurrent uploads never collide on a number/fileKey). The
|
|
39
|
+
* counter is monotonic and NEVER decremented — deleting the latest version
|
|
40
|
+
* does not free its number, so a delete-then-reupload mints a fresh number and
|
|
41
|
+
* fresh `fileKey` instead of overwriting the deleted blob's key. Throws if the
|
|
42
|
+
* definition doesn't exist.
|
|
43
|
+
*/
|
|
44
|
+
reserveNextVersionNumber(ctx: RequestContext, guid: string): Promise<number>;
|
|
35
45
|
createVersion(ctx: RequestContext, version: DefinitionVersion): Promise<void>;
|
|
36
46
|
/** Newest first by `versionNumber`. */
|
|
37
47
|
listVersions(ctx: RequestContext, definitionId: string, opts?: ListOptions): Promise<Page<DefinitionVersion>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/definitions/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7F;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAEhC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACzF,aAAa,CACZ,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE,qBAAqB,GAC1B,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnC;;;;OAIG;IACH,UAAU,CACT,GAAG,EAAE,cAAc,EACnB,IAAI,CAAC,EAAE,qBAAqB,GAAG;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnC,GAAG,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzD;;;;;;OAMG;IACH,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE,yEAAyE;IACzE,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/definitions/interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -54,6 +54,7 @@ export declare const UpdateMetadataInputSchema: z.ZodObject<{
|
|
|
54
54
|
tags: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
|
|
55
55
|
projectId: z.ZodOptional<z.ZodString>;
|
|
56
56
|
computeServerId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
57
|
+
solveCacheLimit: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
57
58
|
status: z.ZodOptional<z.ZodEnum<{
|
|
58
59
|
draft: "draft";
|
|
59
60
|
published: "published";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,QAAoE,CAAC;AAE5F,eAAO,MAAM,UAAU,aAAsD,CAAC;AAE9E,eAAO,MAAM,sBAAsB;;;;EAA6C,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;EAAwB,CAAC;AAE7D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAclC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;EAA4B,CAAC;AAEjE,oDAAoD;AACpD,eAAO,MAAM,2BAA2B;;;;;;;;iBAQtC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,QAAoE,CAAC;AAE5F,eAAO,MAAM,UAAU,aAAsD,CAAC;AAE9E,eAAO,MAAM,sBAAsB;;;;EAA6C,CAAC;AAEjF,eAAO,MAAM,uBAAuB;;;EAAwB,CAAC;AAE7D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;iBAclC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;EAA4B,CAAC;AAEjE,oDAAoD;AACpD,eAAO,MAAM,2BAA2B;;;;;;;;iBAQtC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;iBAYpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,uDAAuD;AACvD,eAAO,MAAM,yBAAyB;;kBAIzB,CAAC"}
|
|
@@ -43,6 +43,9 @@ export const UpdateMetadataInputSchema = z.object({
|
|
|
43
43
|
tags: z.array(z.string().max(64)).max(20).nullable().optional(),
|
|
44
44
|
projectId: GuidSchema.optional(),
|
|
45
45
|
computeServerId: GuidSchema.nullable().optional(),
|
|
46
|
+
// L2 cache quota (R9): 0 = off, N = per-definition entry cap, null = inherit
|
|
47
|
+
// the global default. Bounded so a settings typo can't request a runaway quota.
|
|
48
|
+
solveCacheLimit: z.number().int().min(0).max(100_000).nullable().optional(),
|
|
46
49
|
status: DefinitionStatusSchema.optional()
|
|
47
50
|
});
|
|
48
51
|
/** Body for `POST /api/definitions/[guid]/publish`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/definitions/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { IDataProvider } from '../data/interface.js';
|
|
2
|
+
import type { IStorageProvider } from '../storage/interface.js';
|
|
3
|
+
import type { RequestContext } from '../context.js';
|
|
4
|
+
import type { DefinitionRecord, DefinitionFileExt, DefinitionMeta } from './types.js';
|
|
5
|
+
import type { UpdateMetadataInput } from './schemas.js';
|
|
6
|
+
export interface CreateDefinitionInput {
|
|
7
|
+
guid: string;
|
|
8
|
+
projectId: string;
|
|
9
|
+
ownerId: string;
|
|
10
|
+
fileExt: DefinitionFileExt;
|
|
11
|
+
meta: DefinitionMeta;
|
|
12
|
+
computeServerId?: string;
|
|
13
|
+
maxHistory?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Default age threshold after which a 'pending' record is considered stale.
|
|
17
|
+
* Conservative — covers slow uploads over weak connections.
|
|
18
|
+
*/
|
|
19
|
+
export declare const PENDING_GC_AGE_MS: number;
|
|
20
|
+
/**
|
|
21
|
+
* Orchestrates writes that span IDataProvider + IStorageProvider.
|
|
22
|
+
*
|
|
23
|
+
* Ordering rules (see Phase 4 of the provider refactor):
|
|
24
|
+
*
|
|
25
|
+
* create — metadata-first:
|
|
26
|
+
* 1. Write record with status='pending'
|
|
27
|
+
* 2. Upload blob
|
|
28
|
+
* 3. Flip status to 'ready'
|
|
29
|
+
* If step 2 fails the record stays 'pending' with no blob. List queries
|
|
30
|
+
* filter 'pending' by default, so no consumer sees the half-written state.
|
|
31
|
+
* The janitor (gcStalePending) sweeps records older than PENDING_GC_AGE_MS.
|
|
32
|
+
*
|
|
33
|
+
* updateFile — best-effort with retry-safe shape:
|
|
34
|
+
* 1. Archive current file to history blob
|
|
35
|
+
* 2. Append history entry to record
|
|
36
|
+
* 3. Write new file to the active blob path
|
|
37
|
+
* 4. Prune history beyond maxHistory
|
|
38
|
+
* A failure between 2 and 3 leaves the record pointing at a missing active
|
|
39
|
+
* blob. The operation is idempotent — retrying with the same file restores
|
|
40
|
+
* a consistent state. This is an acknowledged limitation; the create path
|
|
41
|
+
* is where orphan risk is highest and is the one we fully guard.
|
|
42
|
+
*/
|
|
43
|
+
export declare class DefinitionService {
|
|
44
|
+
private data;
|
|
45
|
+
private storage;
|
|
46
|
+
constructor(data: IDataProvider, storage: IStorageProvider);
|
|
47
|
+
create(ctx: RequestContext, input: CreateDefinitionInput, file: Uint8Array): Promise<DefinitionRecord>;
|
|
48
|
+
updateFile(ctx: RequestContext, guid: string, file: Uint8Array, ext: DefinitionFileExt, originalName: string): Promise<void>;
|
|
49
|
+
updateMeta(ctx: RequestContext, guid: string, patch: UpdateMetadataInput): Promise<void>;
|
|
50
|
+
saveCoverImage(ctx: RequestContext, guid: string, imageData: Uint8Array): Promise<void>;
|
|
51
|
+
revertToVersion(ctx: RequestContext, guid: string, ref: string): Promise<void>;
|
|
52
|
+
delete(ctx: RequestContext, guid: string): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Janitor — delete records stuck in 'pending' for longer than ageMs and
|
|
55
|
+
* any blobs they may have written. Safe to run on a schedule.
|
|
56
|
+
* Runs under SYSTEM_CONTEXT; callers don't pass one.
|
|
57
|
+
*
|
|
58
|
+
* @returns Number of records reclaimed.
|
|
59
|
+
*/
|
|
60
|
+
gcStalePending(ageMs?: number): Promise<number>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/definitions/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EACX,gBAAgB,EAEhB,iBAAiB,EACjB,cAAc,EACd,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,iBAAiB;IAE5B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,OAAO;gBADP,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB;IAG5B,MAAM,CACX,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,qBAAqB,EAC5B,IAAI,EAAE,UAAU,GACd,OAAO,CAAC,gBAAgB,CAAC;IAiCtB,UAAU,CACf,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,iBAAiB,EACtB,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAwCV,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYxF,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvF,eAAe,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,GAAE,MAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;CASxE"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { SYSTEM_CONTEXT } from '../context.js';
|
|
2
|
+
import { ProviderError } from '../errors.js';
|
|
3
|
+
import { definitionPaths } from './paths.js';
|
|
4
|
+
/**
|
|
5
|
+
* Default age threshold after which a 'pending' record is considered stale.
|
|
6
|
+
* Conservative — covers slow uploads over weak connections.
|
|
7
|
+
*/
|
|
8
|
+
export const PENDING_GC_AGE_MS = 30 * 60 * 1000; // 30 minutes
|
|
9
|
+
/**
|
|
10
|
+
* Orchestrates writes that span IDataProvider + IStorageProvider.
|
|
11
|
+
*
|
|
12
|
+
* Ordering rules (see Phase 4 of the provider refactor):
|
|
13
|
+
*
|
|
14
|
+
* create — metadata-first:
|
|
15
|
+
* 1. Write record with status='pending'
|
|
16
|
+
* 2. Upload blob
|
|
17
|
+
* 3. Flip status to 'ready'
|
|
18
|
+
* If step 2 fails the record stays 'pending' with no blob. List queries
|
|
19
|
+
* filter 'pending' by default, so no consumer sees the half-written state.
|
|
20
|
+
* The janitor (gcStalePending) sweeps records older than PENDING_GC_AGE_MS.
|
|
21
|
+
*
|
|
22
|
+
* updateFile — best-effort with retry-safe shape:
|
|
23
|
+
* 1. Archive current file to history blob
|
|
24
|
+
* 2. Append history entry to record
|
|
25
|
+
* 3. Write new file to the active blob path
|
|
26
|
+
* 4. Prune history beyond maxHistory
|
|
27
|
+
* A failure between 2 and 3 leaves the record pointing at a missing active
|
|
28
|
+
* blob. The operation is idempotent — retrying with the same file restores
|
|
29
|
+
* a consistent state. This is an acknowledged limitation; the create path
|
|
30
|
+
* is where orphan risk is highest and is the one we fully guard.
|
|
31
|
+
*/
|
|
32
|
+
export class DefinitionService {
|
|
33
|
+
data;
|
|
34
|
+
storage;
|
|
35
|
+
constructor(data, storage) {
|
|
36
|
+
this.data = data;
|
|
37
|
+
this.storage = storage;
|
|
38
|
+
}
|
|
39
|
+
async create(ctx, input, file) {
|
|
40
|
+
const now = new Date().toISOString();
|
|
41
|
+
const record = {
|
|
42
|
+
guid: input.guid,
|
|
43
|
+
projectId: input.projectId,
|
|
44
|
+
ownerId: input.ownerId,
|
|
45
|
+
fileExt: input.fileExt,
|
|
46
|
+
meta: input.meta,
|
|
47
|
+
computeServerId: input.computeServerId,
|
|
48
|
+
history: [],
|
|
49
|
+
maxHistory: input.maxHistory ?? 10,
|
|
50
|
+
status: 'pending',
|
|
51
|
+
runCount: 0,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
updatedAt: now
|
|
54
|
+
};
|
|
55
|
+
// 1. Metadata first — if this fails there's nothing to clean up.
|
|
56
|
+
await this.data.definitions.create(ctx, record);
|
|
57
|
+
// 2. Blob upload — if this fails the record stays 'pending' for the janitor.
|
|
58
|
+
await this.storage.put(definitionPaths.file(input.guid, input.fileExt), file, 'application/octet-stream');
|
|
59
|
+
// 3. Flip to draft — the record is now visible to editors.
|
|
60
|
+
await this.data.definitions.update(ctx, input.guid, { status: 'draft' });
|
|
61
|
+
return { ...record, status: 'draft' };
|
|
62
|
+
}
|
|
63
|
+
async updateFile(ctx, guid, file, ext, originalName) {
|
|
64
|
+
const existing = await this.data.definitions.get(ctx, guid);
|
|
65
|
+
if (!existing)
|
|
66
|
+
throw new ProviderError(`Definition not found: ${guid}`, 404);
|
|
67
|
+
const now = new Date().toISOString();
|
|
68
|
+
// UUID-based ref avoids collisions from identical timestamps or special chars in filenames.
|
|
69
|
+
const ref = `${crypto.randomUUID()}_${originalName.replace(/[^a-zA-Z0-9._-]/g, '_')}`;
|
|
70
|
+
// Archive the current file before overwriting
|
|
71
|
+
const currentFile = await this.storage.get(definitionPaths.file(guid, existing.fileExt));
|
|
72
|
+
if (currentFile) {
|
|
73
|
+
await this.storage.put(definitionPaths.archive(guid, ref), currentFile, 'application/octet-stream');
|
|
74
|
+
await this.data.definitions.addHistoryEntry(ctx, guid, {
|
|
75
|
+
ref,
|
|
76
|
+
originalName,
|
|
77
|
+
archivedAt: now
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
await this.storage.put(definitionPaths.file(guid, ext), file, 'application/octet-stream');
|
|
81
|
+
if (ext !== existing.fileExt) {
|
|
82
|
+
await this.storage.delete(definitionPaths.file(guid, existing.fileExt));
|
|
83
|
+
}
|
|
84
|
+
await this.data.definitions.update(ctx, guid, { fileExt: ext });
|
|
85
|
+
// Prune history if maxHistory is set
|
|
86
|
+
const updated = await this.data.definitions.get(ctx, guid);
|
|
87
|
+
if (updated && updated.maxHistory > 0 && updated.history.length > updated.maxHistory) {
|
|
88
|
+
const toRemove = updated.history.slice(updated.maxHistory);
|
|
89
|
+
for (const entry of toRemove) {
|
|
90
|
+
await this.storage.delete(definitionPaths.archive(guid, entry.ref));
|
|
91
|
+
await this.data.definitions.removeHistoryEntry(ctx, guid, entry.ref);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async updateMeta(ctx, guid, patch) {
|
|
96
|
+
const { maxHistory, projectId, computeServerId, ...metaFields } = patch;
|
|
97
|
+
const meta = Object.keys(metaFields).length > 0 ? metaFields : undefined;
|
|
98
|
+
const recordPatch = {
|
|
99
|
+
...(meta !== undefined && { meta }),
|
|
100
|
+
...(maxHistory !== undefined && { maxHistory }),
|
|
101
|
+
...(projectId !== undefined && { projectId }),
|
|
102
|
+
...(computeServerId !== undefined && { computeServerId })
|
|
103
|
+
};
|
|
104
|
+
await this.data.definitions.update(ctx, guid, recordPatch);
|
|
105
|
+
}
|
|
106
|
+
async saveCoverImage(ctx, guid, imageData) {
|
|
107
|
+
const path = definitionPaths.image(guid);
|
|
108
|
+
await this.storage.put(path, imageData, 'image/webp');
|
|
109
|
+
const url = this.storage.getPublicUrl(path);
|
|
110
|
+
await this.data.definitions.update(ctx, guid, { meta: { coverImage: url } });
|
|
111
|
+
}
|
|
112
|
+
async revertToVersion(ctx, guid, ref) {
|
|
113
|
+
const existing = await this.data.definitions.get(ctx, guid);
|
|
114
|
+
if (!existing)
|
|
115
|
+
throw new ProviderError(`Definition not found: ${guid}`, 404);
|
|
116
|
+
const entry = existing.history.find((h) => h.ref === ref);
|
|
117
|
+
if (!entry)
|
|
118
|
+
throw new ProviderError(`History entry not found: ${ref}`, 404);
|
|
119
|
+
const archived = await this.storage.get(definitionPaths.archive(guid, ref));
|
|
120
|
+
if (!archived)
|
|
121
|
+
throw new ProviderError(`Archived file not found for ref: ${ref}`, 404);
|
|
122
|
+
// Archive the current file first, then restore the old one
|
|
123
|
+
await this.updateFile(ctx, guid, archived, existing.fileExt, entry.originalName);
|
|
124
|
+
}
|
|
125
|
+
async delete(ctx, guid) {
|
|
126
|
+
// Blobs first — if this fails, record remains and retry is safe.
|
|
127
|
+
// If record delete fails after, the record points at nothing; the
|
|
128
|
+
// next get() returns null-payload semantics and the janitor cleans up.
|
|
129
|
+
await this.storage.deletePrefix(definitionPaths.prefix(guid));
|
|
130
|
+
await this.data.definitions.delete(ctx, guid);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Janitor — delete records stuck in 'pending' for longer than ageMs and
|
|
134
|
+
* any blobs they may have written. Safe to run on a schedule.
|
|
135
|
+
* Runs under SYSTEM_CONTEXT; callers don't pass one.
|
|
136
|
+
*
|
|
137
|
+
* @returns Number of records reclaimed.
|
|
138
|
+
*/
|
|
139
|
+
async gcStalePending(ageMs = PENDING_GC_AGE_MS) {
|
|
140
|
+
const cutoff = new Date(Date.now() - ageMs).toISOString();
|
|
141
|
+
const stale = await this.data.definitions.listStalePending(SYSTEM_CONTEXT, cutoff);
|
|
142
|
+
for (const record of stale) {
|
|
143
|
+
await this.storage.deletePrefix(definitionPaths.prefix(record.guid));
|
|
144
|
+
await this.data.definitions.delete(SYSTEM_CONTEXT, record.guid);
|
|
145
|
+
}
|
|
146
|
+
return stale.length;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/definitions/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,11 @@ export type DefinitionStatus = 'pending' | 'draft' | 'published' | 'archived';
|
|
|
24
24
|
export interface DefinitionVersion {
|
|
25
25
|
id: string;
|
|
26
26
|
definitionId: string;
|
|
27
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Monotonic integer starting at 1; NEVER reused — allocated from the parent
|
|
29
|
+
* record's `nextVersionNumber` counter, which only ever advances. Deleting the
|
|
30
|
+
* latest version does not free its number, so `fileKey`s never collide.
|
|
31
|
+
*/
|
|
28
32
|
versionNumber: number;
|
|
29
33
|
fileExt: DefinitionFileExt;
|
|
30
34
|
/** Full storage key. Opaque to callers. */
|
|
@@ -53,6 +57,13 @@ export interface DefinitionRecord {
|
|
|
53
57
|
updatedBy: string;
|
|
54
58
|
/** Falls back to the org default, then the platform default. */
|
|
55
59
|
computeServerId?: string;
|
|
60
|
+
/**
|
|
61
|
+
* Durable L2 solve-cache quota for this definition (H1/R9). Absent = inherit
|
|
62
|
+
* the global default (`SOLVE_CACHE_DEFAULT_MAX_ENTRIES`); `0` = caching off
|
|
63
|
+
* (the non-determinism / wide-input-space escape hatch); `N` = keep at most N
|
|
64
|
+
* cached solves for this definition. One number, one settings input.
|
|
65
|
+
*/
|
|
66
|
+
solveCacheLimit?: number;
|
|
56
67
|
displayName: string;
|
|
57
68
|
description?: string;
|
|
58
69
|
category?: string;
|
|
@@ -61,6 +72,16 @@ export interface DefinitionRecord {
|
|
|
61
72
|
coverImage?: string;
|
|
62
73
|
status: DefinitionStatus;
|
|
63
74
|
solveCount: number;
|
|
75
|
+
/**
|
|
76
|
+
* Monotonic version-number allocator. The next `uploadVersion` reserves this
|
|
77
|
+
* value for the new version's `versionNumber` (and `fileKey`) then advances
|
|
78
|
+
* the counter — it is NEVER decremented, so delete-latest-then-reupload mints
|
|
79
|
+
* a FRESH number and a FRESH `fileKey` rather than reusing the deleted one.
|
|
80
|
+
* Reusing a `fileKey` would let a stale storage blob (or any layer keying on
|
|
81
|
+
* the key) serve the old version's bytes for the new content. Starts at 2
|
|
82
|
+
* after v1 is created.
|
|
83
|
+
*/
|
|
84
|
+
nextVersionNumber: number;
|
|
64
85
|
/**
|
|
65
86
|
* Both null only during the brief `pending` window between metadata create
|
|
66
87
|
* and v1 upload; otherwise both reference live `DefinitionVersion` rows.
|
|
@@ -89,6 +110,8 @@ export interface DefinitionRecordPatch {
|
|
|
89
110
|
coverImage?: string | null;
|
|
90
111
|
projectId?: string;
|
|
91
112
|
computeServerId?: string | null;
|
|
113
|
+
/** L2 cache quota (see {@link DefinitionRecord.solveCacheLimit}); `null` clears to inherit. */
|
|
114
|
+
solveCacheLimit?: number | null;
|
|
92
115
|
status?: DefinitionStatus;
|
|
93
116
|
/** Ownership transfer. */
|
|
94
117
|
ownerId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/definitions/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,KAAK,CAAC;AAE7C,eAAO,MAAM,aAAa,EAAE,MAAM,EAAoB,CAAC;AACvD,eAAO,MAAM,sBAAsB,EAAE,MAAM,EAA+C,CAAC;AAC3F,eAAO,MAAM,yBAAyB,EAAE,MAAM,EAAkD,CAAC;AAEjG,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM5D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAC;AAE9E;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/definitions/types.ts"],"names":[],"mappings":"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"}
|