@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
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request timing: where a request's wall time went, as named spans plus every outbound
|
|
3
|
+
* fetch grouped by upstream. One AsyncLocalStorage store per request, opened by `timeRequest`
|
|
4
|
+
* in the host's handle hook. The result goes out twice: a `Server-Timing` header on the
|
|
5
|
+
* response, and one structured record through `log` for a request that is slow, sampled, or the
|
|
6
|
+
* first the process served.
|
|
7
|
+
*
|
|
8
|
+
* Fetch time is time to response headers, not body: round-trip latency, which a chain of
|
|
9
|
+
* sequential awaits multiplies. Parallel fetches overlap, so a bucket's `ms` is a sum and can
|
|
10
|
+
* exceed the request's wall time.
|
|
11
|
+
*/
|
|
12
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
const round = (ms) => Math.round(ms);
|
|
15
|
+
function median(values) {
|
|
16
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
17
|
+
const mid = sorted.length >> 1;
|
|
18
|
+
return sorted.length % 2 ? sorted[mid] : (sorted[mid - 1] + sorted[mid]) / 2;
|
|
19
|
+
}
|
|
20
|
+
function urlOf(input) {
|
|
21
|
+
try {
|
|
22
|
+
return new URL(input instanceof Request ? input.url : String(input));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function isRetry(init) {
|
|
29
|
+
const headers = init?.headers;
|
|
30
|
+
if (!headers)
|
|
31
|
+
return false;
|
|
32
|
+
if (headers instanceof Headers)
|
|
33
|
+
return headers.has('x-retry-count');
|
|
34
|
+
if (Array.isArray(headers))
|
|
35
|
+
return headers.some(([k]) => k.toLowerCase() === 'x-retry-count');
|
|
36
|
+
return Object.keys(headers).some((k) => k.toLowerCase() === 'x-retry-count');
|
|
37
|
+
}
|
|
38
|
+
/** Parses a `Server-Timing` value into `{ name: ms }`, a desc-only entry into `{ name: desc }`. */
|
|
39
|
+
export function parseServerTimingHeader(header) {
|
|
40
|
+
const out = {};
|
|
41
|
+
for (const entry of header?.split(',') ?? []) {
|
|
42
|
+
const [name, ...params] = entry.trim().split(';');
|
|
43
|
+
if (!name)
|
|
44
|
+
continue;
|
|
45
|
+
for (const p of params) {
|
|
46
|
+
const [k, v = ''] = p.trim().split('=');
|
|
47
|
+
if (k === 'dur')
|
|
48
|
+
out[name] = round(Number(v));
|
|
49
|
+
else if (k === 'desc' && !(name in out))
|
|
50
|
+
out[name] = v.replace(/^"|"$/g, '');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
export function createRequestTiming(options) {
|
|
56
|
+
const slowMs = options.slowMs ?? 200;
|
|
57
|
+
const sampleRate = options.sampleRate ?? 0.1;
|
|
58
|
+
const labels = { instance: randomUUID().slice(0, 8), ...options.labels };
|
|
59
|
+
const als = new AsyncLocalStorage();
|
|
60
|
+
let bootMs = null;
|
|
61
|
+
let served = false;
|
|
62
|
+
let installed = false;
|
|
63
|
+
const log = (message, fields) => {
|
|
64
|
+
try {
|
|
65
|
+
options.log(message, { ...labels, ...fields });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Telemetry never fails a request.
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
function upstreamOf(url) {
|
|
72
|
+
if (!url)
|
|
73
|
+
return { key: 'other' };
|
|
74
|
+
return options.upstream?.(url) ?? { key: url.host };
|
|
75
|
+
}
|
|
76
|
+
/** An upstream that times itself (`Server-Timing`) lands on the record by path. */
|
|
77
|
+
function recordUpstreamTiming(store, url, response) {
|
|
78
|
+
const timing = response.headers.get('server-timing');
|
|
79
|
+
if (!timing || !url)
|
|
80
|
+
return;
|
|
81
|
+
const byPath = store.facts.upstreamTiming ?? {};
|
|
82
|
+
byPath[url.pathname] = parseServerTimingHeader(timing);
|
|
83
|
+
store.facts.upstreamTiming = byPath;
|
|
84
|
+
}
|
|
85
|
+
function serverTiming(store, totalMs) {
|
|
86
|
+
const parts = store.spans.map((s) => `app_${s.name.replace(/[^\w-]/g, '_')};dur=${s.ms.toFixed(1)}`);
|
|
87
|
+
for (const [key, b] of store.upstream) {
|
|
88
|
+
parts.push(`up;desc="${key} x${b.count}";dur=${b.ms.toFixed(1)}`);
|
|
89
|
+
}
|
|
90
|
+
if (store.retries > 0)
|
|
91
|
+
parts.push(`retries;desc="${store.retries}"`);
|
|
92
|
+
parts.push(`app_total;dur=${totalMs.toFixed(1)}`);
|
|
93
|
+
return parts.join(', ');
|
|
94
|
+
}
|
|
95
|
+
function logTiming(req, status, totalMs, store, sampled) {
|
|
96
|
+
const upstream = Object.fromEntries([...store.upstream].map(([k, b]) => [
|
|
97
|
+
k,
|
|
98
|
+
{
|
|
99
|
+
count: b.count,
|
|
100
|
+
ms: round(b.ms),
|
|
101
|
+
p50: round(median(b.calls)),
|
|
102
|
+
max: round(Math.max(...b.calls))
|
|
103
|
+
}
|
|
104
|
+
]));
|
|
105
|
+
// A span name that ran more than once sums.
|
|
106
|
+
const spans = {};
|
|
107
|
+
for (const s of store.spans)
|
|
108
|
+
spans[s.name] = round((spans[s.name] ?? 0) + s.ms);
|
|
109
|
+
log(`[timing] ${req.method} ${req.route}${req.isDataRequest ? ' (data)' : ''} ${status} ${round(totalMs)}ms`, {
|
|
110
|
+
timing: {
|
|
111
|
+
route: req.route,
|
|
112
|
+
method: req.method,
|
|
113
|
+
data: req.isDataRequest ?? false,
|
|
114
|
+
status,
|
|
115
|
+
totalMs: round(totalMs),
|
|
116
|
+
...(store.cold && { cold: true }),
|
|
117
|
+
...(sampled && { sampled: true }),
|
|
118
|
+
spans,
|
|
119
|
+
upstream,
|
|
120
|
+
calls: Object.fromEntries(store.targets),
|
|
121
|
+
...(store.retries > 0 && { retries: store.retries }),
|
|
122
|
+
...store.facts
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
async timeRequest(req, fn) {
|
|
128
|
+
const cold = !served;
|
|
129
|
+
served = true;
|
|
130
|
+
const store = {
|
|
131
|
+
spans: [],
|
|
132
|
+
upstream: new Map(),
|
|
133
|
+
targets: new Map(),
|
|
134
|
+
retries: 0,
|
|
135
|
+
facts: {},
|
|
136
|
+
cold
|
|
137
|
+
};
|
|
138
|
+
const start = performance.now();
|
|
139
|
+
if (cold) {
|
|
140
|
+
// Process start to `markBooted`, and to this request: their gap is idle time.
|
|
141
|
+
log(`[coldstart] ${req.method} ${req.route}`, {
|
|
142
|
+
coldstart: { bootMs, firstRequestMs: round(start), route: req.route }
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
let status = 'thrown';
|
|
146
|
+
try {
|
|
147
|
+
const response = await als.run(store, fn);
|
|
148
|
+
status = response.status;
|
|
149
|
+
try {
|
|
150
|
+
response.headers.append('Server-Timing', serverTiming(store, performance.now() - start));
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Immutable headers (a fetched Response passed through): the record still has it.
|
|
154
|
+
}
|
|
155
|
+
return response;
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
const totalMs = performance.now() - start;
|
|
159
|
+
const sampled = Math.random() < sampleRate;
|
|
160
|
+
// The cold request always: a comparison across a change must be able to drop it.
|
|
161
|
+
if (cold || sampled || totalMs >= slowMs)
|
|
162
|
+
logTiming(req, status, totalMs, store, sampled);
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
async span(name, fn) {
|
|
166
|
+
const store = als.getStore();
|
|
167
|
+
if (!store)
|
|
168
|
+
return fn();
|
|
169
|
+
const start = performance.now();
|
|
170
|
+
try {
|
|
171
|
+
return await fn();
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
store.spans.push({ name, ms: performance.now() - start });
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
fact(facts) {
|
|
178
|
+
const store = als.getStore();
|
|
179
|
+
if (store)
|
|
180
|
+
Object.assign(store.facts, facts);
|
|
181
|
+
},
|
|
182
|
+
isCold: () => als.getStore()?.cold ?? false,
|
|
183
|
+
markBooted() {
|
|
184
|
+
bootMs ??= round(performance.now());
|
|
185
|
+
},
|
|
186
|
+
instrumentFetch() {
|
|
187
|
+
if (installed)
|
|
188
|
+
return;
|
|
189
|
+
installed = true;
|
|
190
|
+
const original = globalThis.fetch;
|
|
191
|
+
globalThis.fetch = async (input, init) => {
|
|
192
|
+
const store = als.getStore();
|
|
193
|
+
if (!store)
|
|
194
|
+
return original(input, init);
|
|
195
|
+
const start = performance.now();
|
|
196
|
+
const url = urlOf(input);
|
|
197
|
+
const { key, target } = upstreamOf(url);
|
|
198
|
+
if (target)
|
|
199
|
+
store.targets.set(target, (store.targets.get(target) ?? 0) + 1);
|
|
200
|
+
if (isRetry(init))
|
|
201
|
+
store.retries += 1;
|
|
202
|
+
try {
|
|
203
|
+
const response = await original(input, init);
|
|
204
|
+
recordUpstreamTiming(store, url, response);
|
|
205
|
+
return response;
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
const bucket = store.upstream.get(key) ?? { count: 0, ms: 0, calls: [] };
|
|
209
|
+
const ms = performance.now() - start;
|
|
210
|
+
bucket.count += 1;
|
|
211
|
+
bucket.ms += ms;
|
|
212
|
+
bucket.calls.push(ms);
|
|
213
|
+
store.upstream.set(key, bucket);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=request-timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-timing.js","sourceRoot":"","sources":["../../src/http/request-timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turns a session token into whatever a host attaches to a request, with the round trips that
|
|
3
|
+
* cost cut to what the token needs.
|
|
4
|
+
*
|
|
5
|
+
* - The user's rows are read beside `verify`, keyed by the token's unverified subject, and kept
|
|
6
|
+
* only when `verify` confirms that same user. `read` must be a read: it runs before the token
|
|
7
|
+
* is checked, so it must not write anything for the subject it is handed.
|
|
8
|
+
* - Requests carrying one token share one resolution while it runs.
|
|
9
|
+
* - With `freshForMs`, a resolved session is reused for that long. Past it the session is still
|
|
10
|
+
* answered, and resolved again behind the request; a re-check that refuses the token drops it,
|
|
11
|
+
* so after a sign-out or disable the requests already in flight are the last to get through.
|
|
12
|
+
* A session is never answered past its token's expiry, so row security never sees an expired
|
|
13
|
+
* token mid-request.
|
|
14
|
+
*/
|
|
15
|
+
import type { AuthUser } from '@selvajs/platform';
|
|
16
|
+
export interface SessionResolverConfig<Rows, Session> {
|
|
17
|
+
/** The token's user, or null for a token it refuses. */
|
|
18
|
+
verify(token: string): Promise<AuthUser | null>;
|
|
19
|
+
/** Everything the session needs that is keyed by the user id alone. Never a write. */
|
|
20
|
+
read(userId: string): Promise<Rows>;
|
|
21
|
+
/** The session from the verified user and its rows. Writes for the user belong here. */
|
|
22
|
+
build(user: AuthUser, rows: Rows, token: string): Promise<Session> | Session;
|
|
23
|
+
/**
|
|
24
|
+
* How long a resolved session is reused before a request re-checks it behind its answer.
|
|
25
|
+
* 0 (the default) keeps nothing between requests: every request resolves.
|
|
26
|
+
*/
|
|
27
|
+
freshForMs?: number;
|
|
28
|
+
/** The cap on remembered sessions; the oldest go first. Default 5,000. */
|
|
29
|
+
maxEntries?: number;
|
|
30
|
+
/** The token's subject, unverified: which rows to read ahead. Default: a JWT's `sub`. */
|
|
31
|
+
subjectOf?: (token: string) => string | null;
|
|
32
|
+
/** The token's expiry in ms epoch, unverified. Default: a JWT's `exp`. Null: unknown. */
|
|
33
|
+
expiresAtOf?: (token: string) => number | null;
|
|
34
|
+
/** A background re-check that threw rather than refused. The session is kept. */
|
|
35
|
+
onRefreshError?: (err: unknown) => void;
|
|
36
|
+
now?: () => number;
|
|
37
|
+
}
|
|
38
|
+
export interface SessionResolver<Session> {
|
|
39
|
+
/** The token's session, or null when `verify` refuses it. */
|
|
40
|
+
resolve(token: string): Promise<Session | null>;
|
|
41
|
+
/** Forget one token's session: after a sign-out, or a change to what it holds. */
|
|
42
|
+
invalidate(token: string): void;
|
|
43
|
+
/** Forget every session of `userId`: after a change to their permissions or memberships. */
|
|
44
|
+
invalidateUser(userId: string): void;
|
|
45
|
+
clear(): void;
|
|
46
|
+
}
|
|
47
|
+
export declare function createSessionResolver<Rows, Session>(config: SessionResolverConfig<Rows, Session>): SessionResolver<Session>;
|
|
48
|
+
//# sourceMappingURL=session-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-resolver.d.ts","sourceRoot":"","sources":["../../src/http/session-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,qBAAqB,CAAC,IAAI,EAAE,OAAO;IACnD,wDAAwD;IACxD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAChD,sFAAsF;IACtF,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,wFAAwF;IACxF,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7E;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yFAAyF;IACzF,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC7C,yFAAyF;IACzF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC/C,iFAAiF;IACjF,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe,CAAC,OAAO;IACvC,6DAA6D;IAC7D,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAChD,kFAAkF;IAClF,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4FAA4F;IAC5F,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,KAAK,IAAI,IAAI,CAAC;CACd;AAYD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,EAClD,MAAM,EAAE,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,GAC1C,eAAe,CAAC,OAAO,CAAC,CAyF1B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Turns a session token into whatever a host attaches to a request, with the round trips that
|
|
3
|
+
* cost cut to what the token needs.
|
|
4
|
+
*
|
|
5
|
+
* - The user's rows are read beside `verify`, keyed by the token's unverified subject, and kept
|
|
6
|
+
* only when `verify` confirms that same user. `read` must be a read: it runs before the token
|
|
7
|
+
* is checked, so it must not write anything for the subject it is handed.
|
|
8
|
+
* - Requests carrying one token share one resolution while it runs.
|
|
9
|
+
* - With `freshForMs`, a resolved session is reused for that long. Past it the session is still
|
|
10
|
+
* answered, and resolved again behind the request; a re-check that refuses the token drops it,
|
|
11
|
+
* so after a sign-out or disable the requests already in flight are the last to get through.
|
|
12
|
+
* A session is never answered past its token's expiry, so row security never sees an expired
|
|
13
|
+
* token mid-request.
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_MAX_ENTRIES = 5_000;
|
|
16
|
+
export function createSessionResolver(config) {
|
|
17
|
+
const freshForMs = Math.max(0, config.freshForMs ?? 0);
|
|
18
|
+
const maxEntries = Math.max(1, config.maxEntries ?? DEFAULT_MAX_ENTRIES);
|
|
19
|
+
const subjectOf = config.subjectOf ?? jwtSubject;
|
|
20
|
+
const expiresAtOf = config.expiresAtOf ?? jwtExpiresAt;
|
|
21
|
+
const now = config.now ?? Date.now;
|
|
22
|
+
const entries = new Map();
|
|
23
|
+
const inFlight = new Map();
|
|
24
|
+
async function build(token) {
|
|
25
|
+
const subject = subjectOf(token);
|
|
26
|
+
const ahead = subject ? config.read(subject) : null;
|
|
27
|
+
// A token that fails verification never awaits its read-ahead.
|
|
28
|
+
ahead?.catch(() => { });
|
|
29
|
+
const user = await config.verify(token);
|
|
30
|
+
if (!user)
|
|
31
|
+
return null;
|
|
32
|
+
const rows = ahead && user.id === subject ? await ahead : await config.read(user.id);
|
|
33
|
+
const session = await config.build(user, rows, token);
|
|
34
|
+
const resolvedAt = now();
|
|
35
|
+
const expiresAt = expiresAtOf(token);
|
|
36
|
+
return {
|
|
37
|
+
session,
|
|
38
|
+
userId: user.id,
|
|
39
|
+
resolvedAt,
|
|
40
|
+
until: expiresAt ?? resolvedAt + freshForMs
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function remember(token, entry) {
|
|
44
|
+
if (freshForMs === 0 || entry.until <= now())
|
|
45
|
+
return;
|
|
46
|
+
if (entries.size >= maxEntries) {
|
|
47
|
+
const at = now();
|
|
48
|
+
for (const [key, e] of entries)
|
|
49
|
+
if (e.until <= at)
|
|
50
|
+
entries.delete(key);
|
|
51
|
+
// Map keeps insertion order, so the first key is the oldest.
|
|
52
|
+
while (entries.size >= maxEntries)
|
|
53
|
+
entries.delete(entries.keys().next().value);
|
|
54
|
+
}
|
|
55
|
+
entries.delete(token);
|
|
56
|
+
entries.set(token, entry);
|
|
57
|
+
}
|
|
58
|
+
function start(token) {
|
|
59
|
+
const resolution = build(token).then((entry) => {
|
|
60
|
+
// An invalidation while it ran dropped this resolution: what it read may be stale.
|
|
61
|
+
if (inFlight.get(token) === resolution) {
|
|
62
|
+
if (entry)
|
|
63
|
+
remember(token, entry);
|
|
64
|
+
else
|
|
65
|
+
entries.delete(token);
|
|
66
|
+
}
|
|
67
|
+
return entry;
|
|
68
|
+
});
|
|
69
|
+
inFlight.set(token, resolution);
|
|
70
|
+
const settle = () => {
|
|
71
|
+
if (inFlight.get(token) === resolution)
|
|
72
|
+
inFlight.delete(token);
|
|
73
|
+
};
|
|
74
|
+
resolution.then(settle, settle);
|
|
75
|
+
return resolution;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
async resolve(token) {
|
|
79
|
+
if (!token)
|
|
80
|
+
return null;
|
|
81
|
+
const entry = entries.get(token);
|
|
82
|
+
if (entry) {
|
|
83
|
+
const at = now();
|
|
84
|
+
if (entry.until <= at) {
|
|
85
|
+
entries.delete(token);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
if (at - entry.resolvedAt >= freshForMs && !inFlight.has(token)) {
|
|
89
|
+
start(token).catch((err) => config.onRefreshError?.(err));
|
|
90
|
+
}
|
|
91
|
+
return entry.session;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const resolved = await (inFlight.get(token) ?? start(token));
|
|
95
|
+
return resolved?.session ?? null;
|
|
96
|
+
},
|
|
97
|
+
invalidate(token) {
|
|
98
|
+
entries.delete(token);
|
|
99
|
+
inFlight.delete(token);
|
|
100
|
+
},
|
|
101
|
+
invalidateUser(userId) {
|
|
102
|
+
for (const [token, entry] of entries)
|
|
103
|
+
if (entry.userId === userId)
|
|
104
|
+
entries.delete(token);
|
|
105
|
+
// A resolution under way may hold the user's old rows; none of them is kept.
|
|
106
|
+
inFlight.clear();
|
|
107
|
+
},
|
|
108
|
+
clear() {
|
|
109
|
+
entries.clear();
|
|
110
|
+
inFlight.clear();
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// ============================================================================
|
|
115
|
+
// Unverified JWT claims
|
|
116
|
+
// ============================================================================
|
|
117
|
+
function jwtClaims(token) {
|
|
118
|
+
const parts = token.split('.');
|
|
119
|
+
if (parts.length !== 3 || !parts[1])
|
|
120
|
+
return null;
|
|
121
|
+
try {
|
|
122
|
+
const claims = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
|
|
123
|
+
return claims && typeof claims === 'object' ? claims : null;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function jwtSubject(token) {
|
|
130
|
+
const sub = jwtClaims(token)?.sub;
|
|
131
|
+
return typeof sub === 'string' && sub ? sub : null;
|
|
132
|
+
}
|
|
133
|
+
function jwtExpiresAt(token) {
|
|
134
|
+
const exp = jwtClaims(token)?.exp;
|
|
135
|
+
return typeof exp === 'number' ? exp * 1000 : null;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=session-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-resolver.js","sourceRoot":"","sources":["../../src/http/session-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ export interface TestHarness {
|
|
|
23
23
|
/** Folds host domain errors into the envelope, exactly as the host's adapter does. */
|
|
24
24
|
mapError?: (err: unknown) => ApiError | undefined;
|
|
25
25
|
/** Overrides merged onto the deps `callHandler` builds — token codecs, services, upload caps, limiters. */
|
|
26
|
-
deps?: Partial<Pick<SelvaDeps, 'tokens' | 'uploadLimits' | 'services' | 'projectCreateLimiter'>>;
|
|
26
|
+
deps?: Partial<Pick<SelvaDeps, 'tokens' | 'uploadLimits' | 'services' | 'projectCreateLimiter' | 'onComputeConfigSaved'>>;
|
|
27
27
|
log?: ILogger;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/testing/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAIN,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EACX,QAAQ,EACR,UAAU,EAEV,iBAAiB,EACjB,SAAS,EACT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,SAAS,CAAC;IAClD,2GAA2G;IAC3G,IAAI,CAAC,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../src/testing/harness.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/harness.js
CHANGED
|
@@ -288,7 +288,8 @@ export async function callHandler(handler, opts) {
|
|
|
288
288
|
deps: depsFromConfig(locals.providers, h.deps?.services ?? {}, {
|
|
289
289
|
tokens: h.deps?.tokens,
|
|
290
290
|
uploadLimits: h.deps?.uploadLimits,
|
|
291
|
-
projectCreateLimiter: h.deps?.projectCreateLimiter
|
|
291
|
+
projectCreateLimiter: h.deps?.projectCreateLimiter,
|
|
292
|
+
onComputeConfigSaved: h.deps?.onComputeConfigSaved
|
|
292
293
|
})
|
|
293
294
|
};
|
|
294
295
|
return readResponse(await runHandler(handler, req, { fallback: 'Test', mapError: h.mapError, ...opts.mount }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/testing/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACN,cAAc,EACd,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,EAiBZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../src/testing/harness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACN,cAAc,EACd,uBAAuB,EACvB,6BAA6B,EAC7B,YAAY,EAiBZ,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAkBjE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAY;IACjC,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;CACA,CAAC;AAWxB,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,CAAc,EACd,KAAa,EACb,sBAA4C,EAAE;IAE9C,4EAA4E;IAC5E,4EAA4E;IAC5E,sBAAsB;IACtB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACrD,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAChF,CAAC;IACD,6EAA6E;IAC7E,4EAA4E;IAC5E,yDAAyD;IACzD,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,CAAc,EACd,IAAqD;IAErD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,GAAG,GAAiB;QACzB,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,OAAO;QACvB,SAAS,EAAE,IAAI,CAAC,OAAO;QACvB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI;KACf,CAAC;IACF,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,CAAc,EACd,IAAqF;IAErF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAc;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI;KACf,CAAC;IACF,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,CAAc,EACd,IAOC;IAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,OAAO,GAAY;QACxB,EAAE,EAAE,UAAU,EAAE;QAChB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;QACxC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,SAAS,EAAE,IAAI,CAAC,OAAO;QACvB,SAAS,EAAE,IAAI,CAAC,OAAO;QACvB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,KAAK;QAChD,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI;KACf,CAAC;IACF,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE;QAC7D,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,CAAC,OAAO;QACvB,SAAS,EAAE,IAAI;KACf,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,CAAc,EACd,IAA8D;IAE9D,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,MAAM,GAAkB;QAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,IAAI,CAAC,MAAM;QACtB,SAAS,EAAE,IAAI;KACf,CAAC;IACF,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IACtE,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,CAAc,EACd,MAAc,EACd,KAA2B;IAE3B,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACpE,CAAC;AAWD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,CAAc,EACd,IAOC;IAED,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC;IAC9C,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAE/F,MAAM,KAAK,GAA2B;QACrC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU,EAAE;QAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,iBAAiB;QAClD,gBAAgB,EAAE,SAAS;KAC3B,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACvD,4EAA4E;IAC5E,MAAM,GAAG,GAAmB;QAC3B,MAAM,EAAE,IAAI,CAAC,OAAO;QACpB,WAAW,EAAE,SAAS;QACtB,mBAAmB,EAAE,CAAC,gBAAgB,CAAC;QACvC,cAAc,EAAE,EAAE;KAClB,CAAC;IACF,MAAM,MAAM,GAAG;QACd,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;KACJ,CAAC;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAOD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,CAAc,EACd,IAOC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAE7F,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;IACtC,MAAM,IAAI,GAAc;QACvB,EAAE,EAAE,UAAU,EAAE;QAChB,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM;QAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;QACpC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;QACjC,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;QACxF,UAAU,EAAE,CAAC;KACb,CAAC;IACF,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CACpC;QACC,MAAM,EAAE,IAAI,CAAC,SAAS;QACtB,WAAW,EAAE,SAAS;QACtB,mBAAmB,EAAE,CAAC,gBAAgB,CAAC;QACvC,cAAc,EAAE,EAAE;KAClB,EACD,IAAI,CACJ,CAAC;IACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;;;;;;;GAQG;AACH,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAW9D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,CAAc,EAAE,MAAc;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,EAAE,CAAC,CAAC;IAE/D,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,MAAM,GAAG,GAAG,MAAM,mBAAmB,CACpC,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI,EAAE,EACrE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAC5B,CAAC;IAEF,MAAM,OAAO,GACZ,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEhG,OAAO;QACN,IAAI;QACJ,GAAG;QACH,OAAO;QACP,SAAS,EAAE,CAAC,CAAC,MAAM;QACnB,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,SAAS;QACvB,CAAC,OAAO,CAAC,EAAE,CAAC;KACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,CAAc;IAClC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9C,CAAC;AA0BD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAmB,EAAE,IAAqB;IAC3E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;IACtD,MAAM,IAAI,GAAgB;QACzB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACjE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;KAC3B,CAAC;IACF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,mEAAmE;QACnE,mEAAmE;QACnE,IAAI,IAAI,CAAC,IAAI,YAAY,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAkC,CAAC,cAAc,CAAC,KAAK,kBAAkB,CAAC;YAChF,IAAI,CAAC,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,CAAC;IACF,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4D,CAAC;IACjF,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;QACR,uEAAuE;QACvE,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,IAAI,KAAK,CACd,+EAA+E,CAC/E,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAe;QACvB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,SAAS;QACrC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACzB,GAAG;QACH,OAAO,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC;QAC1C,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE;YAC9D,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM;YACtB,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY;YAClC,oBAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB;YAClD,oBAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,oBAAoB;SAClD,CAAC;KACF,CAAC;IAEF,OAAO,YAAY,CAClB,MAAM,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CACzF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAa;IACxC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,GAAG,GAAe,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACrE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;IAC7E,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACJ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACR,kEAAkE;QACnE,CAAC;IACF,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@selvajs/server",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.23",
|
|
4
4
|
"description": "Transport-agnostic server building blocks for apps built on the Selva engine (limits, rate limiting, SSRF guard, remote-definition fetch, definition service + render loader); the solve core lives in @selvajs/solve/server",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "VektorNode",
|
|
@@ -120,10 +120,10 @@
|
|
|
120
120
|
],
|
|
121
121
|
"dependencies": {
|
|
122
122
|
"zod": "^4.6.7",
|
|
123
|
-
"@selvajs/
|
|
124
|
-
"@selvajs/platform": "^1.0.0-beta.9",
|
|
123
|
+
"@selvajs/compute": "^5.0.0-beta.9",
|
|
125
124
|
"@selvajs/schemas": "^5.3.0-beta.3",
|
|
126
|
-
"@selvajs/
|
|
125
|
+
"@selvajs/platform": "^1.0.0-beta.11",
|
|
126
|
+
"@selvajs/notifications": "^0.3.0-beta.11"
|
|
127
127
|
},
|
|
128
128
|
"peerDependencies": {
|
|
129
129
|
"@sentry/node": ">=8",
|
|
@@ -149,7 +149,7 @@
|
|
|
149
149
|
"typescript": "~6.0.3",
|
|
150
150
|
"vitest": "^5.0.5",
|
|
151
151
|
"@selvajs/config": "0.0.4",
|
|
152
|
-
"@selvajs/local-provider": "0.16.0-beta.
|
|
152
|
+
"@selvajs/local-provider": "0.16.0-beta.6"
|
|
153
153
|
},
|
|
154
154
|
"scripts": {
|
|
155
155
|
"build": "tsc",
|