@selvajs/server 2.0.0-beta.20 → 2.0.0-beta.22
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/api/deps.d.ts +13 -1
- package/dist/api/deps.d.ts.map +1 -1
- package/dist/api/deps.js +2 -1
- package/dist/api/deps.js.map +1 -1
- package/dist/compute/index.d.ts +1 -1
- package/dist/compute/index.d.ts.map +1 -1
- package/dist/compute/index.js +1 -1
- package/dist/compute/index.js.map +1 -1
- package/dist/compute/resolve-server.d.ts +20 -0
- package/dist/compute/resolve-server.d.ts.map +1 -1
- package/dist/compute/resolve-server.js +53 -0
- package/dist/compute/resolve-server.js.map +1 -1
- package/dist/config/settings.d.ts.map +1 -1
- package/dist/config/settings.js +80 -50
- package/dist/config/settings.js.map +1 -1
- package/dist/definitions/load-for-render.d.ts.map +1 -1
- package/dist/definitions/load-for-render.js +15 -10
- package/dist/definitions/load-for-render.js.map +1 -1
- package/dist/handlers/apiTokens.d.ts +3 -0
- package/dist/handlers/apiTokens.d.ts.map +1 -1
- package/dist/handlers/apiTokens.js +7 -1
- package/dist/handlers/apiTokens.js.map +1 -1
- package/dist/handlers/oauthConsent.d.ts.map +1 -1
- package/dist/handlers/oauthConsent.js +1 -0
- package/dist/handlers/oauthConsent.js.map +1 -1
- package/dist/handlers/orgCompute.d.ts.map +1 -1
- package/dist/handlers/orgCompute.js +1 -0
- package/dist/handlers/orgCompute.js.map +1 -1
- package/dist/handlers/orgMembers.js +1 -1
- package/dist/handlers/orgMembers.js.map +1 -1
- package/dist/handlers/services.d.ts +1 -1
- package/dist/handlers/services.d.ts.map +1 -1
- package/dist/handlers/services.js.map +1 -1
- package/dist/http/api-token.d.ts +31 -0
- package/dist/http/api-token.d.ts.map +1 -1
- package/dist/http/api-token.js +62 -1
- package/dist/http/api-token.js.map +1 -1
- package/dist/http/index.d.ts +3 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +3 -1
- package/dist/http/index.js.map +1 -1
- package/dist/http/request-memo.d.ts +16 -0
- package/dist/http/request-memo.d.ts.map +1 -0
- package/dist/http/request-memo.js +27 -0
- package/dist/http/request-memo.js.map +1 -0
- package/dist/http/session-resolver.d.ts +48 -0
- package/dist/http/session-resolver.d.ts.map +1 -0
- package/dist/http/session-resolver.js +137 -0
- package/dist/http/session-resolver.js.map +1 -0
- package/dist/testing/harness.d.ts +1 -1
- package/dist/testing/harness.d.ts.map +1 -1
- package/dist/testing/harness.js +2 -1
- package/dist/testing/harness.js.map +1 -1
- package/package.json +4 -4
package/dist/api/deps.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ import type { OrgAssetService } from '../organizations/org-asset-service.js';
|
|
|
16
16
|
import type { TokenCodec } from '../tokens/token-codec.js';
|
|
17
17
|
import type { ApiTokenCodec } from '../tokens/api-token-codec.js';
|
|
18
18
|
import type { ApiTokenHolderPolicy } from '../tokens/api-token-holder.js';
|
|
19
|
+
import type { ApiTokenResolutionCache } from '../http/api-token.js';
|
|
19
20
|
import type { ApiRateLimiter } from './rate-limit.js';
|
|
20
21
|
import type { ApiIdempotencyStore } from './idempotency.js';
|
|
21
22
|
import type { IAuthProvider, IDataProvider, IEventSink, INotificationProvider, IStorageProvider, SelvaConfig, SelvaFlags } from '@selvajs/platform';
|
|
@@ -73,6 +74,11 @@ export interface SelvaDeps {
|
|
|
73
74
|
mayHoldApiTokens?: ApiTokenHolderPolicy;
|
|
74
75
|
/** How long one sign-in lasts before minting needs a new one (`resolveSignInMaxAgeMs`). Absent: no limit. */
|
|
75
76
|
signInMaxAgeMs?: number;
|
|
77
|
+
/**
|
|
78
|
+
* The cache the host hands `resolveApiToken`, so a revoke through these handlers drops
|
|
79
|
+
* the key from it at once. Absent: nothing to drop.
|
|
80
|
+
*/
|
|
81
|
+
resolutionCache?: ApiTokenResolutionCache;
|
|
76
82
|
};
|
|
77
83
|
/**
|
|
78
84
|
* Upload caps, in bytes.
|
|
@@ -128,6 +134,11 @@ export interface SelvaDeps {
|
|
|
128
134
|
* and the handler must not have to know which kind of host it is running on.
|
|
129
135
|
*/
|
|
130
136
|
evictComputeClient: (id: string) => void;
|
|
137
|
+
/**
|
|
138
|
+
* Called after every compute-config save, so a host remembering resolved servers
|
|
139
|
+
* (`createServerResolver`) reads the config again. Defaults to a no-op.
|
|
140
|
+
*/
|
|
141
|
+
onComputeConfigSaved: () => void;
|
|
131
142
|
/**
|
|
132
143
|
* Composed services the host supplies.
|
|
133
144
|
*
|
|
@@ -151,10 +162,11 @@ export interface SelvaDeps {
|
|
|
151
162
|
* `tokens` arrives in an options object rather than as a third positional, so
|
|
152
163
|
* the two composed bags cannot be swapped at a call site.
|
|
153
164
|
*/
|
|
154
|
-
export declare function depsFromConfig(config: SelvaConfig, services?: SelvaDeps['services'], { tokens, uploadLimits, evictComputeClient, notifications, instanceName, apiTokenSettingsPath, apiRateLimiter, projectCreateLimiter, idempotency }?: {
|
|
165
|
+
export declare function depsFromConfig(config: SelvaConfig, services?: SelvaDeps['services'], { tokens, uploadLimits, evictComputeClient, onComputeConfigSaved, notifications, instanceName, apiTokenSettingsPath, apiRateLimiter, projectCreateLimiter, idempotency }?: {
|
|
155
166
|
tokens?: SelvaDeps['tokens'];
|
|
156
167
|
uploadLimits?: Partial<SelvaDeps['uploadLimits']>;
|
|
157
168
|
evictComputeClient?: SelvaDeps['evictComputeClient'];
|
|
169
|
+
onComputeConfigSaved?: SelvaDeps['onComputeConfigSaved'];
|
|
158
170
|
notifications?: INotificationProvider;
|
|
159
171
|
instanceName?: string;
|
|
160
172
|
apiTokenSettingsPath?: string;
|
package/dist/api/deps.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/api/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,uEAAuE;IACvE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,0DAA0D;IAC1D,cAAc,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C,aAAa,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC9C,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC1C,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACxC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IAClC,WAAW,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC1C,qBAAqB,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;IAC9D;;;;;;;OAOG;IACH,MAAM,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,UAAU,KAAK,OAAO,CAAC;IAC1C;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE;QACP,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,OAAO,CAAC,EAAE,UAAU,CAAC;QACrB,gEAAgE;QAChE,SAAS,CAAC,EAAE,aAAa,CAAC;QAC1B,4FAA4F;QAC5F,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;QACxC,6GAA6G;QAC7G,cAAc,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/api/deps.ts"],"names":[],"mappings":"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"}
|
package/dist/api/deps.js
CHANGED
|
@@ -21,7 +21,7 @@ import { isFlagEnabled, NoopEventSink } from '@selvajs/platform';
|
|
|
21
21
|
* `tokens` arrives in an options object rather than as a third positional, so
|
|
22
22
|
* the two composed bags cannot be swapped at a call site.
|
|
23
23
|
*/
|
|
24
|
-
export function depsFromConfig(config, services = {}, { tokens = {}, uploadLimits, evictComputeClient = () => { }, notifications, instanceName = 'Selva', apiTokenSettingsPath = '/settings/tokens', apiRateLimiter, projectCreateLimiter, idempotency } = {}) {
|
|
24
|
+
export function depsFromConfig(config, services = {}, { tokens = {}, uploadLimits, evictComputeClient = () => { }, onComputeConfigSaved = () => { }, notifications, instanceName = 'Selva', apiTokenSettingsPath = '/settings/tokens', apiRateLimiter, projectCreateLimiter, idempotency } = {}) {
|
|
25
25
|
const { data } = config;
|
|
26
26
|
return {
|
|
27
27
|
auth: config.auth,
|
|
@@ -47,6 +47,7 @@ export function depsFromConfig(config, services = {}, { tokens = {}, uploadLimit
|
|
|
47
47
|
maxImageFileSize: uploadLimits?.maxImageFileSize ?? 10 * 1024 * 1024
|
|
48
48
|
},
|
|
49
49
|
evictComputeClient,
|
|
50
|
+
onComputeConfigSaved,
|
|
50
51
|
notifications,
|
|
51
52
|
instanceName,
|
|
52
53
|
apiTokenSettingsPath,
|
package/dist/api/deps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/api/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/api/deps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAyJjE;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC7B,MAAmB,EACnB,WAAkC,EAAE,EACpC,EACC,MAAM,GAAG,EAAE,EACX,YAAY,EACZ,kBAAkB,GAAG,GAAG,EAAE,GAAE,CAAC,EAC7B,oBAAoB,GAAG,GAAG,EAAE,GAAE,CAAC,EAC/B,aAAa,EACb,YAAY,GAAG,OAAO,EACtB,oBAAoB,GAAG,kBAAkB,EACzC,cAAc,EACd,oBAAoB,EACpB,WAAW,KAYR,EAAE;IAEN,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACxB,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,cAAc,EAAE,IAAI,CAAC,WAAW;QAChC,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,aAAa,EAAE;QAC5C,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC;QAC3C,MAAM;QACN,qEAAqE;QACrE,sEAAsE;QACtE,sEAAsE;QACtE,YAAY,EAAE;YACb,qBAAqB,EAAE,YAAY,EAAE,qBAAqB,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;YAC9E,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;SACpE;QACD,kBAAkB;QAClB,oBAAoB;QACpB,aAAa;QACb,YAAY;QACZ,oBAAoB;QACpB,cAAc;QACd,oBAAoB;QACpB,WAAW;QACX,QAAQ;KACR,CAAC;AACH,CAAC"}
|
package/dist/compute/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ export { createComputeRateLimiter, DEFAULT_MAX_KEYS, type ComputeRateLimiter, ty
|
|
|
3
3
|
export { createIdempotencyStore, DEFAULT_IDEMPOTENCY_MAX_KEYS, type IdempotencyStore, type IdempotencyStoreConfig, type IdempotencyOutcome } from './idempotency.js';
|
|
4
4
|
export { isSafeRemoteDefinitionUrl, assertSafeRemoteDefinitionUrl, isLinkLocalUrl } from './safe-url.js';
|
|
5
5
|
export { createRemoteDefinitionFetcher, readBodyWithCap, type RemoteDefinitionFetcher, type RemoteDefinitionConfig } from './remote-definition.js';
|
|
6
|
-
export { resolveServerForOrg } from './resolve-server.js';
|
|
6
|
+
export { createServerResolver, resolveServerForOrg, type ServerResolver } from './resolve-server.js';
|
|
7
7
|
export { ComputeServerUnconfiguredError } from './errors.js';
|
|
8
8
|
export { evictChangedServers, type ServerConnection } from './evict-changed-servers.js';
|
|
9
9
|
export { assertStoredKeysReadable, validateIncomingServers, resolveApiKey, storedKeysById, type IncomingServerBase } from './server-config-write.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,yBAAyB,EACzB,6BAA6B,EAC7B,cAAc,EACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACN,6BAA6B,EAC7B,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAChB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,eAAe,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,yBAAyB,EACzB,6BAA6B,EAC7B,cAAc,EACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACN,6BAA6B,EAC7B,eAAe,EACf,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EACnB,KAAK,cAAc,EACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACxF,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,cAAc,EACd,KAAK,kBAAkB,EACvB,MAAM,0BAA0B,CAAC"}
|
package/dist/compute/index.js
CHANGED
|
@@ -13,7 +13,7 @@ export { createComputeRateLimiter, DEFAULT_MAX_KEYS } from './rate-limit.js';
|
|
|
13
13
|
export { createIdempotencyStore, DEFAULT_IDEMPOTENCY_MAX_KEYS } from './idempotency.js';
|
|
14
14
|
export { isSafeRemoteDefinitionUrl, assertSafeRemoteDefinitionUrl, isLinkLocalUrl } from './safe-url.js';
|
|
15
15
|
export { createRemoteDefinitionFetcher, readBodyWithCap } from './remote-definition.js';
|
|
16
|
-
export { resolveServerForOrg } from './resolve-server.js';
|
|
16
|
+
export { createServerResolver, resolveServerForOrg } from './resolve-server.js';
|
|
17
17
|
export { ComputeServerUnconfiguredError } from './errors.js';
|
|
18
18
|
export { evictChangedServers } from './evict-changed-servers.js';
|
|
19
19
|
export { assertStoredKeysReadable, validateIncomingServers, resolveApiKey, storedKeysById } from './server-config-write.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,kGAAkG;AAClG,mGAAmG;AACnG,oBAAoB;AACpB,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,8FAA8F;AAC9F,qCAAqC;AAErC,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EAGR,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAIhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAI5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,yBAAyB,EACzB,6BAA6B,EAC7B,cAAc,EACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACN,6BAA6B,EAC7B,eAAe,EAGf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compute/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,kGAAkG;AAClG,mGAAmG;AACnG,oBAAoB;AACpB,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,8FAA8F;AAC9F,qCAAqC;AAErC,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,kBAAkB,EAClB,QAAQ,EAGR,MAAM,aAAa,CAAC;AAErB,OAAO,EACN,wBAAwB,EACxB,gBAAgB,EAIhB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,sBAAsB,EACtB,4BAA4B,EAI5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACN,yBAAyB,EACzB,6BAA6B,EAC7B,cAAc,EACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EACN,6BAA6B,EAC7B,eAAe,EAGf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACN,oBAAoB,EACpB,mBAAmB,EAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAyB,MAAM,4BAA4B,CAAC;AACxF,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,aAAa,EACb,cAAc,EAEd,MAAM,0BAA0B,CAAC"}
|
|
@@ -22,4 +22,24 @@ type ComputeServerStore = IDataProvider['computeServer'];
|
|
|
22
22
|
export declare function resolveServerForOrg(ctx: RequestContext, orgId: string | null | undefined, store: ComputeServerStore, opts?: {
|
|
23
23
|
definitionPin?: string | null;
|
|
24
24
|
}): Promise<ComputeServerConfig>;
|
|
25
|
+
export interface ServerResolver {
|
|
26
|
+
/** `resolveServerForOrg`, answered from what the same caller resolved within the TTL. */
|
|
27
|
+
resolve(ctx: RequestContext, orgId: string | null | undefined, store: ComputeServerStore, opts?: {
|
|
28
|
+
definitionPin?: string | null;
|
|
29
|
+
}): Promise<ComputeServerConfig>;
|
|
30
|
+
/** Call after any compute-config write: the next resolve reads the config again. */
|
|
31
|
+
forget(): void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Remembers each caller's resolved server for `ttlMs`: every solve and every
|
|
35
|
+
* describe resolves one, and the config changes only through its own write
|
|
36
|
+
* handlers, which call `forget`. The TTL bounds a write made on another
|
|
37
|
+
* instance. Keyed by what row security decides visibility by, so one caller's
|
|
38
|
+
* answer is never handed to another; a share link's anonymous context is never
|
|
39
|
+
* remembered. A failed read is not kept.
|
|
40
|
+
*/
|
|
41
|
+
export declare function createServerResolver({ ttlMs, maxEntries }?: {
|
|
42
|
+
ttlMs?: number;
|
|
43
|
+
maxEntries?: number;
|
|
44
|
+
}): ServerResolver;
|
|
25
45
|
//# sourceMappingURL=resolve-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-server.d.ts","sourceRoot":"","sources":["../../src/compute/resolve-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,EAAE,8BAA8B,EAAE,CAAC;AAE1C,sEAAsE;AACtE,KAAK,kBAAkB,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,kBAAkB,EACzB,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAU9B"}
|
|
1
|
+
{"version":3,"file":"resolve-server.d.ts","sourceRoot":"","sources":["../../src/compute/resolve-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAI7D,OAAO,EAAE,8BAA8B,EAAE,CAAC;AAE1C,sEAAsE;AACtE,KAAK,kBAAkB,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC;AAEzD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,kBAAkB,EACzB,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAO,GAC1C,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAMD,MAAM,WAAW,cAAc;IAC9B,yFAAyF;IACzF,OAAO,CACN,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,KAAK,EAAE,kBAAkB,EACzB,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GACtC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,oFAAoF;IACpF,MAAM,IAAI,IAAI,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EACpC,KAAc,EACd,UAAkB,EAClB,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,cAAc,CA+B/D"}
|
|
@@ -32,4 +32,57 @@ export async function resolveServerForOrg(ctx, orgId, store, opts = {}) {
|
|
|
32
32
|
return server;
|
|
33
33
|
return { ...server, apiKey: await store.getServerApiKey(ctx, server.id) };
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Remembers each caller's resolved server for `ttlMs`: every solve and every
|
|
37
|
+
* describe resolves one, and the config changes only through its own write
|
|
38
|
+
* handlers, which call `forget`. The TTL bounds a write made on another
|
|
39
|
+
* instance. Keyed by what row security decides visibility by, so one caller's
|
|
40
|
+
* answer is never handed to another; a share link's anonymous context is never
|
|
41
|
+
* remembered. A failed read is not kept.
|
|
42
|
+
*/
|
|
43
|
+
export function createServerResolver({ ttlMs = 30_000, maxEntries = 1_000 } = {}) {
|
|
44
|
+
// Per store: a host that swaps its data provider (tests do) must not read another's answers.
|
|
45
|
+
let byStore = new WeakMap();
|
|
46
|
+
return {
|
|
47
|
+
resolve(ctx, orgId, store, opts = {}) {
|
|
48
|
+
const caller = callerKey(ctx);
|
|
49
|
+
if (caller === null)
|
|
50
|
+
return resolveServerForOrg(ctx, orgId, store, opts);
|
|
51
|
+
let entries = byStore.get(store);
|
|
52
|
+
if (!entries)
|
|
53
|
+
byStore.set(store, (entries = new Map()));
|
|
54
|
+
const key = `${caller}|${orgId ?? ''}|${opts.definitionPin ?? ''}`;
|
|
55
|
+
const now = Date.now();
|
|
56
|
+
const hit = entries.get(key);
|
|
57
|
+
if (hit && hit.until > now)
|
|
58
|
+
return hit.server;
|
|
59
|
+
if (entries.size >= maxEntries) {
|
|
60
|
+
for (const [k, e] of entries)
|
|
61
|
+
if (e.until <= now)
|
|
62
|
+
entries.delete(k);
|
|
63
|
+
while (entries.size >= maxEntries)
|
|
64
|
+
entries.delete(entries.keys().next().value);
|
|
65
|
+
}
|
|
66
|
+
const server = resolveServerForOrg(ctx, orgId, store, opts);
|
|
67
|
+
entries.set(key, { server, until: now + ttlMs });
|
|
68
|
+
server.catch(() => {
|
|
69
|
+
if (entries.get(key)?.server === server)
|
|
70
|
+
entries.delete(key);
|
|
71
|
+
});
|
|
72
|
+
return server;
|
|
73
|
+
},
|
|
74
|
+
forget() {
|
|
75
|
+
byStore = new WeakMap();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Who row security sees: the user, acting org, platform permissions and API key; null for a share link. */
|
|
80
|
+
function callerKey(ctx) {
|
|
81
|
+
if (ctx.system)
|
|
82
|
+
return ctx.shareLinkId ? null : 'system';
|
|
83
|
+
if (!ctx.userId)
|
|
84
|
+
return null;
|
|
85
|
+
const permissions = [...ctx.platformPermissions].sort().join(',');
|
|
86
|
+
return `${ctx.userId}:${ctx.actingOrgId ?? ''}:${permissions}:${ctx.apiScope?.tokenId ?? ''}`;
|
|
87
|
+
}
|
|
35
88
|
//# sourceMappingURL=resolve-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-server.js","sourceRoot":"","sources":["../../src/compute/resolve-server.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mBAAmB,IAAI,WAAW,EAIlC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAE7D,4EAA4E;AAC5E,qDAAqD;AACrD,OAAO,EAAE,8BAA8B,EAAE,CAAC;AAK1C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,GAAmB,EACnB,KAAgC,EAChC,KAAyB,EACzB,OAA0C,EAAE;IAE5C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,MAA2B,CAAC;IAChC,IAAI,CAAC;QACJ,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,IAAI,8BAA8B,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC;IACrC,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAC3E,CAAC"}
|
|
1
|
+
{"version":3,"file":"resolve-server.js","sourceRoot":"","sources":["../../src/compute/resolve-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAuCA,eAAO,MAAM,eAAe,6CAsY1B,CAAC"}
|
package/dist/config/settings.js
CHANGED
|
@@ -2,8 +2,9 @@ import { composeManifest, defineSetting } from '@selvajs/platform/config';
|
|
|
2
2
|
import { DEFAULT_API_RATE_LIMIT } from '../api/rate-limit.js';
|
|
3
3
|
// Keys the engine reads, wherever the host app runs it. Providers declare their
|
|
4
4
|
// own (`@selvajs/*-provider/config`); the host app declares what only it reads.
|
|
5
|
-
const flag = (key, description, impact) => defineSetting({
|
|
5
|
+
const flag = (key, label, description, impact) => defineSetting({
|
|
6
6
|
key: `SELVA_FLAG_${key}`,
|
|
7
|
+
label,
|
|
7
8
|
type: 'bool',
|
|
8
9
|
default: false,
|
|
9
10
|
onInvalid: 'fail',
|
|
@@ -11,8 +12,9 @@ const flag = (key, description, impact) => defineSetting({
|
|
|
11
12
|
description,
|
|
12
13
|
...(impact ? { impact } : {})
|
|
13
14
|
});
|
|
14
|
-
const tunableInt = (key, fallback, description, extra = {}) => defineSetting({
|
|
15
|
+
const tunableInt = (key, fallback, label, description, extra = {}) => defineSetting({
|
|
15
16
|
key,
|
|
17
|
+
label,
|
|
16
18
|
type: 'int',
|
|
17
19
|
min: 1,
|
|
18
20
|
default: fallback,
|
|
@@ -24,28 +26,47 @@ const tunableInt = (key, fallback, description, extra = {}) => defineSetting({
|
|
|
24
26
|
const MB = 1024 * 1024;
|
|
25
27
|
export const ENGINE_SETTINGS = composeManifest([
|
|
26
28
|
// ── Wiring ───────────────────────────────────────────────────────────────
|
|
27
|
-
...[
|
|
29
|
+
...[
|
|
30
|
+
[
|
|
31
|
+
'AUTH',
|
|
32
|
+
'Sign-in',
|
|
33
|
+
'Who checks passwords: local (this server), supabase, or header (your SSO proxy).'
|
|
34
|
+
],
|
|
35
|
+
[
|
|
36
|
+
'DATA',
|
|
37
|
+
'Database',
|
|
38
|
+
'Where users, orgs and projects live: local (files on this server) or supabase.'
|
|
39
|
+
],
|
|
40
|
+
[
|
|
41
|
+
'STORAGE',
|
|
42
|
+
'File storage',
|
|
43
|
+
'Where uploaded .gh files and images live: local (this server) or supabase.'
|
|
44
|
+
]
|
|
45
|
+
].map(([slot, label, description]) => defineSetting({
|
|
28
46
|
key: `SELVA_${slot}_PROVIDER`,
|
|
47
|
+
label,
|
|
29
48
|
type: 'string',
|
|
30
49
|
default: 'local',
|
|
31
50
|
onInvalid: 'fail',
|
|
32
51
|
class: 'bootstrap',
|
|
33
52
|
summary: true,
|
|
34
|
-
description
|
|
53
|
+
description,
|
|
35
54
|
impact: 'Switching it does not move any data: the instance starts on what the new provider holds.'
|
|
36
55
|
})),
|
|
37
56
|
defineSetting({
|
|
38
57
|
key: 'SELVA_TENANCY',
|
|
58
|
+
label: 'Organizations',
|
|
39
59
|
type: 'enum',
|
|
40
60
|
values: ['single', 'multi'],
|
|
41
61
|
default: 'single',
|
|
42
62
|
onInvalid: 'fail',
|
|
43
63
|
class: 'bootstrap',
|
|
44
64
|
summary: true,
|
|
45
|
-
description: 'single:
|
|
65
|
+
description: 'single: everyone shares one organization. multi: users can create their own.'
|
|
46
66
|
}),
|
|
47
67
|
defineSetting({
|
|
48
68
|
key: 'SELVA_CONFIG_PATH',
|
|
69
|
+
label: 'Custom config file',
|
|
49
70
|
type: 'string',
|
|
50
71
|
onInvalid: 'fail',
|
|
51
72
|
class: 'bootstrap',
|
|
@@ -54,6 +75,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
54
75
|
// ── Keys ─────────────────────────────────────────────────────────────────
|
|
55
76
|
defineSetting({
|
|
56
77
|
key: 'SELVA_HMAC_KEY',
|
|
78
|
+
label: 'Signing key',
|
|
57
79
|
type: 'string',
|
|
58
80
|
minLength: 32,
|
|
59
81
|
required: true,
|
|
@@ -62,11 +84,12 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
62
84
|
sensitive: true,
|
|
63
85
|
generated: true,
|
|
64
86
|
summary: true,
|
|
65
|
-
description: '
|
|
87
|
+
description: 'Stops sign-ins, links and tokens from being forged. Generated at install; never share it.',
|
|
66
88
|
impact: 'Changing it without SELVA_HMAC_KEY_PREVIOUS breaks what it signed: run `selva keys rotate hmac`.'
|
|
67
89
|
}),
|
|
68
90
|
defineSetting({
|
|
69
91
|
key: 'SELVA_AT_REST_KEY',
|
|
92
|
+
label: 'Encryption key',
|
|
70
93
|
type: 'key',
|
|
71
94
|
required: true,
|
|
72
95
|
onInvalid: 'fail',
|
|
@@ -74,11 +97,12 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
74
97
|
sensitive: true,
|
|
75
98
|
generated: true,
|
|
76
99
|
summary: true,
|
|
77
|
-
description: 'Encrypts
|
|
100
|
+
description: 'Encrypts the Rhino.Compute API keys stored here. Generated at install.',
|
|
78
101
|
impact: 'Changing it without SELVA_AT_REST_KEY_PREVIOUS makes stored API keys unreadable: run `selva keys rotate at-rest`.'
|
|
79
102
|
}),
|
|
80
103
|
defineSetting({
|
|
81
104
|
key: 'SELVA_HMAC_KEY_PREVIOUS',
|
|
105
|
+
label: 'Previous signing key',
|
|
82
106
|
type: 'string',
|
|
83
107
|
minLength: 32,
|
|
84
108
|
onInvalid: 'fail',
|
|
@@ -86,22 +110,24 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
86
110
|
sensitive: true,
|
|
87
111
|
generated: true,
|
|
88
112
|
summary: true,
|
|
89
|
-
description: '
|
|
113
|
+
description: 'Kept after a rotation so what the old signing key signed works until it expires.',
|
|
90
114
|
impact: 'Removing it ends sessions, MCP clients and links signed before the rotation.'
|
|
91
115
|
}),
|
|
92
116
|
defineSetting({
|
|
93
117
|
key: 'SELVA_AT_REST_KEY_PREVIOUS',
|
|
118
|
+
label: 'Previous encryption key',
|
|
94
119
|
type: 'key',
|
|
95
120
|
onInvalid: 'fail',
|
|
96
121
|
class: 'secret',
|
|
97
122
|
sensitive: true,
|
|
98
123
|
generated: true,
|
|
99
124
|
summary: true,
|
|
100
|
-
description: '
|
|
125
|
+
description: 'Kept after a rotation until stored API keys are re-encrypted, which happens at the next start.',
|
|
101
126
|
impact: 'Remove it only once /admin/system shows no API key on the previous key.'
|
|
102
127
|
}),
|
|
103
128
|
defineSetting({
|
|
104
129
|
key: 'SELVA_HMAC_KEY_PREVIOUS_EXPIRES',
|
|
130
|
+
label: 'Previous signing key expiry',
|
|
105
131
|
type: 'string',
|
|
106
132
|
onInvalid: 'fail',
|
|
107
133
|
class: 'secret',
|
|
@@ -110,6 +136,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
110
136
|
}),
|
|
111
137
|
defineSetting({
|
|
112
138
|
key: 'SELVA_AT_REST_KEY_PREVIOUS_EXPIRES',
|
|
139
|
+
label: 'Previous encryption key expiry',
|
|
113
140
|
type: 'string',
|
|
114
141
|
onInvalid: 'fail',
|
|
115
142
|
class: 'secret',
|
|
@@ -119,37 +146,42 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
119
146
|
// ── Access ───────────────────────────────────────────────────────────────
|
|
120
147
|
defineSetting({
|
|
121
148
|
key: 'BOOTSTRAP_INSTANCE_ADMIN_EMAIL',
|
|
149
|
+
label: 'Recovery admin email',
|
|
122
150
|
type: 'string',
|
|
123
151
|
onInvalid: 'fail',
|
|
124
152
|
class: 'bootstrap',
|
|
125
153
|
sensitive: true,
|
|
126
154
|
summary: true,
|
|
127
|
-
description: '
|
|
155
|
+
description: 'While no instance admin exists, only this address may become one. For first setup and lockouts.'
|
|
128
156
|
}),
|
|
129
157
|
defineSetting({
|
|
130
158
|
key: 'SIGN_IN_MAX_AGE_DAYS',
|
|
159
|
+
label: 'Force sign-in again after',
|
|
131
160
|
type: 'int',
|
|
132
161
|
min: 0,
|
|
133
162
|
default: 0,
|
|
134
163
|
onInvalid: 'fail',
|
|
135
164
|
class: 'setting',
|
|
136
165
|
summary: true,
|
|
137
|
-
|
|
166
|
+
zero: 'Never',
|
|
167
|
+
unit: 'days',
|
|
168
|
+
description: 'Days before users must sign in at the identity provider again. 0 is never.',
|
|
138
169
|
impact: 'API tokens of anyone who has not signed in within this many days are revoked.'
|
|
139
170
|
}),
|
|
140
|
-
flag('ALLOW_ORG_CREATION', 'Self-service org creation (read by host apps).'),
|
|
141
|
-
flag('ALLOW_CROSS_ORG_PUBLIC', 'Public projects are visible to every signed-in user, not just the publishing org.', 'Turning it on widens who sees existing public projects.'),
|
|
142
|
-
flag('ALLOW_ORG_COMPUTE_OVERRIDE', 'Orgs may configure their own Rhino.Compute server.'),
|
|
143
|
-
flag('ENABLE_SHARING', 'Per-definition share links for anonymous access.', 'Turning it off stops every existing share link from resolving.'),
|
|
144
|
-
flag('ENABLE_PLATFORM_PROJECTS', 'Projects owned by instance admins and granted to orgs or users.'),
|
|
171
|
+
flag('ALLOW_ORG_CREATION', 'Users create orgs', 'Self-service org creation (read by host apps).'),
|
|
172
|
+
flag('ALLOW_CROSS_ORG_PUBLIC', 'Public across orgs', 'Public projects are visible to every signed-in user, not just the publishing org.', 'Turning it on widens who sees existing public projects.'),
|
|
173
|
+
flag('ALLOW_ORG_COMPUTE_OVERRIDE', 'Orgs bring their own compute', 'Orgs may configure their own Rhino.Compute server.'),
|
|
174
|
+
flag('ENABLE_SHARING', 'Share links', 'Per-definition share links for anonymous access.', 'Turning it off stops every existing share link from resolving.'),
|
|
175
|
+
flag('ENABLE_PLATFORM_PROJECTS', 'Platform projects', 'Projects owned by instance admins and granted to orgs or users.'),
|
|
145
176
|
// ── Branding ─────────────────────────────────────────────────────────────
|
|
146
177
|
...[
|
|
147
|
-
['NAME', 'Product name in the header and titles.'],
|
|
148
|
-
['COPYRIGHT_NAME', 'Footer copyright owner. Defaults to the brand name.'],
|
|
149
|
-
['TAGLINE', 'Subtitle on the landing page.'],
|
|
150
|
-
['DESCRIPTION', 'Meta description for search and link previews.']
|
|
151
|
-
].map(([key, description]) => defineSetting({
|
|
178
|
+
['NAME', 'Product name', 'Product name in the header and titles.'],
|
|
179
|
+
['COPYRIGHT_NAME', 'Copyright holder', 'Footer copyright owner. Defaults to the brand name.'],
|
|
180
|
+
['TAGLINE', 'Tagline', 'Subtitle on the landing page.'],
|
|
181
|
+
['DESCRIPTION', 'Site description', 'Meta description for search and link previews.']
|
|
182
|
+
].map(([key, label, description]) => defineSetting({
|
|
152
183
|
key: `SELVA_BRAND_${key}`,
|
|
184
|
+
label,
|
|
153
185
|
type: 'string',
|
|
154
186
|
onInvalid: 'fail',
|
|
155
187
|
class: 'setting',
|
|
@@ -158,6 +190,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
158
190
|
// ── Mail ─────────────────────────────────────────────────────────────────
|
|
159
191
|
defineSetting({
|
|
160
192
|
key: 'SMTP_HOST',
|
|
193
|
+
label: 'Mail server',
|
|
161
194
|
type: 'string',
|
|
162
195
|
onInvalid: 'fail',
|
|
163
196
|
class: 'setting',
|
|
@@ -165,6 +198,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
165
198
|
}),
|
|
166
199
|
defineSetting({
|
|
167
200
|
key: 'SMTP_PORT',
|
|
201
|
+
label: 'Mail server port',
|
|
168
202
|
type: 'int',
|
|
169
203
|
min: 1,
|
|
170
204
|
max: 65535,
|
|
@@ -175,6 +209,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
175
209
|
}),
|
|
176
210
|
defineSetting({
|
|
177
211
|
key: 'SMTP_USER',
|
|
212
|
+
label: 'Mail username',
|
|
178
213
|
type: 'string',
|
|
179
214
|
onInvalid: 'fail',
|
|
180
215
|
class: 'setting',
|
|
@@ -183,6 +218,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
183
218
|
}),
|
|
184
219
|
defineSetting({
|
|
185
220
|
key: 'SMTP_PASS',
|
|
221
|
+
label: 'Mail password',
|
|
186
222
|
type: 'string',
|
|
187
223
|
onInvalid: 'fail',
|
|
188
224
|
class: 'secret',
|
|
@@ -191,6 +227,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
191
227
|
}),
|
|
192
228
|
defineSetting({
|
|
193
229
|
key: 'SMTP_FROM',
|
|
230
|
+
label: 'Sender address',
|
|
194
231
|
type: 'string',
|
|
195
232
|
onInvalid: 'fail',
|
|
196
233
|
class: 'setting',
|
|
@@ -199,6 +236,7 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
199
236
|
}),
|
|
200
237
|
defineSetting({
|
|
201
238
|
key: 'SMTP_SECURE',
|
|
239
|
+
label: 'Mail TLS mode',
|
|
202
240
|
type: 'bool',
|
|
203
241
|
onInvalid: 'fail',
|
|
204
242
|
class: 'tunable',
|
|
@@ -206,38 +244,31 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
206
244
|
legacy: { bool: 'exact-true' }
|
|
207
245
|
}),
|
|
208
246
|
// ── Compute limits ───────────────────────────────────────────────────────
|
|
209
|
-
tunableInt('COMPUTE_SOLVE_DEADLINE_MS', 100_000, 'Longest one solve may run.', {
|
|
247
|
+
tunableInt('COMPUTE_SOLVE_DEADLINE_MS', 100_000, 'Solve time limit', 'Longest one solve may run.', {
|
|
248
|
+
unit: 'ms',
|
|
210
249
|
aliases: ['MAX_SOLVE_DURATION_MS'],
|
|
211
250
|
impact: 'Past the reverse proxy read timeout, solves fail there with a 502 instead.'
|
|
212
251
|
}),
|
|
213
|
-
tunableInt('COMPUTE_RATE_LIMIT_WINDOW_MS', 100_000, 'Compute rate-limit window.'),
|
|
214
|
-
tunableInt('COMPUTE_RATE_LIMIT_MAX', 120, 'Solves per user or share link per window.'),
|
|
215
|
-
tunableInt('MAX_DEFINITION_FILE_SIZE_BYTES', 50 * MB, 'Largest .gh upload.'
|
|
216
|
-
|
|
217
|
-
tunableInt('COMPUTE_REQUEST_MAX_BYTES', 256 * MB, 'Largest solve request body.', {
|
|
218
|
-
impact: 'Must stay at or below BODY_SIZE_LIMIT, or that limit rejects first.'
|
|
219
|
-
}),
|
|
220
|
-
tunableInt('COMPUTE_RESPONSE_MAX_BYTES', 300 * MB, 'Largest solve response body.'),
|
|
221
|
-
tunableInt('REMOTE_DEFINITION_FETCH_TIMEOUT_MS', 30_000, 'Deadline for fetching a remote .gh.'),
|
|
222
|
-
tunableInt('REMOTE_DEFINITION_CACHE_TTL_MS', 5 * 60 * 1000, 'How long remote .gh bytes stay cached.', {
|
|
223
|
-
aliases: ['DEFINITION_CACHE_TTL_MS']
|
|
224
|
-
}),
|
|
225
|
-
tunableInt('COMPUTE_MAX_QUEUE_DEPTH', 0, 'Solves allowed to wait per compute server. 0 is unbounded.', {
|
|
226
|
-
min: 0
|
|
227
|
-
}),
|
|
228
|
-
tunableInt('COMPUTE_QUEUE_WAIT_MS', 0, 'Longest a solve may wait queued. 0 is no deadline.', {
|
|
229
|
-
min: 0
|
|
252
|
+
tunableInt('COMPUTE_RATE_LIMIT_WINDOW_MS', 100_000, 'Solve rate limit window', 'Compute rate-limit window.', { unit: 'ms' }),
|
|
253
|
+
tunableInt('COMPUTE_RATE_LIMIT_MAX', 120, 'Solves per window', 'Solves per user or share link per window.'),
|
|
254
|
+
tunableInt('MAX_DEFINITION_FILE_SIZE_BYTES', 50 * MB, 'Max .gh upload', 'Largest .gh upload.', {
|
|
255
|
+
unit: 'bytes'
|
|
230
256
|
}),
|
|
231
|
-
tunableInt('
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
tunableInt('COMPUTE_SOLVE_CACHE_MB', 256, 'Solve cache budget per warm compute server. 0 turns it off.', {
|
|
236
|
-
min: 0,
|
|
237
|
-
aliases: ['COMPUTE_RESPONSE_CACHE_MB']
|
|
257
|
+
tunableInt('MAX_IMAGE_FILE_SIZE_BYTES', 10 * MB, 'Max image upload', 'Largest cover image upload.', { unit: 'bytes' }),
|
|
258
|
+
tunableInt('COMPUTE_REQUEST_MAX_BYTES', 256 * MB, 'Max solve request', 'Largest solve request body.', {
|
|
259
|
+
unit: 'bytes',
|
|
260
|
+
impact: 'Must stay at or below BODY_SIZE_LIMIT, or that limit rejects first.'
|
|
238
261
|
}),
|
|
262
|
+
tunableInt('COMPUTE_RESPONSE_MAX_BYTES', 300 * MB, 'Max solve response', 'Largest solve response body.', { unit: 'bytes' }),
|
|
263
|
+
tunableInt('REMOTE_DEFINITION_FETCH_TIMEOUT_MS', 30_000, 'Remote .gh fetch timeout', 'Deadline for fetching a remote .gh.', { unit: 'ms' }),
|
|
264
|
+
tunableInt('REMOTE_DEFINITION_CACHE_TTL_MS', 5 * 60 * 1000, 'Remote .gh cache time', 'How long remote .gh bytes stay cached.', { unit: 'ms', aliases: ['DEFINITION_CACHE_TTL_MS'] }),
|
|
265
|
+
tunableInt('COMPUTE_MAX_QUEUE_DEPTH', 0, 'Solve queue length', 'Solves allowed to wait per compute server. 0 is unbounded.', { min: 0, zero: 'No limit' }),
|
|
266
|
+
tunableInt('COMPUTE_QUEUE_WAIT_MS', 0, 'Max queue wait', 'Longest a solve may wait queued. 0 is no deadline.', { min: 0, unit: 'ms', zero: 'No limit' }),
|
|
267
|
+
tunableInt('COMPUTE_DEFINITION_CACHE_MB', 256, 'Definition cache size', 'Definition cache budget. 0 turns it off.', { min: 0, unit: 'mb', zero: 'Off', aliases: ['COMPUTE_DEFINITION_BYTE_CACHE_MB'] }),
|
|
268
|
+
tunableInt('COMPUTE_SOLVE_CACHE_MB', 256, 'Solve cache size', 'Solve cache budget per warm compute server. 0 turns it off.', { min: 0, unit: 'mb', zero: 'Off', aliases: ['COMPUTE_RESPONSE_CACHE_MB'] }),
|
|
239
269
|
defineSetting({
|
|
240
270
|
key: 'COMPUTE_REUSE_DEFINITION_CACHE',
|
|
271
|
+
label: 'Reuse compute server definition cache',
|
|
241
272
|
type: 'bool',
|
|
242
273
|
default: true,
|
|
243
274
|
onInvalid: 'default',
|
|
@@ -247,15 +278,14 @@ export const ENGINE_SETTINGS = composeManifest([
|
|
|
247
278
|
}),
|
|
248
279
|
defineSetting({
|
|
249
280
|
key: 'COMPUTE_SERVER_CACHESOLVE',
|
|
281
|
+
label: 'Compute server solve cache',
|
|
250
282
|
type: 'bool',
|
|
251
283
|
default: true,
|
|
252
284
|
onInvalid: 'default',
|
|
253
285
|
class: 'tunable',
|
|
254
286
|
description: 'Ask Rhino.Compute to cache solve results server-side.'
|
|
255
287
|
}),
|
|
256
|
-
tunableInt('API_TOKEN_RATE_LIMIT_WINDOW_MS', DEFAULT_API_RATE_LIMIT.windowMs, 'API token rate-limit window.'),
|
|
257
|
-
tunableInt('API_TOKEN_RATE_LIMIT_MAX', DEFAULT_API_RATE_LIMIT.maxPerWindow, 'Requests per API token per window. 0 is off.', {
|
|
258
|
-
min: 0
|
|
259
|
-
})
|
|
288
|
+
tunableInt('API_TOKEN_RATE_LIMIT_WINDOW_MS', DEFAULT_API_RATE_LIMIT.windowMs, 'API rate limit window', 'API token rate-limit window.', { unit: 'ms' }),
|
|
289
|
+
tunableInt('API_TOKEN_RATE_LIMIT_MAX', DEFAULT_API_RATE_LIMIT.maxPerWindow, 'API requests per window', 'Requests per API token per window. 0 is off.', { min: 0, zero: 'Off' })
|
|
260
290
|
]);
|
|
261
291
|
//# sourceMappingURL=settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAmB,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,gFAAgF;AAChF,gFAAgF;AAEhF,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,WAAmB,EAAE,MAAe,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/config/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-for-render.d.ts","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAE5B,IAAI,EAAE,uBAAuB;aAE7B,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAC;IACvE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,gFAAgF;IAChF,aAAa,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,2FAA2F;IAC3F,SAAS,EAAE,CACV,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAC5C,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wFAAwF;IACxF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,EACjC,OAAO,CAAC,EAAE,qBAAqB,KAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"load-for-render.d.ts","sourceRoot":"","sources":["../../src/definitions/load-for-render.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EACX,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAc,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG7D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,gBAAgB,EAAE,UAAU,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED;;;;;;GAMG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEvF,qBAAa,mBAAoB,SAAQ,KAAK;aAE5B,IAAI,EAAE,uBAAuB;aAE7B,KAAK,CAAC,EAAE,OAAO;gBAFf,IAAI,EAAE,uBAAuB,EAC7C,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKhC;AAED,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IACvC,WAAW,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,GAAG,kBAAkB,CAAC,CAAC;IACvE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC5C,gFAAgF;IAChF,aAAa,EAAE,CACd,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAClC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClC,2FAA2F;IAC3F,SAAS,EAAE,CACV,MAAM,EAAE,mBAAmB,EAC3B,IAAI,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAC5B,OAAO,CAAC;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAC5C,qFAAqF;IACrF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpF;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wFAAwF;IACxF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACrC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,iBAAiB,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,EACjC,OAAO,CAAC,EAAE,qBAAqB,KAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CA2KnF;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAE9D"}
|