@selvajs/server 2.0.0-beta.21 → 2.0.0-beta.23
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/api/openapi.d.ts +6 -1
- package/dist/api/openapi.d.ts.map +1 -1
- package/dist/api/openapi.js +3 -1
- package/dist/api/openapi.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/errors/SentryErrorReporter.d.ts +24 -2
- package/dist/errors/SentryErrorReporter.d.ts.map +1 -1
- package/dist/errors/SentryErrorReporter.js +19 -6
- package/dist/errors/SentryErrorReporter.js.map +1 -1
- package/dist/errors/index.d.ts +2 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +3 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/scrub.d.ts +40 -0
- package/dist/errors/scrub.d.ts.map +1 -0
- package/dist/errors/scrub.js +67 -0
- package/dist/errors/scrub.js.map +1 -0
- 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 +4 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +4 -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/request-timing.d.ts +58 -0
- package/dist/http/request-timing.d.ts.map +1 -0
- package/dist/http/request-timing.js +219 -0
- package/dist/http/request-timing.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 +5 -5
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/api/openapi.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Builds an OpenAPI 3.1 document for a host's `/api/v1` from its route registry.
|
|
3
3
|
*
|
|
4
4
|
* Shared so every host publishes the same shape: `@selvajs/mcp` reads
|
|
5
|
-
* `operationId`, `x-scope`, `x-internal` and the `Idempotency-Key` parameter
|
|
5
|
+
* `operationId`, `x-scope`, `x-internal`, `x-long-running` and the `Idempotency-Key` parameter
|
|
6
6
|
* from it, and nothing else.
|
|
7
7
|
*
|
|
8
8
|
* Request schemas come from `z.toJSONSchema` over the actual validators, so a
|
|
@@ -55,6 +55,11 @@ export interface Endpoint {
|
|
|
55
55
|
errors?: number[];
|
|
56
56
|
/** Honours `Idempotency-Key`; must match the route's `idempotent` mount option. */
|
|
57
57
|
idempotent?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Runs a Compute solve or schema read without the `solve` scope (a preview, an upload).
|
|
60
|
+
* Emitted as `x-long-running`; MCP clients give it the solve timeout.
|
|
61
|
+
*/
|
|
62
|
+
longRunning?: boolean;
|
|
58
63
|
}
|
|
59
64
|
export interface OpenApiOptions {
|
|
60
65
|
/** Route prefix every endpoint is served under, e.g. `/api/v1`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG5F,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,QAAQ;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,KAAK,EAAE,cAAc,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxE,uDAAuD;IACvD,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChD,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAK,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,EAAsC,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG5F,MAAM,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC;AAErE;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAExE,MAAM,WAAW,QAAQ;IACxB,MAAM,EAAE,UAAU,CAAC;IACnB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,oGAAoG;IACpG,KAAK,EAAE,cAAc,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gFAAgF;IAChF,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACxE,uDAAuD;IACvD,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChD,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC9B,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAC1F,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,yBAAyB,CAAC,EAAE,MAAM,CAAC;CACnC;AAgKD,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,GAAG,MAAM,CAMzE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAuGzF"}
|
package/dist/api/openapi.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Builds an OpenAPI 3.1 document for a host's `/api/v1` from its route registry.
|
|
3
3
|
*
|
|
4
4
|
* Shared so every host publishes the same shape: `@selvajs/mcp` reads
|
|
5
|
-
* `operationId`, `x-scope`, `x-internal` and the `Idempotency-Key` parameter
|
|
5
|
+
* `operationId`, `x-scope`, `x-internal`, `x-long-running` and the `Idempotency-Key` parameter
|
|
6
6
|
* from it, and nothing else.
|
|
7
7
|
*
|
|
8
8
|
* Request schemas come from `z.toJSONSchema` over the actual validators, so a
|
|
@@ -110,6 +110,8 @@ function operationFor(ep, errorDescriptions, alwaysErrors) {
|
|
|
110
110
|
};
|
|
111
111
|
if (ep.internal)
|
|
112
112
|
op['x-internal'] = true;
|
|
113
|
+
if (ep.longRunning)
|
|
114
|
+
op['x-long-running'] = true;
|
|
113
115
|
const params = parametersFor(ep);
|
|
114
116
|
if (params.length)
|
|
115
117
|
op.parameters = params;
|
package/dist/api/openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAgB,MAAM,KAAK,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAuB,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/api/openapi.ts"],"names":[],"mappings":"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"}
|
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,15 +1,37 @@
|
|
|
1
1
|
import type { ErrorContext, IErrorReporter } from '@selvajs/platform';
|
|
2
|
+
/**
|
|
3
|
+
* `IErrorReporter` backed by Sentry. `@sentry/node` is an OPTIONAL peer dependency: a
|
|
4
|
+
* deployment without a DSN never loads it, so the surface below is narrowed to the calls used
|
|
5
|
+
* here and the import stays dynamic — a static one would make the package mandatory.
|
|
6
|
+
*
|
|
7
|
+
* A host that already runs a Sentry SDK (a framework one that also traces requests) hands it
|
|
8
|
+
* to `fromClient` instead, so Sentry is initialized once.
|
|
9
|
+
*/
|
|
10
|
+
export interface SentryLike {
|
|
11
|
+
captureException(error: unknown, context?: {
|
|
12
|
+
tags?: Record<string, string>;
|
|
13
|
+
user?: {
|
|
14
|
+
id?: string;
|
|
15
|
+
};
|
|
16
|
+
level?: 'fatal' | 'error' | 'warning';
|
|
17
|
+
fingerprint?: string[];
|
|
18
|
+
}): unknown;
|
|
19
|
+
}
|
|
2
20
|
export declare class SentryErrorReporter implements IErrorReporter {
|
|
3
21
|
private readonly sentry;
|
|
4
22
|
private constructor();
|
|
23
|
+
/** A reporter over an SDK the host initialized itself; it should pass `scrub.ts`'s hooks. */
|
|
24
|
+
static fromClient(sentry: SentryLike): SentryErrorReporter;
|
|
5
25
|
/**
|
|
6
|
-
* Initialize
|
|
7
|
-
* won't load. Never throws — a broken error-tracker must not take down boot.
|
|
26
|
+
* Initialize `@sentry/node` with the scrubbing hooks and return a reporter, or `null` when
|
|
27
|
+
* it won't load. Never throws — a broken error-tracker must not take down boot.
|
|
8
28
|
*/
|
|
9
29
|
static create(opts: {
|
|
10
30
|
dsn: string;
|
|
11
31
|
environment?: string;
|
|
12
32
|
release?: string;
|
|
33
|
+
/** `SENTRY_TRACES_SAMPLE_RATE` as read from env; unset is 0, error tracking only. */
|
|
34
|
+
tracesSampleRate?: string | number;
|
|
13
35
|
}): Promise<SentryErrorReporter | null>;
|
|
14
36
|
capture(error: unknown, context?: ErrorContext): void;
|
|
15
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryErrorReporter.d.ts","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"SentryErrorReporter.d.ts","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGtE;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IAC1B,gBAAgB,CACf,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvB,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;QACtC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,GACC,OAAO,CAAC;CACX;AAcD,qBAAa,mBAAoB,YAAW,cAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAA3C,OAAO;IAEP,6FAA6F;IAC7F,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,mBAAmB;IAI1D;;;OAGG;WACU,MAAM,CAAC,IAAI,EAAE;QACzB,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,qFAAqF;QACrF,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACnC,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAgCvC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI;CAoBrD"}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import { sampleRate, scrubBreadcrumb, scrubEvent } from './scrub.js';
|
|
1
2
|
export class SentryErrorReporter {
|
|
2
3
|
sentry;
|
|
3
4
|
constructor(sentry) {
|
|
4
5
|
this.sentry = sentry;
|
|
5
6
|
}
|
|
7
|
+
/** A reporter over an SDK the host initialized itself; it should pass `scrub.ts`'s hooks. */
|
|
8
|
+
static fromClient(sentry) {
|
|
9
|
+
return new SentryErrorReporter(sentry);
|
|
10
|
+
}
|
|
6
11
|
/**
|
|
7
|
-
* Initialize
|
|
8
|
-
* won't load. Never throws — a broken error-tracker must not take down boot.
|
|
12
|
+
* Initialize `@sentry/node` with the scrubbing hooks and return a reporter, or `null` when
|
|
13
|
+
* it won't load. Never throws — a broken error-tracker must not take down boot.
|
|
9
14
|
*/
|
|
10
15
|
static async create(opts) {
|
|
11
16
|
try {
|
|
@@ -20,9 +25,12 @@ export class SentryErrorReporter {
|
|
|
20
25
|
dsn: opts.dsn,
|
|
21
26
|
environment: opts.environment,
|
|
22
27
|
release: opts.release,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
tracesSampleRate: typeof opts.tracesSampleRate === 'number'
|
|
29
|
+
? sampleRate(String(opts.tracesSampleRate))
|
|
30
|
+
: sampleRate(opts.tracesSampleRate),
|
|
31
|
+
beforeSend: scrubEvent,
|
|
32
|
+
beforeSendTransaction: scrubEvent,
|
|
33
|
+
beforeBreadcrumb: scrubBreadcrumb
|
|
26
34
|
});
|
|
27
35
|
return new SentryErrorReporter(sentry);
|
|
28
36
|
}
|
|
@@ -41,9 +49,14 @@ export class SentryErrorReporter {
|
|
|
41
49
|
tags.route = context.route;
|
|
42
50
|
if (context?.orgId)
|
|
43
51
|
tags.orgId = context.orgId;
|
|
52
|
+
if (context?.kind)
|
|
53
|
+
tags.kind = context.kind;
|
|
44
54
|
this.sentry.captureException(error, {
|
|
45
55
|
tags,
|
|
46
|
-
user: context?.userId ? { id: context.userId } : undefined
|
|
56
|
+
user: context?.userId ? { id: context.userId } : undefined,
|
|
57
|
+
...(context?.level && { level: context.level }),
|
|
58
|
+
// One issue per fault kind, split as Sentry would split it by stack.
|
|
59
|
+
...(context?.kind && { fingerprint: ['{{ default }}', context.kind] })
|
|
47
60
|
});
|
|
48
61
|
}
|
|
49
62
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SentryErrorReporter.js","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SentryErrorReporter.js","sourceRoot":"","sources":["../../src/errors/SentryErrorReporter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkCrE,MAAM,OAAO,mBAAmB;IACM;IAArC,YAAqC,MAAkB;QAAlB,WAAM,GAAN,MAAM,CAAY;IAAG,CAAC;IAE3D,6FAA6F;IAC7F,MAAM,CAAC,UAAU,CAAC,MAAkB;QACnC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAMnB;QACA,IAAI,CAAC;YACJ,wEAAwE;YACxE,uEAAuE;YACvE,oEAAoE;YACpE,kEAAkE;YAClE,6DAA6D;YAC7D,sEAAsE;YACtE,MAAM,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAA8B,CAAC;YAC9F,MAAM,CAAC,IAAI,CAAC;gBACX,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,gBAAgB,EACf,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ;oBACxC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBAC3C,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC;gBACrC,UAAU,EAAE,UAAU;gBACtB,qBAAqB,EAAE,UAAU;gBACjC,gBAAgB,EAAE,eAAe;aACjC,CAAC,CAAC;YACH,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CACZ,4EAA4E;gBAC3E,+EAA+E,EAChF,GAAG,CACH,CAAC;YACF,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,CAAC,KAAc,EAAE,OAAsB;QAC7C,IAAI,CAAC;YACJ,MAAM,IAAI,GAA2B,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1D,IAAI,OAAO,EAAE,MAAM;gBAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAClD,IAAI,OAAO,EAAE,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC/C,IAAI,OAAO,EAAE,KAAK;gBAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;YAC/C,IAAI,OAAO,EAAE,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE;gBACnC,IAAI;gBACJ,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;gBAC1D,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC/C,qEAAqE;gBACrE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;aACtE,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,kEAAkE;YAClE,uCAAuC;YACvC,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;IACF,CAAC;CACD"}
|
package/dist/errors/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { SentryErrorReporter } from './SentryErrorReporter.js';
|
|
1
|
+
export { SentryErrorReporter, type SentryLike } from './SentryErrorReporter.js';
|
|
2
|
+
export { sampleRate, scrubBreadcrumb, scrubEvent, withoutQuery, type ScrubbableBreadcrumb, type ScrubbableEvent } from './scrub.js';
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EACN,UAAU,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,MAAM,YAAY,CAAC"}
|
package/dist/errors/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
// Error reporting
|
|
1
|
+
// Error reporting: the Sentry-backed IErrorReporter (optional @sentry/node peer) and the
|
|
2
|
+
// scrubbing hooks any Sentry SDK takes, server or browser.
|
|
2
3
|
export { SentryErrorReporter } from './SentryErrorReporter.js';
|
|
4
|
+
export { sampleRate, scrubBreadcrumb, scrubEvent, withoutQuery } from './scrub.js';
|
|
3
5
|
//# sourceMappingURL=index.js.map
|
package/dist/errors/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,2DAA2D;AAE3D,OAAO,EAAE,mBAAmB,EAAmB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EACN,UAAU,EACV,eAAe,EACf,UAAU,EACV,YAAY,EAGZ,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an error tracker may receive: identifiers, never payloads. Applied to Sentry-shaped
|
|
3
|
+
* events (`beforeSend`, `beforeSendTransaction`, `beforeBreadcrumb`) without importing Sentry,
|
|
4
|
+
* so a host wires them into whichever SDK it runs, server or browser.
|
|
5
|
+
*
|
|
6
|
+
* No cookie, auth header, API key, request body or query string leaves: a query carries share
|
|
7
|
+
* tokens and search text, a body definitions and inputs. A user is its id. Console breadcrumbs
|
|
8
|
+
* stay local, since they can quote any of the above.
|
|
9
|
+
*/
|
|
10
|
+
/** The parts of a Sentry event these read. Structural, so any SDK version's events fit. */
|
|
11
|
+
export interface ScrubbableEvent {
|
|
12
|
+
request?: {
|
|
13
|
+
url?: string;
|
|
14
|
+
cookies?: unknown;
|
|
15
|
+
data?: unknown;
|
|
16
|
+
query_string?: unknown;
|
|
17
|
+
headers?: Record<string, string>;
|
|
18
|
+
};
|
|
19
|
+
user?: {
|
|
20
|
+
id?: string | number;
|
|
21
|
+
} & Record<string, unknown>;
|
|
22
|
+
breadcrumbs?: ScrubbableBreadcrumb[];
|
|
23
|
+
transaction?: string;
|
|
24
|
+
spans?: {
|
|
25
|
+
description?: string;
|
|
26
|
+
data?: Record<string, unknown>;
|
|
27
|
+
}[];
|
|
28
|
+
}
|
|
29
|
+
export interface ScrubbableBreadcrumb {
|
|
30
|
+
category?: string;
|
|
31
|
+
data?: Record<string, unknown>;
|
|
32
|
+
}
|
|
33
|
+
/** `https://h/p?q=1#f` → `https://h/p`; a relative path likewise. Anything else as it was. */
|
|
34
|
+
export declare function withoutQuery(url: string): string;
|
|
35
|
+
export declare function scrubBreadcrumb<B extends ScrubbableBreadcrumb>(crumb: B): B | null;
|
|
36
|
+
/** For `beforeSend` and `beforeSendTransaction` alike. Mutates and returns `event`. */
|
|
37
|
+
export declare function scrubEvent<E extends ScrubbableEvent>(event: E): E;
|
|
38
|
+
/** A sample-rate env value → 0–1; unset or unreadable is 0, out of range clamped. */
|
|
39
|
+
export declare function sampleRate(raw: string | undefined): number;
|
|
40
|
+
//# sourceMappingURL=scrub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.d.ts","sourceRoot":"","sources":["../../src/errors/scrub.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,2FAA2F;AAC3F,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACjC,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,CAAC;CACnE;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAMD,8FAA8F;AAC9F,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGhD;AAYD,wBAAgB,eAAe,CAAC,CAAC,SAAS,oBAAoB,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAIlF;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAuBjE;AAED,qFAAqF;AACrF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG1D"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What an error tracker may receive: identifiers, never payloads. Applied to Sentry-shaped
|
|
3
|
+
* events (`beforeSend`, `beforeSendTransaction`, `beforeBreadcrumb`) without importing Sentry,
|
|
4
|
+
* so a host wires them into whichever SDK it runs, server or browser.
|
|
5
|
+
*
|
|
6
|
+
* No cookie, auth header, API key, request body or query string leaves: a query carries share
|
|
7
|
+
* tokens and search text, a body definitions and inputs. A user is its id. Console breadcrumbs
|
|
8
|
+
* stay local, since they can quote any of the above.
|
|
9
|
+
*/
|
|
10
|
+
// Headers that say what the request was, never who sent it.
|
|
11
|
+
const KEPT_HEADERS = new Set(['accept', 'content-type', 'content-length', 'user-agent']);
|
|
12
|
+
const URL_KEYS = ['url', 'to', 'from', 'http.url', 'server.address.full'];
|
|
13
|
+
/** `https://h/p?q=1#f` → `https://h/p`; a relative path likewise. Anything else as it was. */
|
|
14
|
+
export function withoutQuery(url) {
|
|
15
|
+
const cut = url.search(/[?#]/);
|
|
16
|
+
return cut === -1 ? url : url.slice(0, cut);
|
|
17
|
+
}
|
|
18
|
+
function scrubData(data) {
|
|
19
|
+
if (!data)
|
|
20
|
+
return;
|
|
21
|
+
for (const key of URL_KEYS) {
|
|
22
|
+
const value = data[key];
|
|
23
|
+
if (typeof value === 'string')
|
|
24
|
+
data[key] = withoutQuery(value);
|
|
25
|
+
}
|
|
26
|
+
delete data['http.query'];
|
|
27
|
+
delete data['http.fragment'];
|
|
28
|
+
}
|
|
29
|
+
export function scrubBreadcrumb(crumb) {
|
|
30
|
+
if (crumb.category === 'console')
|
|
31
|
+
return null;
|
|
32
|
+
scrubData(crumb.data);
|
|
33
|
+
return crumb;
|
|
34
|
+
}
|
|
35
|
+
/** For `beforeSend` and `beforeSendTransaction` alike. Mutates and returns `event`. */
|
|
36
|
+
export function scrubEvent(event) {
|
|
37
|
+
const request = event.request;
|
|
38
|
+
if (request) {
|
|
39
|
+
delete request.cookies;
|
|
40
|
+
delete request.data;
|
|
41
|
+
delete request.query_string;
|
|
42
|
+
if (request.url)
|
|
43
|
+
request.url = withoutQuery(request.url);
|
|
44
|
+
if (request.headers) {
|
|
45
|
+
request.headers = Object.fromEntries(Object.entries(request.headers).filter(([k]) => KEPT_HEADERS.has(k.toLowerCase())));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (event.user)
|
|
49
|
+
event.user = event.user.id === undefined ? {} : { id: event.user.id };
|
|
50
|
+
if (event.breadcrumbs) {
|
|
51
|
+
event.breadcrumbs = event.breadcrumbs.flatMap((b) => scrubBreadcrumb(b) ?? []);
|
|
52
|
+
}
|
|
53
|
+
for (const span of event.spans ?? []) {
|
|
54
|
+
if (span.description)
|
|
55
|
+
span.description = withoutQuery(span.description);
|
|
56
|
+
scrubData(span.data);
|
|
57
|
+
}
|
|
58
|
+
if (event.transaction)
|
|
59
|
+
event.transaction = withoutQuery(event.transaction);
|
|
60
|
+
return event;
|
|
61
|
+
}
|
|
62
|
+
/** A sample-rate env value → 0–1; unset or unreadable is 0, out of range clamped. */
|
|
63
|
+
export function sampleRate(raw) {
|
|
64
|
+
const rate = Number(raw);
|
|
65
|
+
return raw !== undefined && Number.isFinite(rate) ? Math.min(1, Math.max(0, rate)) : 0;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=scrub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub.js","sourceRoot":"","sources":["../../src/errors/scrub.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { type ApiTokenLifetimeDays, type ApiTokenRevokeReason, type ApiTokenSummary, type IApiTokenStore, type ILogger, type ListOptions, type Page, type RequestContext } from '@selvajs/platform';
|
|
12
12
|
import type { ApiHandler, ApiRequest } from '../api/index.js';
|
|
13
|
+
import type { ApiTokenResolutionCache } from '../http/api-token.js';
|
|
13
14
|
/**
|
|
14
15
|
* May `ctx` hold a key with `scopes`, by the host's policy or the default rule?
|
|
15
16
|
* The one call every mint path makes, so a host's token page and its consent
|
|
@@ -74,5 +75,7 @@ export declare const revokeOwnApiToken: ApiHandler;
|
|
|
74
75
|
export declare function revokeUserApiTokens(store: IApiTokenStore | undefined, ctx: RequestContext, userId: string, opts: {
|
|
75
76
|
orgId?: string;
|
|
76
77
|
reason: ApiTokenRevokeReason;
|
|
78
|
+
/** Dropped from first, so this instance stops answering the keys at once. */
|
|
79
|
+
resolutionCache?: ApiTokenResolutionCache;
|
|
77
80
|
}, log: ILogger): Promise<void>;
|
|
78
81
|
//# sourceMappingURL=apiTokens.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiTokens.d.ts","sourceRoot":"","sources":["../../src/handlers/apiTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAKN,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,MAAM,mBAAmB,CAAC;AAiB3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"apiTokens.d.ts","sourceRoot":"","sources":["../../src/handlers/apiTokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAKN,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,cAAc,EACnB,MAAM,mBAAmB,CAAC;AAiB3B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAepE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EACxB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,OAAO,CAAC,CAElB;AAkBD,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAMrE,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,GAAI,KAAK,cAAc,KAAG,OACrB,CAAC;AAE1C;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,MAAM,EACb,EAAE,MAAc,EAAE,GAAG,IAAI,EAAE,GAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAS5B;AAyED,wGAAwG;AACxG,eAAO,MAAM,aAAa,EAAE,UAO3B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CACjC,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,iBAAiB,GACtB,OAAO,CAAC,cAAc,CAAC,CAkDzB;AAED,2FAA2F;AAC3F,eAAO,MAAM,cAAc,EAAE,UAQ5B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,UAa5B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,UAY/B,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,oBAAoB,CAAC;IAC7B,6EAA6E;IAC7E,eAAe,CAAC,EAAE,uBAAuB,CAAC;CAC1C,EACD,GAAG,EAAE,OAAO,GACV,OAAO,CAAC,IAAI,CAAC,CAmBf"}
|