@selvajs/server 0.2.0-beta.3 → 0.2.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +32 -0
- package/dist/compute/client-cache.d.ts.map +1 -1
- package/dist/compute/client-cache.js +6 -0
- package/dist/compute/client-cache.js.map +1 -1
- package/dist/compute/safe-url.d.ts.map +1 -1
- package/dist/compute/safe-url.js +16 -0
- package/dist/compute/safe-url.js.map +1 -1
- package/dist/compute/solve-cache-single-flight.d.ts +8 -1
- package/dist/compute/solve-cache-single-flight.d.ts.map +1 -1
- package/dist/compute/solve-cache-single-flight.js +4 -2
- package/dist/compute/solve-cache-single-flight.js.map +1 -1
- package/dist/compute/solve-pipeline.d.ts.map +1 -1
- package/dist/compute/solve-pipeline.js +3 -1
- package/dist/compute/solve-pipeline.js.map +1 -1
- package/package.json +14 -18
- package/dist/access/__tests__/project-access-input.test.d.ts +0 -2
- package/dist/access/__tests__/project-access-input.test.d.ts.map +0 -1
- package/dist/access/__tests__/project-access-input.test.js +0 -146
- package/dist/access/__tests__/project-access-input.test.js.map +0 -1
- package/dist/compute/__tests__/client-cache.test.d.ts +0 -11
- package/dist/compute/__tests__/client-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/client-cache.test.js +0 -218
- package/dist/compute/__tests__/client-cache.test.js.map +0 -1
- package/dist/compute/__tests__/definition-byte-cache.test.d.ts +0 -2
- package/dist/compute/__tests__/definition-byte-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/definition-byte-cache.test.js +0 -107
- package/dist/compute/__tests__/definition-byte-cache.test.js.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.d.ts +0 -2
- package/dist/compute/__tests__/rate-limit.test.d.ts.map +0 -1
- package/dist/compute/__tests__/rate-limit.test.js +0 -98
- package/dist/compute/__tests__/rate-limit.test.js.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.d.ts +0 -11
- package/dist/compute/__tests__/remote-definition.test.d.ts.map +0 -1
- package/dist/compute/__tests__/remote-definition.test.js +0 -114
- package/dist/compute/__tests__/remote-definition.test.js.map +0 -1
- package/dist/compute/__tests__/safe-url.test.d.ts +0 -2
- package/dist/compute/__tests__/safe-url.test.d.ts.map +0 -1
- package/dist/compute/__tests__/safe-url.test.js +0 -71
- package/dist/compute/__tests__/safe-url.test.js.map +0 -1
- package/dist/compute/__tests__/solve-cache.test.d.ts +0 -13
- package/dist/compute/__tests__/solve-cache.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-cache.test.js +0 -234
- package/dist/compute/__tests__/solve-cache.test.js.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.d.ts +0 -11
- package/dist/compute/__tests__/solve-pipeline.test.d.ts.map +0 -1
- package/dist/compute/__tests__/solve-pipeline.test.js +0 -557
- package/dist/compute/__tests__/solve-pipeline.test.js.map +0 -1
- package/dist/compute/__tests__/transform-input.test.d.ts +0 -14
- package/dist/compute/__tests__/transform-input.test.d.ts.map +0 -1
- package/dist/compute/__tests__/transform-input.test.js +0 -120
- package/dist/compute/__tests__/transform-input.test.js.map +0 -1
- package/dist/definitions/__tests__/definition-service.test.d.ts +0 -14
- package/dist/definitions/__tests__/definition-service.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/definition-service.test.js +0 -95
- package/dist/definitions/__tests__/definition-service.test.js.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.d.ts +0 -8
- package/dist/definitions/__tests__/load-for-render.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/load-for-render.test.js +0 -196
- package/dist/definitions/__tests__/load-for-render.test.js.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.d.ts +0 -11
- package/dist/definitions/__tests__/schema-extraction.test.d.ts.map +0 -1
- package/dist/definitions/__tests__/schema-extraction.test.js +0 -115
- package/dist/definitions/__tests__/schema-extraction.test.js.map +0 -1
- package/dist/http/__tests__/body-size.test.d.ts +0 -2
- package/dist/http/__tests__/body-size.test.d.ts.map +0 -1
- package/dist/http/__tests__/body-size.test.js +0 -24
- package/dist/http/__tests__/body-size.test.js.map +0 -1
- package/dist/http/__tests__/route-classifier.test.d.ts +0 -2
- package/dist/http/__tests__/route-classifier.test.d.ts.map +0 -1
- package/dist/http/__tests__/route-classifier.test.js +0 -54
- package/dist/http/__tests__/route-classifier.test.js.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.d.ts +0 -2
- package/dist/http/__tests__/safe-redirect.test.d.ts.map +0 -1
- package/dist/http/__tests__/safe-redirect.test.js +0 -44
- package/dist/http/__tests__/safe-redirect.test.js.map +0 -1
- package/dist/http/__tests__/security-headers.test.d.ts +0 -2
- package/dist/http/__tests__/security-headers.test.d.ts.map +0 -1
- package/dist/http/__tests__/security-headers.test.js +0 -24
- package/dist/http/__tests__/security-headers.test.js.map +0 -1
- package/dist/ops/__tests__/semver.test.d.ts +0 -2
- package/dist/ops/__tests__/semver.test.d.ts.map +0 -1
- package/dist/ops/__tests__/semver.test.js +0 -38
- package/dist/ops/__tests__/semver.test.js.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.d.ts +0 -7
- package/dist/providers/__tests__/create-selva-providers.test.d.ts.map +0 -1
- package/dist/providers/__tests__/create-selva-providers.test.js +0 -135
- package/dist/providers/__tests__/create-selva-providers.test.js.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.d.ts +0 -2
- package/dist/tokens/__tests__/token-codec.test.d.ts.map +0 -1
- package/dist/tokens/__tests__/token-codec.test.js +0 -50
- package/dist/tokens/__tests__/token-codec.test.js.map +0 -1
- package/src/access/__tests__/project-access-input.test.ts +0 -175
- package/src/access/index.ts +0 -9
- package/src/access/project-access-input.ts +0 -145
- package/src/compute/__tests__/client-cache.test.ts +0 -244
- package/src/compute/__tests__/definition-byte-cache.test.ts +0 -129
- package/src/compute/__tests__/rate-limit.test.ts +0 -106
- package/src/compute/__tests__/remote-definition.test.ts +0 -140
- package/src/compute/__tests__/safe-url.test.ts +0 -72
- package/src/compute/__tests__/solve-cache.test.ts +0 -268
- package/src/compute/__tests__/solve-pipeline.test.ts +0 -660
- package/src/compute/__tests__/transform-input.test.ts +0 -162
- package/src/compute/client-cache.ts +0 -321
- package/src/compute/definition-byte-cache.ts +0 -168
- package/src/compute/index.ts +0 -82
- package/src/compute/limits.ts +0 -237
- package/src/compute/memory-solve-cache.ts +0 -0
- package/src/compute/rate-limit.ts +0 -110
- package/src/compute/remote-definition.ts +0 -149
- package/src/compute/safe-url.ts +0 -186
- package/src/compute/solve-cache-envelope.ts +0 -98
- package/src/compute/solve-cache-key.ts +0 -85
- package/src/compute/solve-cache-single-flight.ts +0 -59
- package/src/compute/solve-pipeline.ts +0 -603
- package/src/compute/transform-input.ts +0 -66
- package/src/definitions/__tests__/definition-service.test.ts +0 -131
- package/src/definitions/__tests__/load-for-render.test.ts +0 -244
- package/src/definitions/__tests__/schema-extraction.test.ts +0 -137
- package/src/definitions/definition-service.ts +0 -247
- package/src/definitions/index.ts +0 -22
- package/src/definitions/load-for-render.ts +0 -272
- package/src/definitions/schema-extraction.ts +0 -117
- package/src/errors/SentryErrorReporter.ts +0 -88
- package/src/errors/index.ts +0 -3
- package/src/http/__tests__/body-size.test.ts +0 -27
- package/src/http/__tests__/route-classifier.test.ts +0 -60
- package/src/http/__tests__/safe-redirect.test.ts +0 -47
- package/src/http/__tests__/security-headers.test.ts +0 -29
- package/src/http/body-size.ts +0 -24
- package/src/http/index.ts +0 -10
- package/src/http/redirect.ts +0 -16
- package/src/http/route-classifier.ts +0 -74
- package/src/http/security-headers.ts +0 -42
- package/src/index.ts +0 -27
- package/src/ops/__tests__/semver.test.ts +0 -42
- package/src/ops/index.ts +0 -3
- package/src/ops/semver.ts +0 -60
- package/src/providers/__tests__/create-selva-providers.test.ts +0 -172
- package/src/providers/__tests__/fixtures/override-config.mjs +0 -8
- package/src/providers/create-selva-providers.ts +0 -241
- package/src/providers/index.ts +0 -12
- package/src/tokens/__tests__/token-codec.test.ts +0 -63
- package/src/tokens/index.ts +0 -8
- package/src/tokens/token-codec.ts +0 -86
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `createClientCache` — the per-server warm-client LRU.
|
|
3
|
-
*
|
|
4
|
-
* `@selvajs/compute`'s `GrasshopperClient.create` does a real network preflight,
|
|
5
|
-
* so we mock the module: `create` records the config it was called with and
|
|
6
|
-
* returns a fake client whose `createScheduler` returns a disposable stub. That
|
|
7
|
-
* lets us assert the cache's own behavior (id-keying, LRU eviction, evict,
|
|
8
|
-
* disposeAll, the `X-Selva-Definition` header) without a live compute server.
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
11
|
-
// --- Mock @selvajs/compute -------------------------------------------------
|
|
12
|
-
const createdConfigs = [];
|
|
13
|
-
const createdSchedulerOptions = [];
|
|
14
|
-
const disposedSchedulers = [];
|
|
15
|
-
vi.mock('@selvajs/compute', () => {
|
|
16
|
-
class GrasshopperClient {
|
|
17
|
-
config;
|
|
18
|
-
static async create(config) {
|
|
19
|
-
createdConfigs.push(config);
|
|
20
|
-
return new GrasshopperClient(config);
|
|
21
|
-
}
|
|
22
|
-
constructor(config) {
|
|
23
|
-
this.config = config;
|
|
24
|
-
}
|
|
25
|
-
createScheduler(options) {
|
|
26
|
-
createdSchedulerOptions.push(options);
|
|
27
|
-
const scheduler = {
|
|
28
|
-
disposed: false,
|
|
29
|
-
dispose() {
|
|
30
|
-
this.disposed = true;
|
|
31
|
-
disposedSchedulers.push(this);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
return scheduler;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return { GrasshopperClient, enableDebugLogging: vi.fn() };
|
|
38
|
-
});
|
|
39
|
-
import { createClientCache, serverIdentity } from '../client-cache.js';
|
|
40
|
-
function baseConfig() {
|
|
41
|
-
return {
|
|
42
|
-
maxSolveDurationMs: 30_000,
|
|
43
|
-
maxConcurrentSolves: 4,
|
|
44
|
-
maxQueueDepth: 0,
|
|
45
|
-
queueWaitMs: 0,
|
|
46
|
-
cachesolve: true,
|
|
47
|
-
cacheerroredsolves: false,
|
|
48
|
-
reuseServerDefinitionCache: true,
|
|
49
|
-
debug: false,
|
|
50
|
-
debugVerbose: false
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
const server = (id, over = {}) => ({
|
|
54
|
-
id,
|
|
55
|
-
serverUrl: over.serverUrl ?? `http://compute-${id}:6500`,
|
|
56
|
-
apiKey: over.apiKey ?? `key-${id}`
|
|
57
|
-
});
|
|
58
|
-
beforeEach(() => {
|
|
59
|
-
createdConfigs.length = 0;
|
|
60
|
-
createdSchedulerOptions.length = 0;
|
|
61
|
-
disposedSchedulers.length = 0;
|
|
62
|
-
});
|
|
63
|
-
describe('createClientCache — keying', () => {
|
|
64
|
-
it('keys on id: two calls for the same id build one client', async () => {
|
|
65
|
-
const cache = createClientCache(baseConfig());
|
|
66
|
-
const a = await cache.getClient(server('s1'));
|
|
67
|
-
const b = await cache.getClient(server('s1'));
|
|
68
|
-
expect(a).toBe(b);
|
|
69
|
-
expect(createdConfigs).toHaveLength(1);
|
|
70
|
-
});
|
|
71
|
-
it('reuses the entry even when the URL/apiKey rotate under the same id', async () => {
|
|
72
|
-
// The whole point of ADR 0004 D1: identity is the id, so a rotated URL is
|
|
73
|
-
// the SAME entry (stale until evicted) — not a new client.
|
|
74
|
-
const cache = createClientCache(baseConfig());
|
|
75
|
-
const a = await cache.getClient(server('s1', { serverUrl: 'http://old:6500' }));
|
|
76
|
-
const b = await cache.getClient(server('s1', { serverUrl: 'http://new:6500' }));
|
|
77
|
-
expect(a).toBe(b);
|
|
78
|
-
expect(createdConfigs).toHaveLength(1);
|
|
79
|
-
// It kept the ORIGINAL connection details — proving eviction is required.
|
|
80
|
-
expect(createdConfigs[0].serverUrl).toBe('http://old:6500');
|
|
81
|
-
});
|
|
82
|
-
it('builds distinct clients for distinct ids', async () => {
|
|
83
|
-
const cache = createClientCache(baseConfig());
|
|
84
|
-
const a = await cache.getClient(server('s1'));
|
|
85
|
-
const b = await cache.getClient(server('s2'));
|
|
86
|
-
expect(a).not.toBe(b);
|
|
87
|
-
expect(createdConfigs).toHaveLength(2);
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
describe('createClientCache — LRU eviction', () => {
|
|
91
|
-
it('evicts the least-recently-used entry past capacity and disposes its scheduler', async () => {
|
|
92
|
-
const cache = createClientCache({ ...baseConfig(), maxCachedClients: 2 });
|
|
93
|
-
const s1 = await cache.getClient(server('s1'));
|
|
94
|
-
await cache.getClient(server('s2'));
|
|
95
|
-
// Touch s1 so s2 becomes the LRU.
|
|
96
|
-
await cache.getClient(server('s1'));
|
|
97
|
-
await cache.getClient(server('s3')); // over capacity → evict s2
|
|
98
|
-
expect(disposedSchedulers).toHaveLength(1);
|
|
99
|
-
// s1 still warm (same entry, no rebuild); s2 rebuilt on next access.
|
|
100
|
-
expect(await cache.getClient(server('s1'))).toBe(s1);
|
|
101
|
-
expect(createdConfigs.filter((c) => c.serverUrl.includes('s2'))).toHaveLength(1);
|
|
102
|
-
await cache.getClient(server('s2'));
|
|
103
|
-
expect(createdConfigs.filter((c) => c.serverUrl.includes('s2'))).toHaveLength(2);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
describe('createClientCache — explicit invalidation', () => {
|
|
107
|
-
it('evict(id) disposes the scheduler and forces a rebuild (config-write hook)', async () => {
|
|
108
|
-
const cache = createClientCache(baseConfig());
|
|
109
|
-
await cache.getClient(server('s1'));
|
|
110
|
-
cache.evict('s1');
|
|
111
|
-
expect(disposedSchedulers).toHaveLength(1);
|
|
112
|
-
await cache.getClient(server('s1'));
|
|
113
|
-
expect(createdConfigs).toHaveLength(2);
|
|
114
|
-
});
|
|
115
|
-
it('evict accepts a ServerIdentity', async () => {
|
|
116
|
-
const cache = createClientCache(baseConfig());
|
|
117
|
-
await cache.getClient(server('s1'));
|
|
118
|
-
cache.evict(serverIdentity({ id: 's1' }));
|
|
119
|
-
expect(disposedSchedulers).toHaveLength(1);
|
|
120
|
-
});
|
|
121
|
-
it('evict on an unknown id is a no-op', async () => {
|
|
122
|
-
const cache = createClientCache(baseConfig());
|
|
123
|
-
await cache.getClient(server('s1'));
|
|
124
|
-
cache.evict('nope');
|
|
125
|
-
expect(disposedSchedulers).toHaveLength(0);
|
|
126
|
-
});
|
|
127
|
-
it('disposeAll disposes every warm scheduler and clears the cache', async () => {
|
|
128
|
-
const cache = createClientCache(baseConfig());
|
|
129
|
-
await cache.getClient(server('s1'));
|
|
130
|
-
await cache.getClient(server('s2'));
|
|
131
|
-
cache.disposeAll();
|
|
132
|
-
expect(disposedSchedulers).toHaveLength(2);
|
|
133
|
-
// Next access rebuilds.
|
|
134
|
-
await cache.getClient(server('s1'));
|
|
135
|
-
expect(createdConfigs).toHaveLength(3);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
describe('createClientCache — X-Selva-Definition (ADR 0004 D2)', () => {
|
|
139
|
-
it('stamps the definition guid on the client headers when provided', async () => {
|
|
140
|
-
const cache = createClientCache(baseConfig());
|
|
141
|
-
await cache.getClient(server('s1'), { definitionGuid: 'guid-123' });
|
|
142
|
-
expect(createdConfigs[0].headers).toEqual({ 'X-Selva-Definition': 'guid-123' });
|
|
143
|
-
});
|
|
144
|
-
it('omits the header entirely when no guid is given', async () => {
|
|
145
|
-
const cache = createClientCache(baseConfig());
|
|
146
|
-
await cache.getClient(server('s1'));
|
|
147
|
-
expect(createdConfigs[0].headers).toBeUndefined();
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
describe('createClientCache — scheduler concurrency (audit B6)', () => {
|
|
151
|
-
it('forwards maxConcurrentSolves as the scheduler maxConcurrent in queue mode', async () => {
|
|
152
|
-
const cache = createClientCache({ ...baseConfig(), maxConcurrentSolves: 7 });
|
|
153
|
-
await cache.getClient(server('s1'));
|
|
154
|
-
expect(createdSchedulerOptions).toHaveLength(1);
|
|
155
|
-
// Queue mode with NO maxConcurrent defaults to 1 in the scheduler,
|
|
156
|
-
// serializing every solve on the server — the option must always be set.
|
|
157
|
-
expect(createdSchedulerOptions[0].mode).toBe('queue');
|
|
158
|
-
expect(createdSchedulerOptions[0].maxConcurrent).toBe(7);
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
describe('createClientCache — scheduler backpressure (audit B7)', () => {
|
|
162
|
-
it('forwards non-zero queue bounds to the scheduler', async () => {
|
|
163
|
-
const cache = createClientCache({ ...baseConfig(), maxQueueDepth: 12, queueWaitMs: 90_000 });
|
|
164
|
-
await cache.getClient(server('s1'));
|
|
165
|
-
expect(createdSchedulerOptions[0].maxQueueDepth).toBe(12);
|
|
166
|
-
expect(createdSchedulerOptions[0].queueWaitMs).toBe(90_000);
|
|
167
|
-
});
|
|
168
|
-
it('maps a 0 (disabled) queue bound to undefined so the scheduler stays unbounded', async () => {
|
|
169
|
-
// The scheduler treats undefined as unbounded/no-deadline; passing 0 would
|
|
170
|
-
// shed EVERY queued solve. Our `0 = off` convention must become undefined.
|
|
171
|
-
const cache = createClientCache({ ...baseConfig(), maxQueueDepth: 0, queueWaitMs: 0 });
|
|
172
|
-
await cache.getClient(server('s1'));
|
|
173
|
-
expect(createdSchedulerOptions[0].maxQueueDepth).toBeUndefined();
|
|
174
|
-
expect(createdSchedulerOptions[0].queueWaitMs).toBeUndefined();
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
describe('createClientCache — per-request telemetry sequence counters', () => {
|
|
178
|
-
it('onServerTiming bumps rhinoTiming.seq on every write', async () => {
|
|
179
|
-
const cache = createClientCache(baseConfig());
|
|
180
|
-
const entry = await cache.getClient(server('s1'));
|
|
181
|
-
expect(entry.rhinoTiming).toEqual({ last: null, seq: 0 });
|
|
182
|
-
createdConfigs[0].onServerTiming({ decode: 5, solve: 100, encode: 3 });
|
|
183
|
-
expect(entry.rhinoTiming.seq).toBe(1);
|
|
184
|
-
expect(entry.rhinoTiming.last).toEqual({ decode: 5, solve: 100, encode: 3 });
|
|
185
|
-
createdConfigs[0].onServerTiming({ decode: 1, solve: 2, encode: 3 });
|
|
186
|
-
expect(entry.rhinoTiming.seq).toBe(2);
|
|
187
|
-
expect(entry.rhinoTiming.last).toEqual({ decode: 1, solve: 2, encode: 3 });
|
|
188
|
-
});
|
|
189
|
-
it('onSettle bumps solveMeta.seq on every settle but writes last only on success', async () => {
|
|
190
|
-
const cache = createClientCache(baseConfig());
|
|
191
|
-
const entry = await cache.getClient(server('s1'));
|
|
192
|
-
const onSettle = createdSchedulerOptions[0].onSettle;
|
|
193
|
-
expect(entry.solveMeta).toEqual({ last: null, seq: 0 });
|
|
194
|
-
onSettle({ key: 'k' }, {
|
|
195
|
-
status: 'success',
|
|
196
|
-
fromCache: false,
|
|
197
|
-
definitionReuploaded: false,
|
|
198
|
-
durationMs: 10,
|
|
199
|
-
response: {}
|
|
200
|
-
});
|
|
201
|
-
expect(entry.solveMeta.seq).toBe(1);
|
|
202
|
-
expect(entry.solveMeta.last).toEqual({ fromCache: false, definitionReuploaded: false });
|
|
203
|
-
// An error settle must still count toward seq (the attribution guard in
|
|
204
|
-
// the pipeline needs to see ALL concurrent activity) without clobbering last.
|
|
205
|
-
onSettle({ key: 'k' }, { status: 'error', error: new Error('x'), durationMs: 5 });
|
|
206
|
-
expect(entry.solveMeta.seq).toBe(2);
|
|
207
|
-
expect(entry.solveMeta.last).toEqual({ fromCache: false, definitionReuploaded: false });
|
|
208
|
-
onSettle({ key: 'k' }, { status: 'success', fromCache: true, durationMs: 0, response: {} });
|
|
209
|
-
expect(entry.solveMeta.seq).toBe(3);
|
|
210
|
-
expect(entry.solveMeta.last).toEqual({ fromCache: true, definitionReuploaded: undefined });
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
describe('serverIdentity', () => {
|
|
214
|
-
it('derives identity from the id', () => {
|
|
215
|
-
expect(serverIdentity({ id: 'abc' })).toBe('abc');
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
//# sourceMappingURL=client-cache.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-cache.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/client-cache.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,8EAA8E;AAC9E,MAAM,cAAc,GAAU,EAAE,CAAC;AACjC,MAAM,uBAAuB,GAAU,EAAE,CAAC;AAC1C,MAAM,kBAAkB,GAAU,EAAE,CAAC;AAErC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,iBAAiB;QAKH;QAJnB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAW;YAC9B,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QACD,YAAmB,MAAW;YAAX,WAAM,GAAN,MAAM,CAAK;QAAG,CAAC;QAClC,eAAe,CAAC,OAAY;YAC3B,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG;gBACjB,QAAQ,EAAE,KAAK;gBACf,OAAO;oBACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,CAAC;aACD,CAAC;YACF,OAAO,SAAS,CAAC;QAClB,CAAC;KACD;IACD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEvE,SAAS,UAAU;IAClB,OAAO;QACN,kBAAkB,EAAE,MAAM;QAC1B,mBAAmB,EAAE,CAAC;QACtB,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,UAAU,EAAE,IAAI;QAChB,kBAAkB,EAAE,KAAK;QACzB,0BAA0B,EAAE,IAAI;QAChC,KAAK,EAAE,KAAK;QACZ,YAAY,EAAE,KAAK;KACnB,CAAC;AACH,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,OAAuD,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1F,EAAE;IACF,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB,EAAE,OAAO;IACxD,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,EAAE;CAClC,CAAC,CAAC;AAEH,UAAU,CAAC,GAAG,EAAE;IACf,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACnF,0EAA0E;QAC1E,2DAA2D;QAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;QAChF,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvC,0EAA0E;QAC1E,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1E,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,kCAAkC;QAClC,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,2BAA2B;QAEhE,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,qEAAqE;QACrE,MAAM,CAAC,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3C,wBAAwB;QACxB,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sDAAsD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QAC1F,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,uBAAuB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAChD,mEAAmE;QACnE,yEAAyE;QACzE,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC9F,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,aAAa,EAAE,CAAC;QACjE,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;IAC5E,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1D,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7E,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC7F,MAAM,KAAK,GAAG,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAClD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAExD,QAAQ,CACP,EAAE,GAAG,EAAE,GAAG,EAAE,EACZ;YACC,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,KAAK;YAChB,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACZ,CACD,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;QAExF,wEAAwE;QACxE,8EAA8E;QAC9E,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;QAExF,QAAQ,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definition-byte-cache.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/definition-byte-cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { createDefinitionByteCache } from '../definition-byte-cache.js';
|
|
3
|
-
/** A `Uint8Array` of `n` bytes filled with a marker so equality is checkable. */
|
|
4
|
-
function bytes(n, marker = 0) {
|
|
5
|
-
return new Uint8Array(n).fill(marker);
|
|
6
|
-
}
|
|
7
|
-
describe('createDefinitionByteCache', () => {
|
|
8
|
-
it('serves a warm entry without re-invoking the loader (hit) and reports it', async () => {
|
|
9
|
-
const cache = createDefinitionByteCache(10 * 1024 * 1024);
|
|
10
|
-
const load = vi.fn(async () => bytes(1024, 7));
|
|
11
|
-
const first = await cache.getOrLoad('v-1', load).load();
|
|
12
|
-
const second = await cache.getOrLoad('v-1', load).load();
|
|
13
|
-
expect(first).toEqual(second);
|
|
14
|
-
expect(load).toHaveBeenCalledTimes(1); // second call served from cache
|
|
15
|
-
const s = cache.stats();
|
|
16
|
-
expect(s.hits).toBe(1);
|
|
17
|
-
expect(s.misses).toBe(1);
|
|
18
|
-
expect(s.entries).toBe(1);
|
|
19
|
-
expect(s.bytes).toBe(1024);
|
|
20
|
-
});
|
|
21
|
-
it('per-ref outcome distinguishes miss (loader) from hit (warm)', async () => {
|
|
22
|
-
const cache = createDefinitionByteCache(10 * 1024 * 1024);
|
|
23
|
-
const load = async () => bytes(512);
|
|
24
|
-
const refMiss = cache.getOrLoad('v-1', load);
|
|
25
|
-
await refMiss.load();
|
|
26
|
-
expect(refMiss.outcome).toEqual({ loaded: true, fromCache: false });
|
|
27
|
-
const refHit = cache.getOrLoad('v-1', load);
|
|
28
|
-
await refHit.load();
|
|
29
|
-
expect(refHit.outcome).toEqual({ loaded: true, fromCache: true });
|
|
30
|
-
});
|
|
31
|
-
it("a ref whose load() is never called leaves outcome.loaded false (the 'skipped' verdict)", () => {
|
|
32
|
-
const cache = createDefinitionByteCache(10 * 1024 * 1024);
|
|
33
|
-
const ref = cache.getOrLoad('v-1', async () => bytes(1));
|
|
34
|
-
// The scheduler served a pointer-known solve — load() never ran.
|
|
35
|
-
expect(ref.outcome).toEqual({ loaded: false, fromCache: false });
|
|
36
|
-
});
|
|
37
|
-
it('evicts least-recently-used entries when the byte budget is exceeded', async () => {
|
|
38
|
-
// Budget holds ~2 of these 1 KB entries.
|
|
39
|
-
const cache = createDefinitionByteCache(2 * 1024);
|
|
40
|
-
const load = (marker) => async () => bytes(1024, marker);
|
|
41
|
-
await cache.getOrLoad('a', load(1)).load(); // [a]
|
|
42
|
-
await cache.getOrLoad('b', load(2)).load(); // [a,b]
|
|
43
|
-
// Touch 'a' so 'b' becomes the LRU victim.
|
|
44
|
-
await cache.getOrLoad('a', load(1)).load(); // hit → [b,a]
|
|
45
|
-
await cache.getOrLoad('c', load(3)).load(); // insert c → evict b → [a,c]
|
|
46
|
-
expect(cache.stats().entries).toBe(2);
|
|
47
|
-
expect(cache.stats().evictions).toBe(1);
|
|
48
|
-
expect(cache.stats().bytes).toBe(2 * 1024);
|
|
49
|
-
// 'a' survived (it was touched, so 'b' was the LRU victim) → served from
|
|
50
|
-
// cache without the loader. Checked BEFORE re-loading 'b', since bringing 'b'
|
|
51
|
-
// back would itself evict 'a' under the 2-entry budget.
|
|
52
|
-
const aLoad = vi.fn(load(1));
|
|
53
|
-
await cache.getOrLoad('a', aLoad).load();
|
|
54
|
-
expect(aLoad).toHaveBeenCalledTimes(0);
|
|
55
|
-
// 'b' was evicted → its next load calls the loader again (miss).
|
|
56
|
-
const bLoad = vi.fn(load(2));
|
|
57
|
-
await cache.getOrLoad('b', bLoad).load();
|
|
58
|
-
expect(bLoad).toHaveBeenCalledTimes(1);
|
|
59
|
-
});
|
|
60
|
-
it('never retains an entry larger than the whole budget (serves through, caches nothing)', async () => {
|
|
61
|
-
const cache = createDefinitionByteCache(1024);
|
|
62
|
-
const load = vi.fn(async () => bytes(4096));
|
|
63
|
-
const out = await cache.getOrLoad('big', load).load();
|
|
64
|
-
expect(out.byteLength).toBe(4096); // still served
|
|
65
|
-
expect(cache.stats().entries).toBe(0); // but not retained
|
|
66
|
-
expect(cache.stats().bytes).toBe(0);
|
|
67
|
-
// Every load re-fetches — nothing was cached.
|
|
68
|
-
await cache.getOrLoad('big', load).load();
|
|
69
|
-
expect(load).toHaveBeenCalledTimes(2);
|
|
70
|
-
});
|
|
71
|
-
it('keys on the passed version id — two versions that reused a fileKey never collide', async () => {
|
|
72
|
-
// The trap this cache exists to avoid: delete-latest-then-reupload reused a
|
|
73
|
-
// fileKey, but the version id (the KEY) is always fresh. Distinct ids →
|
|
74
|
-
// distinct entries, so the new version never serves the old bytes.
|
|
75
|
-
const cache = createDefinitionByteCache(10 * 1024 * 1024);
|
|
76
|
-
const oldBytes = bytes(1024, 1);
|
|
77
|
-
const newBytes = bytes(1024, 2);
|
|
78
|
-
const a = await cache.getOrLoad('version-old', async () => oldBytes).load();
|
|
79
|
-
const b = await cache.getOrLoad('version-new', async () => newBytes).load();
|
|
80
|
-
expect(a).toEqual(oldBytes);
|
|
81
|
-
expect(b).toEqual(newBytes);
|
|
82
|
-
expect(a).not.toEqual(b); // no cross-contamination despite a shared fileKey
|
|
83
|
-
expect(cache.stats().entries).toBe(2);
|
|
84
|
-
});
|
|
85
|
-
it('budget 0 disables caching entirely (every load hits the loader, nothing retained)', async () => {
|
|
86
|
-
const cache = createDefinitionByteCache(0);
|
|
87
|
-
const load = vi.fn(async () => bytes(16));
|
|
88
|
-
const ref1 = cache.getOrLoad('v-1', load);
|
|
89
|
-
await ref1.load();
|
|
90
|
-
await cache.getOrLoad('v-1', load).load();
|
|
91
|
-
expect(load).toHaveBeenCalledTimes(2);
|
|
92
|
-
expect(cache.stats().entries).toBe(0);
|
|
93
|
-
expect(cache.stats().bytes).toBe(0);
|
|
94
|
-
// Outcome still reports loaded, but never fromCache.
|
|
95
|
-
expect(ref1.outcome).toEqual({ loaded: true, fromCache: false });
|
|
96
|
-
});
|
|
97
|
-
it('re-storing the same key updates bytes without double-counting the budget', async () => {
|
|
98
|
-
const cache = createDefinitionByteCache(10 * 1024 * 1024);
|
|
99
|
-
// clear() to force a re-store path: first load caches, clear drops it, second caches again.
|
|
100
|
-
await cache.getOrLoad('v-1', async () => bytes(1024)).load();
|
|
101
|
-
expect(cache.stats().bytes).toBe(1024);
|
|
102
|
-
cache.clear();
|
|
103
|
-
expect(cache.stats().bytes).toBe(0);
|
|
104
|
-
expect(cache.stats().entries).toBe(0);
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
//# sourceMappingURL=definition-byte-cache.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"definition-byte-cache.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/definition-byte-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/rate-limit.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import { createComputeRateLimiter } from '../rate-limit.js';
|
|
3
|
-
const WINDOW_MS = 100_000;
|
|
4
|
-
const MAX_PER_WINDOW = 120;
|
|
5
|
-
describe('createComputeRateLimiter', () => {
|
|
6
|
-
let limiter;
|
|
7
|
-
beforeEach(() => {
|
|
8
|
-
limiter = createComputeRateLimiter({ windowMs: WINDOW_MS, maxPerWindow: MAX_PER_WINDOW });
|
|
9
|
-
vi.useFakeTimers();
|
|
10
|
-
vi.setSystemTime(new Date('2026-01-01T00:00:00Z'));
|
|
11
|
-
});
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
vi.useRealTimers();
|
|
14
|
-
});
|
|
15
|
-
it('allows up to maxPerWindow requests in the window', () => {
|
|
16
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++) {
|
|
17
|
-
expect(limiter.check('user:alice').allowed).toBe(true);
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
it('rejects the (MAX+1)th request with retryAfter set', () => {
|
|
21
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
22
|
-
limiter.check('user:alice');
|
|
23
|
-
const result = limiter.check('user:alice');
|
|
24
|
-
expect(result.allowed).toBe(false);
|
|
25
|
-
expect(result.retryAfter).toBeGreaterThan(0);
|
|
26
|
-
expect(result.retryAfter).toBeLessThanOrEqual(WINDOW_MS / 1000);
|
|
27
|
-
});
|
|
28
|
-
it('isolates buckets per key', () => {
|
|
29
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
30
|
-
limiter.check('user:alice');
|
|
31
|
-
expect(limiter.check('user:alice').allowed).toBe(false);
|
|
32
|
-
expect(limiter.check('user:bob').allowed).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
it("share-link buckets don't collide with user buckets sharing an id", () => {
|
|
35
|
-
const id = '00000000-0000-0000-0000-000000000001';
|
|
36
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
37
|
-
limiter.check(`share:${id}`);
|
|
38
|
-
expect(limiter.check(`share:${id}`).allowed).toBe(false);
|
|
39
|
-
expect(limiter.check(`user:${id}`).allowed).toBe(true);
|
|
40
|
-
});
|
|
41
|
-
it('rolls over when the window expires', () => {
|
|
42
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
43
|
-
limiter.check('user:alice');
|
|
44
|
-
expect(limiter.check('user:alice').allowed).toBe(false);
|
|
45
|
-
vi.advanceTimersByTime(WINDOW_MS + 1);
|
|
46
|
-
expect(limiter.check('user:alice').allowed).toBe(true);
|
|
47
|
-
});
|
|
48
|
-
it('does not pre-increment a fresh bucket past the cap', () => {
|
|
49
|
-
// Regression guard: an off-by-one in the "no entry yet" branch could
|
|
50
|
-
// initialize at count=1 but treat the FIRST call as already capped.
|
|
51
|
-
expect(limiter.check('user:fresh').allowed).toBe(true);
|
|
52
|
-
});
|
|
53
|
-
it('separate limiters own separate bucket state', () => {
|
|
54
|
-
const other = createComputeRateLimiter({ windowMs: WINDOW_MS, maxPerWindow: MAX_PER_WINDOW });
|
|
55
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
56
|
-
limiter.check('user:alice');
|
|
57
|
-
expect(limiter.check('user:alice').allowed).toBe(false);
|
|
58
|
-
// A different limiter instance is unaffected.
|
|
59
|
-
expect(other.check('user:alice').allowed).toBe(true);
|
|
60
|
-
});
|
|
61
|
-
// peek + clear support failure-counting flows (login limiting): peek gates
|
|
62
|
-
// the attempt without spending budget, check records a failure, clear
|
|
63
|
-
// forgives on success.
|
|
64
|
-
describe('peek / clear', () => {
|
|
65
|
-
it('peek never increments the counter', () => {
|
|
66
|
-
for (let i = 0; i < 1000; i++)
|
|
67
|
-
expect(limiter.peek('ip:1.2.3.4').allowed).toBe(true);
|
|
68
|
-
// Full budget still available after all those peeks.
|
|
69
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++) {
|
|
70
|
-
expect(limiter.check('ip:1.2.3.4').allowed).toBe(true);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
it('peek reports a full bucket with retryAfter, still without mutating it', () => {
|
|
74
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
75
|
-
limiter.check('ip:1.2.3.4');
|
|
76
|
-
const result = limiter.peek('ip:1.2.3.4');
|
|
77
|
-
expect(result.allowed).toBe(false);
|
|
78
|
-
expect(result.retryAfter).toBeGreaterThan(0);
|
|
79
|
-
});
|
|
80
|
-
it('peek allows again once the window expires', () => {
|
|
81
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++)
|
|
82
|
-
limiter.check('ip:1.2.3.4');
|
|
83
|
-
expect(limiter.peek('ip:1.2.3.4').allowed).toBe(false);
|
|
84
|
-
vi.advanceTimersByTime(WINDOW_MS + 1);
|
|
85
|
-
expect(limiter.peek('ip:1.2.3.4').allowed).toBe(true);
|
|
86
|
-
});
|
|
87
|
-
it('clear drops only the given key', () => {
|
|
88
|
-
for (let i = 0; i < MAX_PER_WINDOW; i++) {
|
|
89
|
-
limiter.check('ip:1.2.3.4');
|
|
90
|
-
limiter.check('ip:5.6.7.8');
|
|
91
|
-
}
|
|
92
|
-
limiter.clear('ip:1.2.3.4');
|
|
93
|
-
expect(limiter.peek('ip:1.2.3.4').allowed).toBe(true);
|
|
94
|
-
expect(limiter.peek('ip:5.6.7.8').allowed).toBe(false);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
//# sourceMappingURL=rate-limit.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/rate-limit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `createRemoteDefinitionFetcher` — the SSRF-guarded, capped, TTL-cached
|
|
3
|
-
* remote `.gh` fetch (K3).
|
|
4
|
-
*
|
|
5
|
-
* `safe-url` is mocked so the host check is a controllable pass/fail (its own
|
|
6
|
-
* SSRF logic is covered in safe-url.test.ts), and `fetch` is stubbed per test to
|
|
7
|
-
* return scripted bodies/headers. The injected `now` clock makes the TTL cache
|
|
8
|
-
* deterministic without real time.
|
|
9
|
-
*/
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=remote-definition.test.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-definition.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/remote-definition.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for `createRemoteDefinitionFetcher` — the SSRF-guarded, capped, TTL-cached
|
|
3
|
-
* remote `.gh` fetch (K3).
|
|
4
|
-
*
|
|
5
|
-
* `safe-url` is mocked so the host check is a controllable pass/fail (its own
|
|
6
|
-
* SSRF logic is covered in safe-url.test.ts), and `fetch` is stubbed per test to
|
|
7
|
-
* return scripted bodies/headers. The injected `now` clock makes the TTL cache
|
|
8
|
-
* deterministic without real time.
|
|
9
|
-
*/
|
|
10
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
11
|
-
// --- Mock the SSRF guard ---------------------------------------------------
|
|
12
|
-
const assertSafe = vi.fn(async (_url) => { });
|
|
13
|
-
vi.mock('../safe-url.js', () => ({
|
|
14
|
-
assertSafeRemoteDefinitionUrl: (url) => assertSafe(url)
|
|
15
|
-
}));
|
|
16
|
-
import { createRemoteDefinitionFetcher, readBodyWithCap } from '../index.js';
|
|
17
|
-
/** A Response whose body streams the given bytes in one chunk. */
|
|
18
|
-
function streamResponse(bytes, init = {}) {
|
|
19
|
-
const body = new ReadableStream({
|
|
20
|
-
start(controller) {
|
|
21
|
-
controller.enqueue(bytes);
|
|
22
|
-
controller.close();
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
const headers = new Headers();
|
|
26
|
-
if (init.contentLength !== null && init.contentLength !== undefined) {
|
|
27
|
-
headers.set('content-length', init.contentLength);
|
|
28
|
-
}
|
|
29
|
-
return new Response(body, { status: 200, headers });
|
|
30
|
-
}
|
|
31
|
-
const baseConfig = () => ({
|
|
32
|
-
maxBytes: 1024,
|
|
33
|
-
fetchTimeoutMs: 5_000,
|
|
34
|
-
cacheTtlMs: 60_000,
|
|
35
|
-
now: () => 1_000
|
|
36
|
-
});
|
|
37
|
-
let fetchMock;
|
|
38
|
-
beforeEach(() => {
|
|
39
|
-
assertSafe.mockClear();
|
|
40
|
-
assertSafe.mockResolvedValue(undefined);
|
|
41
|
-
fetchMock = vi.fn();
|
|
42
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
43
|
-
});
|
|
44
|
-
afterEach(() => {
|
|
45
|
-
vi.unstubAllGlobals();
|
|
46
|
-
});
|
|
47
|
-
describe('createRemoteDefinitionFetcher — happy path', () => {
|
|
48
|
-
it('runs the SSRF guard and returns the fetched bytes', async () => {
|
|
49
|
-
const bytes = new Uint8Array([9, 8, 7]);
|
|
50
|
-
fetchMock.mockResolvedValue(streamResponse(bytes, { contentLength: '3' }));
|
|
51
|
-
const fetcher = createRemoteDefinitionFetcher(baseConfig());
|
|
52
|
-
const out = await fetcher.load('https://example.com/def.gh');
|
|
53
|
-
expect(out).toEqual(bytes);
|
|
54
|
-
expect(assertSafe).toHaveBeenCalledWith('https://example.com/def.gh');
|
|
55
|
-
expect(fetchMock).toHaveBeenCalledWith('https://example.com/def.gh', expect.objectContaining({ redirect: 'error' }));
|
|
56
|
-
});
|
|
57
|
-
it('caches within TTL (one fetch) and refetches after TTL expires', async () => {
|
|
58
|
-
const bytes = new Uint8Array([1]);
|
|
59
|
-
// Fresh Response per call — a stream body can only be read once.
|
|
60
|
-
fetchMock.mockImplementation(async () => streamResponse(bytes, { contentLength: '1' }));
|
|
61
|
-
let clock = 1_000;
|
|
62
|
-
const fetcher = createRemoteDefinitionFetcher({ ...baseConfig(), now: () => clock });
|
|
63
|
-
await fetcher.load('https://example.com/a.gh');
|
|
64
|
-
await fetcher.load('https://example.com/a.gh'); // within TTL → cached
|
|
65
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
66
|
-
clock += 60_001; // past the 60s TTL
|
|
67
|
-
await fetcher.load('https://example.com/a.gh');
|
|
68
|
-
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('createRemoteDefinitionFetcher — rejections', () => {
|
|
72
|
-
it('does not fetch when the SSRF guard rejects', async () => {
|
|
73
|
-
assertSafe.mockRejectedValue(new Error('blocked private host'));
|
|
74
|
-
const fetcher = createRemoteDefinitionFetcher(baseConfig());
|
|
75
|
-
await expect(fetcher.load('http://169.254.169.254/')).rejects.toThrow('blocked private host');
|
|
76
|
-
expect(fetchMock).not.toHaveBeenCalled();
|
|
77
|
-
});
|
|
78
|
-
it('throws on a non-2xx response', async () => {
|
|
79
|
-
fetchMock.mockResolvedValue(new Response('nope', { status: 404, statusText: 'Not Found' }));
|
|
80
|
-
const fetcher = createRemoteDefinitionFetcher(baseConfig());
|
|
81
|
-
await expect(fetcher.load('https://example.com/missing.gh')).rejects.toThrow('HTTP 404');
|
|
82
|
-
});
|
|
83
|
-
it('rejects early when the declared content-length exceeds the cap', async () => {
|
|
84
|
-
fetchMock.mockResolvedValue(streamResponse(new Uint8Array([1, 2]), { contentLength: '99999' }));
|
|
85
|
-
const fetcher = createRemoteDefinitionFetcher({ ...baseConfig(), maxBytes: 10 });
|
|
86
|
-
await expect(fetcher.load('https://example.com/big.gh')).rejects.toThrow('exceeds size limit');
|
|
87
|
-
});
|
|
88
|
-
it('rejects when the streamed body exceeds the cap despite a missing content-length', async () => {
|
|
89
|
-
// No content-length header — the streaming cap must still catch it.
|
|
90
|
-
fetchMock.mockResolvedValue(streamResponse(new Uint8Array(50), { contentLength: null }));
|
|
91
|
-
const fetcher = createRemoteDefinitionFetcher({ ...baseConfig(), maxBytes: 10 });
|
|
92
|
-
await expect(fetcher.load('https://example.com/lying.gh')).rejects.toThrow('exceeds size limit');
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
describe('readBodyWithCap', () => {
|
|
96
|
-
it('reads a streamed body under the cap', async () => {
|
|
97
|
-
const bytes = new Uint8Array([1, 2, 3, 4]);
|
|
98
|
-
const out = await readBodyWithCap(streamResponse(bytes), 10, new AbortController());
|
|
99
|
-
expect(out).toEqual(bytes);
|
|
100
|
-
});
|
|
101
|
-
it('aborts and throws once the running total crosses the cap', async () => {
|
|
102
|
-
const controller = new AbortController();
|
|
103
|
-
await expect(readBodyWithCap(streamResponse(new Uint8Array(20)), 5, controller)).rejects.toThrow('exceeds size limit');
|
|
104
|
-
expect(controller.signal.aborted).toBe(true);
|
|
105
|
-
});
|
|
106
|
-
it('falls back to arrayBuffer when there is no stream body', async () => {
|
|
107
|
-
// A Response built from a string still exposes a body stream in undici, so
|
|
108
|
-
// construct one without a body to hit the fallback branch.
|
|
109
|
-
const noBody = new Response(null, { status: 200 });
|
|
110
|
-
const out = await readBodyWithCap(noBody, 10, new AbortController());
|
|
111
|
-
expect(out).toEqual(new Uint8Array(0));
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
//# sourceMappingURL=remote-definition.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"remote-definition.test.js","sourceRoot":"","sources":["../../../src/compute/__tests__/remote-definition.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safe-url.test.d.ts","sourceRoot":"","sources":["../../../src/compute/__tests__/safe-url.test.ts"],"names":[],"mappings":""}
|