@flighthq/loader 0.1.0
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/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/resourceLoader.d.ts +15 -0
- package/dist/resourceLoader.d.ts.map +1 -0
- package/dist/resourceLoader.js +528 -0
- package/dist/resourceLoader.js.map +1 -0
- package/package.json +38 -0
- package/src/resourceLoader.test.ts +1029 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ResourceLoader, ResourceLoaderItemSignals, ResourceLoaderOptions, ResourceLoadHandle, ResourceLoadItem, ResourceLoadItemStatus } from '@flighthq/types';
|
|
2
|
+
export declare function cancelResourceLoad(loader: ResourceLoader): void;
|
|
3
|
+
export declare function createResourceLoader(options?: Readonly<ResourceLoaderOptions>): ResourceLoader;
|
|
4
|
+
export declare function disposeResourceLoader(loader: ResourceLoader): void;
|
|
5
|
+
export declare function enableResourceLoaderItemSignals(loader: ResourceLoader): ResourceLoaderItemSignals;
|
|
6
|
+
export declare function getResourceLoadItemStatus(loader: ResourceLoader, key: string): ResourceLoadItemStatus;
|
|
7
|
+
export declare function getResourceLoadProgress(loader: ResourceLoader, group?: string): number;
|
|
8
|
+
export declare function pauseResourceLoad(loader: ResourceLoader): void;
|
|
9
|
+
export declare function queueResourceLoad<T>(loader: ResourceLoader, item: Readonly<ResourceLoadItem<T>> | (() => Promise<T>)): ResourceLoadHandle<T>;
|
|
10
|
+
export declare function resetResourceLoader(loader: ResourceLoader): void;
|
|
11
|
+
export declare function resumeResourceLoad(loader: ResourceLoader): void;
|
|
12
|
+
export declare function setResourceLoaderConcurrency(loader: ResourceLoader, maxConcurrent: number): void;
|
|
13
|
+
export declare function setResourceLoadPriority(loader: ResourceLoader, key: string, priority: number): void;
|
|
14
|
+
export declare function startResourceLoad(loader: ResourceLoader): void;
|
|
15
|
+
//# sourceMappingURL=resourceLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceLoader.d.ts","sourceRoot":"","sources":["../src/resourceLoader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAuHzB,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAqC/D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GAAG,cAAc,CAiC9F;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAelE;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,cAAc,GAAG,yBAAyB,CAWjG;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,sBAAsB,CASrG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBtF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAK9D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GACvD,kBAAkB,CAAC,CAAC,CAAC,CAkEvB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CA0BhE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAM/D;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,CAOhG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMnG;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAY9D"}
|
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
import { clearSignal, createSignal, emitSignal } from '@flighthq/signals';
|
|
2
|
+
// Internal key prefix for auto-assigned keys
|
|
3
|
+
const AUTO_KEY_PREFIX = '__item_';
|
|
4
|
+
// Pool for PendingEntry objects — avoids per-item allocation on the hot-path drain.
|
|
5
|
+
// Each acquire fills in all fields before use; release clears references to prevent GC leaks.
|
|
6
|
+
const pendingEntryPool = [];
|
|
7
|
+
function acquirePendingEntry() {
|
|
8
|
+
const entry = pendingEntryPool.pop();
|
|
9
|
+
if (entry !== undefined)
|
|
10
|
+
return entry;
|
|
11
|
+
return {
|
|
12
|
+
abortController: new AbortController(),
|
|
13
|
+
bytesHint: 0,
|
|
14
|
+
bytesLoaded: 0,
|
|
15
|
+
group: undefined,
|
|
16
|
+
key: '',
|
|
17
|
+
onBytesProgress: undefined,
|
|
18
|
+
priority: 0,
|
|
19
|
+
reject: _noop,
|
|
20
|
+
resolve: _noop,
|
|
21
|
+
retries: 0,
|
|
22
|
+
startedAt: 0,
|
|
23
|
+
timeoutMs: 0,
|
|
24
|
+
weight: 1,
|
|
25
|
+
wrappedLoad: _noopLoad,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function releasePendingEntry(entry) {
|
|
29
|
+
// Clear references to prevent GC leaks; primitive fields can stay
|
|
30
|
+
entry.onBytesProgress = undefined;
|
|
31
|
+
entry.reject = _noop;
|
|
32
|
+
entry.resolve = _noop;
|
|
33
|
+
entry.wrappedLoad = _noopLoad;
|
|
34
|
+
// Replace with a fresh AbortController for next use
|
|
35
|
+
entry.abortController = new AbortController();
|
|
36
|
+
pendingEntryPool.push(entry);
|
|
37
|
+
}
|
|
38
|
+
function _noop(_value) { }
|
|
39
|
+
function _noopLoad(_signal) {
|
|
40
|
+
return Promise.resolve(undefined);
|
|
41
|
+
}
|
|
42
|
+
function createTokenBucket(maxBytesPerSecond) {
|
|
43
|
+
return {
|
|
44
|
+
lastRefillMs: Date.now(),
|
|
45
|
+
maxBytesPerSecond,
|
|
46
|
+
tokens: maxBytesPerSecond, // Start with a full bucket
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function refillTokens(bucket) {
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const elapsed = (now - bucket.lastRefillMs) / 1000;
|
|
52
|
+
bucket.tokens = Math.min(bucket.maxBytesPerSecond, bucket.tokens + elapsed * bucket.maxBytesPerSecond);
|
|
53
|
+
bucket.lastRefillMs = now;
|
|
54
|
+
}
|
|
55
|
+
// Returns delay in ms until enough tokens are available for the given cost.
|
|
56
|
+
// Returns 0 if sufficient tokens are already available.
|
|
57
|
+
function tokenBucketDelayMs(bucket, cost) {
|
|
58
|
+
refillTokens(bucket);
|
|
59
|
+
if (cost === 0 || bucket.tokens >= cost)
|
|
60
|
+
return 0;
|
|
61
|
+
const deficit = cost - bucket.tokens;
|
|
62
|
+
return Math.ceil((deficit / bucket.maxBytesPerSecond) * 1000);
|
|
63
|
+
}
|
|
64
|
+
function consumeTokens(bucket, cost) {
|
|
65
|
+
bucket.tokens = Math.max(0, bucket.tokens - cost);
|
|
66
|
+
}
|
|
67
|
+
export function cancelResourceLoad(loader) {
|
|
68
|
+
const internal = loader;
|
|
69
|
+
if (!internal.started || internal.cancelled)
|
|
70
|
+
return;
|
|
71
|
+
internal.cancelled = true;
|
|
72
|
+
const cancelError = new DOMException('Load cancelled', 'AbortError');
|
|
73
|
+
// Abort all in-flight entries — runEntry will catch the abort and call checkCompleteAfterCancel
|
|
74
|
+
for (const entry of internal.inFlight) {
|
|
75
|
+
entry.abortController.abort(cancelError);
|
|
76
|
+
}
|
|
77
|
+
// Record and reject all not-yet-dispatched pending entries
|
|
78
|
+
for (const entry of internal.pending) {
|
|
79
|
+
entry.abortController.abort(cancelError);
|
|
80
|
+
const report = {
|
|
81
|
+
attempts: 0,
|
|
82
|
+
bytes: 0,
|
|
83
|
+
elapsedMs: 0,
|
|
84
|
+
group: entry.group,
|
|
85
|
+
key: entry.key,
|
|
86
|
+
status: 'cancelled',
|
|
87
|
+
};
|
|
88
|
+
internal.reports.push(report);
|
|
89
|
+
entry.reject(cancelError);
|
|
90
|
+
internal.loaded++;
|
|
91
|
+
releasePendingEntry(entry);
|
|
92
|
+
}
|
|
93
|
+
internal.pending = [];
|
|
94
|
+
emitSignal(loader.onCancel);
|
|
95
|
+
// Complete immediately if nothing is currently running
|
|
96
|
+
if (internal.inFlight.size === 0) {
|
|
97
|
+
emitSignal(loader.onProgress, internal.loaded, internal.total);
|
|
98
|
+
emitSignal(loader.onComplete, internal.reports);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function createResourceLoader(options) {
|
|
102
|
+
const opts = options ?? {};
|
|
103
|
+
const throttle = opts.maxBytesPerSecond !== undefined && opts.maxBytesPerSecond > 0
|
|
104
|
+
? createTokenBucket(opts.maxBytesPerSecond)
|
|
105
|
+
: null;
|
|
106
|
+
const out = {
|
|
107
|
+
cancelled: false,
|
|
108
|
+
dedupeMap: new Map(),
|
|
109
|
+
errorPolicy: opts.errorPolicy ?? 'continue',
|
|
110
|
+
inFlight: new Set(),
|
|
111
|
+
itemCounter: 0,
|
|
112
|
+
itemSignals: null,
|
|
113
|
+
loaded: 0,
|
|
114
|
+
maxConcurrent: opts.maxConcurrent ?? 6,
|
|
115
|
+
onCancel: createSignal(),
|
|
116
|
+
onComplete: createSignal(),
|
|
117
|
+
onError: createSignal(),
|
|
118
|
+
onPause: createSignal(),
|
|
119
|
+
onProgress: createSignal(),
|
|
120
|
+
onResume: createSignal(),
|
|
121
|
+
options: opts,
|
|
122
|
+
paused: false,
|
|
123
|
+
pending: [],
|
|
124
|
+
reports: [],
|
|
125
|
+
started: false,
|
|
126
|
+
streaming: opts.streaming ?? false,
|
|
127
|
+
throttle,
|
|
128
|
+
total: 0,
|
|
129
|
+
totalWeight: 0,
|
|
130
|
+
weightLoaded: 0,
|
|
131
|
+
};
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
export function disposeResourceLoader(loader) {
|
|
135
|
+
clearSignal(loader.onCancel);
|
|
136
|
+
clearSignal(loader.onComplete);
|
|
137
|
+
clearSignal(loader.onError);
|
|
138
|
+
clearSignal(loader.onPause);
|
|
139
|
+
clearSignal(loader.onProgress);
|
|
140
|
+
clearSignal(loader.onResume);
|
|
141
|
+
const internal = loader;
|
|
142
|
+
if (internal.itemSignals !== null) {
|
|
143
|
+
clearSignal(internal.itemSignals.onItemComplete);
|
|
144
|
+
clearSignal(internal.itemSignals.onItemError);
|
|
145
|
+
clearSignal(internal.itemSignals.onItemRetry);
|
|
146
|
+
clearSignal(internal.itemSignals.onItemStart);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export function enableResourceLoaderItemSignals(loader) {
|
|
150
|
+
const internal = loader;
|
|
151
|
+
if (internal.itemSignals === null) {
|
|
152
|
+
internal.itemSignals = {
|
|
153
|
+
onItemComplete: createSignal(),
|
|
154
|
+
onItemError: createSignal(),
|
|
155
|
+
onItemRetry: createSignal(),
|
|
156
|
+
onItemStart: createSignal(),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return internal.itemSignals;
|
|
160
|
+
}
|
|
161
|
+
export function getResourceLoadItemStatus(loader, key) {
|
|
162
|
+
const internal = loader;
|
|
163
|
+
const report = internal.reports.find((r) => r.key === key);
|
|
164
|
+
if (report !== undefined)
|
|
165
|
+
return report.status;
|
|
166
|
+
if (internal.pending.some((p) => p.key === key))
|
|
167
|
+
return 'pending';
|
|
168
|
+
for (const entry of internal.inFlight) {
|
|
169
|
+
if (entry.key === key)
|
|
170
|
+
return 'running';
|
|
171
|
+
}
|
|
172
|
+
return 'pending';
|
|
173
|
+
}
|
|
174
|
+
export function getResourceLoadProgress(loader, group) {
|
|
175
|
+
const internal = loader;
|
|
176
|
+
if (!internal.started)
|
|
177
|
+
return 0;
|
|
178
|
+
if (group !== undefined) {
|
|
179
|
+
const groupReports = internal.reports.filter((r) => r.group === group);
|
|
180
|
+
const groupPending = internal.pending.filter((p) => p.group === group);
|
|
181
|
+
let groupInFlight = 0;
|
|
182
|
+
for (const entry of internal.inFlight) {
|
|
183
|
+
if (entry.group === group)
|
|
184
|
+
groupInFlight++;
|
|
185
|
+
}
|
|
186
|
+
const groupTotal = groupReports.length + groupPending.length + groupInFlight;
|
|
187
|
+
if (groupTotal === 0)
|
|
188
|
+
return 0;
|
|
189
|
+
return groupReports.length / groupTotal;
|
|
190
|
+
}
|
|
191
|
+
if (internal.total === 0)
|
|
192
|
+
return 1;
|
|
193
|
+
if (internal.totalWeight > 0) {
|
|
194
|
+
return internal.weightLoaded / internal.totalWeight;
|
|
195
|
+
}
|
|
196
|
+
return internal.loaded / internal.total;
|
|
197
|
+
}
|
|
198
|
+
export function pauseResourceLoad(loader) {
|
|
199
|
+
const internal = loader;
|
|
200
|
+
if (!internal.started || internal.paused || internal.cancelled)
|
|
201
|
+
return;
|
|
202
|
+
internal.paused = true;
|
|
203
|
+
emitSignal(loader.onPause);
|
|
204
|
+
}
|
|
205
|
+
export function queueResourceLoad(loader, item) {
|
|
206
|
+
const internal = loader;
|
|
207
|
+
if (internal.started && !internal.streaming) {
|
|
208
|
+
throw new Error('Cannot queue resources after loading has started');
|
|
209
|
+
}
|
|
210
|
+
// Normalize thunk to descriptor
|
|
211
|
+
const descriptor = typeof item === 'function' ? { load: (_signal) => item() } : item;
|
|
212
|
+
const key = descriptor.key ?? `${AUTO_KEY_PREFIX}${internal.itemCounter++}`;
|
|
213
|
+
const weight = descriptor.weight ?? 1;
|
|
214
|
+
const priority = descriptor.priority ?? 0;
|
|
215
|
+
const retries = descriptor.retries ?? internal.options.retries ?? 0;
|
|
216
|
+
const timeoutMs = descriptor.timeoutMs ?? internal.options.timeoutMs ?? 0;
|
|
217
|
+
const group = descriptor.group;
|
|
218
|
+
const bytesHint = descriptor.bytesHint ?? 0;
|
|
219
|
+
const onBytesProgress = descriptor.onBytesProgress;
|
|
220
|
+
// Deduplication
|
|
221
|
+
const dedupe = internal.options.dedupe !== false;
|
|
222
|
+
if (dedupe && descriptor.key !== undefined) {
|
|
223
|
+
const existing = internal.dedupeMap.get(key);
|
|
224
|
+
if (existing !== undefined)
|
|
225
|
+
return existing;
|
|
226
|
+
}
|
|
227
|
+
let resolve;
|
|
228
|
+
let reject;
|
|
229
|
+
const promise = new Promise((res, rej) => {
|
|
230
|
+
resolve = res;
|
|
231
|
+
reject = rej;
|
|
232
|
+
});
|
|
233
|
+
const entry = acquirePendingEntry();
|
|
234
|
+
// AbortController is fresh from acquirePendingEntry / releasePendingEntry
|
|
235
|
+
entry.bytesHint = bytesHint;
|
|
236
|
+
entry.bytesLoaded = 0;
|
|
237
|
+
entry.group = group;
|
|
238
|
+
entry.key = key;
|
|
239
|
+
entry.onBytesProgress = onBytesProgress;
|
|
240
|
+
entry.priority = priority;
|
|
241
|
+
entry.reject = reject;
|
|
242
|
+
entry.resolve = resolve;
|
|
243
|
+
entry.retries = retries;
|
|
244
|
+
entry.startedAt = 0;
|
|
245
|
+
entry.timeoutMs = timeoutMs;
|
|
246
|
+
entry.weight = weight;
|
|
247
|
+
entry.wrappedLoad = descriptor.load;
|
|
248
|
+
internal.pending.push(entry);
|
|
249
|
+
internal.total++;
|
|
250
|
+
internal.totalWeight += weight;
|
|
251
|
+
const handle = { key, promise };
|
|
252
|
+
if (dedupe && descriptor.key !== undefined) {
|
|
253
|
+
internal.dedupeMap.set(key, handle);
|
|
254
|
+
}
|
|
255
|
+
// If streaming and started, try to dispatch immediately
|
|
256
|
+
if (internal.started && internal.streaming) {
|
|
257
|
+
void drainQueue(internal, loader);
|
|
258
|
+
}
|
|
259
|
+
return handle;
|
|
260
|
+
}
|
|
261
|
+
export function resetResourceLoader(loader) {
|
|
262
|
+
const internal = loader;
|
|
263
|
+
// Abort all in-flight loads before reset
|
|
264
|
+
for (const entry of internal.inFlight) {
|
|
265
|
+
entry.abortController.abort();
|
|
266
|
+
}
|
|
267
|
+
for (const entry of internal.pending) {
|
|
268
|
+
entry.abortController.abort();
|
|
269
|
+
releasePendingEntry(entry);
|
|
270
|
+
}
|
|
271
|
+
internal.cancelled = false;
|
|
272
|
+
internal.dedupeMap.clear();
|
|
273
|
+
internal.inFlight.clear();
|
|
274
|
+
internal.loaded = 0;
|
|
275
|
+
internal.paused = false;
|
|
276
|
+
internal.pending = [];
|
|
277
|
+
internal.reports = [];
|
|
278
|
+
internal.started = false;
|
|
279
|
+
internal.total = 0;
|
|
280
|
+
internal.totalWeight = 0;
|
|
281
|
+
internal.weightLoaded = 0;
|
|
282
|
+
// Reset throttle bucket if present
|
|
283
|
+
if (internal.throttle !== null) {
|
|
284
|
+
internal.throttle.tokens = internal.throttle.maxBytesPerSecond;
|
|
285
|
+
internal.throttle.lastRefillMs = Date.now();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
export function resumeResourceLoad(loader) {
|
|
289
|
+
const internal = loader;
|
|
290
|
+
if (!internal.paused || internal.cancelled)
|
|
291
|
+
return;
|
|
292
|
+
internal.paused = false;
|
|
293
|
+
emitSignal(loader.onResume);
|
|
294
|
+
void drainQueue(internal, loader);
|
|
295
|
+
}
|
|
296
|
+
export function setResourceLoaderConcurrency(loader, maxConcurrent) {
|
|
297
|
+
const internal = loader;
|
|
298
|
+
internal.maxConcurrent = maxConcurrent;
|
|
299
|
+
// If more slots are now available, drain the queue
|
|
300
|
+
if (internal.started && !internal.paused && !internal.cancelled) {
|
|
301
|
+
void drainQueue(internal, loader);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
export function setResourceLoadPriority(loader, key, priority) {
|
|
305
|
+
const internal = loader;
|
|
306
|
+
const entry = internal.pending.find((p) => p.key === key);
|
|
307
|
+
if (entry !== undefined) {
|
|
308
|
+
entry.priority = priority;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export function startResourceLoad(loader) {
|
|
312
|
+
const internal = loader;
|
|
313
|
+
if (internal.started && !internal.streaming)
|
|
314
|
+
return;
|
|
315
|
+
internal.started = true;
|
|
316
|
+
if (internal.total === 0) {
|
|
317
|
+
emitSignal(loader.onProgress, 0, 0);
|
|
318
|
+
emitSignal(loader.onComplete, []);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
void drainQueue(internal, loader);
|
|
322
|
+
}
|
|
323
|
+
// Sort pending items by priority (higher = first), then insertion order
|
|
324
|
+
function sortPendingByPriority(pending) {
|
|
325
|
+
pending.sort((a, b) => b.priority - a.priority);
|
|
326
|
+
}
|
|
327
|
+
async function drainQueue(internal, loader) {
|
|
328
|
+
const maxConcurrent = internal.maxConcurrent <= 0 ? Infinity : internal.maxConcurrent;
|
|
329
|
+
while (internal.pending.length > 0 &&
|
|
330
|
+
!internal.paused &&
|
|
331
|
+
!internal.cancelled &&
|
|
332
|
+
internal.inFlight.size < maxConcurrent) {
|
|
333
|
+
sortPendingByPriority(internal.pending);
|
|
334
|
+
const entry = internal.pending[0];
|
|
335
|
+
if (entry === undefined)
|
|
336
|
+
break;
|
|
337
|
+
// Token-bucket throttle: if a bytesHint is set and we have a throttle, check available tokens
|
|
338
|
+
if (internal.throttle !== null && entry.bytesHint > 0) {
|
|
339
|
+
const waitMs = tokenBucketDelayMs(internal.throttle, entry.bytesHint);
|
|
340
|
+
if (waitMs > 0) {
|
|
341
|
+
// Wait for tokens to refill, then try again
|
|
342
|
+
await delay(waitMs);
|
|
343
|
+
// Re-check state after the delay
|
|
344
|
+
if (internal.paused || internal.cancelled || internal.pending.length === 0)
|
|
345
|
+
break;
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
consumeTokens(internal.throttle, entry.bytesHint);
|
|
349
|
+
}
|
|
350
|
+
internal.pending.shift();
|
|
351
|
+
internal.inFlight.add(entry);
|
|
352
|
+
entry.startedAt = Date.now();
|
|
353
|
+
void runEntry(entry, internal, loader, 0);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Returns a promise that rejects when the abort signal fires
|
|
357
|
+
function abortSignalPromise(signal) {
|
|
358
|
+
return new Promise((_resolve, reject) => {
|
|
359
|
+
if (signal.aborted) {
|
|
360
|
+
reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
signal.addEventListener('abort', () => {
|
|
364
|
+
reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
|
|
365
|
+
}, { once: true });
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
async function runEntry(entry, internal, loader, attempt) {
|
|
369
|
+
if (internal.itemSignals !== null) {
|
|
370
|
+
emitSignal(internal.itemSignals.onItemStart, entry.key);
|
|
371
|
+
}
|
|
372
|
+
let timeoutId;
|
|
373
|
+
const signal = entry.abortController.signal;
|
|
374
|
+
// Apply timeout if configured
|
|
375
|
+
if (entry.timeoutMs > 0) {
|
|
376
|
+
timeoutId = setTimeout(() => {
|
|
377
|
+
entry.abortController.abort(new DOMException('Load timed out', 'TimeoutError'));
|
|
378
|
+
}, entry.timeoutMs);
|
|
379
|
+
}
|
|
380
|
+
try {
|
|
381
|
+
// Race the factory against the abort signal so cancellation/timeout is always honored,
|
|
382
|
+
// even if the factory itself does not check the signal.
|
|
383
|
+
const value = await Promise.race([entry.wrappedLoad(signal), abortSignalPromise(signal)]);
|
|
384
|
+
if (timeoutId !== undefined)
|
|
385
|
+
clearTimeout(timeoutId);
|
|
386
|
+
// If cancelled between the race resolving and here, treat as cancelled
|
|
387
|
+
if (internal.cancelled) {
|
|
388
|
+
internal.inFlight.delete(entry);
|
|
389
|
+
internal.loaded++;
|
|
390
|
+
releasePendingEntry(entry);
|
|
391
|
+
checkCompleteAfterCancel(internal, loader);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const elapsedMs = Date.now() - entry.startedAt;
|
|
395
|
+
const report = {
|
|
396
|
+
attempts: attempt + 1,
|
|
397
|
+
bytes: entry.bytesLoaded,
|
|
398
|
+
elapsedMs,
|
|
399
|
+
group: entry.group,
|
|
400
|
+
key: entry.key,
|
|
401
|
+
status: 'loaded',
|
|
402
|
+
};
|
|
403
|
+
internal.reports.push(report);
|
|
404
|
+
internal.weightLoaded += entry.weight;
|
|
405
|
+
entry.resolve(value);
|
|
406
|
+
if (internal.itemSignals !== null) {
|
|
407
|
+
emitSignal(internal.itemSignals.onItemComplete, entry.key, value);
|
|
408
|
+
}
|
|
409
|
+
settleEntry(entry, internal, loader);
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
if (timeoutId !== undefined)
|
|
413
|
+
clearTimeout(timeoutId);
|
|
414
|
+
// If cancelled, record as cancelled and update batch completion
|
|
415
|
+
if (internal.cancelled) {
|
|
416
|
+
const report = {
|
|
417
|
+
attempts: attempt + 1,
|
|
418
|
+
bytes: entry.bytesLoaded,
|
|
419
|
+
elapsedMs: Date.now() - entry.startedAt,
|
|
420
|
+
group: entry.group,
|
|
421
|
+
key: entry.key,
|
|
422
|
+
status: 'cancelled',
|
|
423
|
+
};
|
|
424
|
+
internal.reports.push(report);
|
|
425
|
+
entry.reject(error);
|
|
426
|
+
internal.inFlight.delete(entry);
|
|
427
|
+
internal.loaded++;
|
|
428
|
+
releasePendingEntry(entry);
|
|
429
|
+
checkCompleteAfterCancel(internal, loader);
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
const isAbortOrTimeout = error instanceof DOMException && (error.name === 'AbortError' || error.name === 'TimeoutError');
|
|
433
|
+
// Retry on any non-abort/timeout error
|
|
434
|
+
if (attempt < entry.retries && !isAbortOrTimeout) {
|
|
435
|
+
const delayMs = computeRetryDelay(attempt, internal);
|
|
436
|
+
if (internal.itemSignals !== null) {
|
|
437
|
+
emitSignal(internal.itemSignals.onItemRetry, entry.key, attempt + 1, delayMs);
|
|
438
|
+
}
|
|
439
|
+
await delay(delayMs);
|
|
440
|
+
// Check again after delay in case cancelled
|
|
441
|
+
if (internal.cancelled) {
|
|
442
|
+
internal.inFlight.delete(entry);
|
|
443
|
+
internal.loaded++;
|
|
444
|
+
releasePendingEntry(entry);
|
|
445
|
+
checkCompleteAfterCancel(internal, loader);
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
void runEntry(entry, internal, loader, attempt + 1);
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
// Hard failure
|
|
452
|
+
const elapsedMs = Date.now() - entry.startedAt;
|
|
453
|
+
const report = {
|
|
454
|
+
attempts: attempt + 1,
|
|
455
|
+
bytes: entry.bytesLoaded,
|
|
456
|
+
elapsedMs,
|
|
457
|
+
group: entry.group,
|
|
458
|
+
key: entry.key,
|
|
459
|
+
status: 'failed',
|
|
460
|
+
};
|
|
461
|
+
internal.reports.push(report);
|
|
462
|
+
if (internal.itemSignals !== null) {
|
|
463
|
+
emitSignal(internal.itemSignals.onItemError, entry.key, error, attempt + 1);
|
|
464
|
+
}
|
|
465
|
+
entry.reject(error);
|
|
466
|
+
emitSignal(loader.onError, error, entry.key);
|
|
467
|
+
// Fail-fast: cancel remaining pending loads before settling
|
|
468
|
+
if (internal.errorPolicy === 'fail-fast') {
|
|
469
|
+
cancelRemainingEntries(internal);
|
|
470
|
+
settleEntry(entry, internal, loader);
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
settleEntry(entry, internal, loader);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function checkCompleteAfterCancel(internal, loader) {
|
|
477
|
+
if (internal.inFlight.size === 0) {
|
|
478
|
+
emitSignal(loader.onProgress, internal.loaded, internal.total);
|
|
479
|
+
emitSignal(loader.onComplete, internal.reports);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
function cancelRemainingEntries(internal) {
|
|
483
|
+
for (const entry of internal.pending) {
|
|
484
|
+
entry.abortController.abort();
|
|
485
|
+
const report = {
|
|
486
|
+
attempts: 0,
|
|
487
|
+
bytes: 0,
|
|
488
|
+
elapsedMs: 0,
|
|
489
|
+
group: entry.group,
|
|
490
|
+
key: entry.key,
|
|
491
|
+
status: 'skipped',
|
|
492
|
+
};
|
|
493
|
+
internal.reports.push(report);
|
|
494
|
+
entry.reject(new DOMException('Load skipped due to fail-fast error policy', 'AbortError'));
|
|
495
|
+
internal.loaded++;
|
|
496
|
+
releasePendingEntry(entry);
|
|
497
|
+
}
|
|
498
|
+
internal.pending = [];
|
|
499
|
+
}
|
|
500
|
+
function computeRetryDelay(attempt, internal) {
|
|
501
|
+
const backoff = internal.options.retryBackoff ?? 'none';
|
|
502
|
+
const baseMs = internal.options.retryBaseDelayMs ?? 100;
|
|
503
|
+
const maxMs = internal.options.retryMaxDelayMs ?? 10000;
|
|
504
|
+
if (backoff === 'none')
|
|
505
|
+
return 0;
|
|
506
|
+
if (backoff === 'linear')
|
|
507
|
+
return Math.min(baseMs * (attempt + 1), maxMs);
|
|
508
|
+
// exponential
|
|
509
|
+
return Math.min(baseMs * Math.pow(2, attempt), maxMs);
|
|
510
|
+
}
|
|
511
|
+
function delay(ms) {
|
|
512
|
+
if (ms <= 0)
|
|
513
|
+
return Promise.resolve();
|
|
514
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
515
|
+
}
|
|
516
|
+
function settleEntry(entry, internal, loader) {
|
|
517
|
+
internal.inFlight.delete(entry);
|
|
518
|
+
internal.loaded++;
|
|
519
|
+
emitSignal(loader.onProgress, internal.loaded, internal.total);
|
|
520
|
+
releasePendingEntry(entry);
|
|
521
|
+
if (internal.loaded === internal.total) {
|
|
522
|
+
emitSignal(loader.onComplete, internal.reports);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
// Drain more items if available
|
|
526
|
+
void drainQueue(internal, loader);
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=resourceLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceLoader.js","sourceRoot":"","sources":["../src/resourceLoader.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flighthq/loader",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"default": "./dist/index.js"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"src/**/*.test.ts",
|
|
16
|
+
"!dist/**/*.test.js",
|
|
17
|
+
"!dist/**/*.test.d.ts",
|
|
18
|
+
"!dist/**/*.test.js.map",
|
|
19
|
+
"!dist/**/*.test.d.ts.map"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc -b",
|
|
23
|
+
"clean": "tsc -b --clean",
|
|
24
|
+
"test": "vitest run --config vitest.config.ts",
|
|
25
|
+
"test:watch": "vitest --watch --config vitest.config.ts",
|
|
26
|
+
"prepack": "npm run clean && npm run clean:dist && npm run build",
|
|
27
|
+
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@flighthq/signals": "0.1.0",
|
|
31
|
+
"@flighthq/types": "0.1.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"typescript": "^5.3.0"
|
|
35
|
+
},
|
|
36
|
+
"description": "Group resource loading with progress and completion signals",
|
|
37
|
+
"sideEffects": false
|
|
38
|
+
}
|