@warp-drive/core 5.8.0-alpha.5 → 5.8.0-alpha.6

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.
@@ -1,4 +1,4 @@
1
- import { STRUCTURED, IS_FUTURE, SkipCache } from './types/request.js';
1
+ import { SkipCache, STRUCTURED, IS_FUTURE } from './types/request.js';
2
2
  import { getOrSetGlobal, getOrSetUniversal } from './types/-private.js';
3
3
  import { macroCondition, getGlobalConfig } from '@embroider/macros';
4
4
  const BODY_TYPES = {
@@ -233,6 +233,179 @@ function assertValidRequest(request, isTopLevel) {
233
233
  }
234
234
  }
235
235
  }
236
+ function upgradeHeaders(headers) {
237
+ headers.clone = () => {
238
+ return new Headers(headers);
239
+ };
240
+ headers.toJSON = () => {
241
+ return Array.from(headers);
242
+ };
243
+ return headers;
244
+ }
245
+ function cloneResponseProperties(response) {
246
+ const {
247
+ headers,
248
+ ok,
249
+ redirected,
250
+ status,
251
+ statusText,
252
+ type,
253
+ url
254
+ } = response;
255
+ upgradeHeaders(headers);
256
+ return {
257
+ headers: headers,
258
+ ok,
259
+ redirected,
260
+ status,
261
+ statusText,
262
+ type,
263
+ url
264
+ };
265
+ }
266
+ class ContextOwner {
267
+ hasSetStream = false;
268
+ hasSetResponse = false;
269
+ hasSubscribers = false;
270
+ stream = createDeferred();
271
+ response = null;
272
+ nextCalled = 0;
273
+ constructor(request, god, isRoot = false) {
274
+ this.isRoot = isRoot;
275
+ this.requestId = god.id;
276
+ this.controller = request.controller || god.controller;
277
+ this.stream.promise.sizeHint = 0;
278
+ if (request.controller) {
279
+ if (request.controller !== god.controller) {
280
+ god.controller.signal.addEventListener('abort', () => {
281
+ this.controller.abort(god.controller.signal.reason);
282
+ });
283
+ }
284
+ delete request.controller;
285
+ }
286
+ let enhancedRequest = Object.assign({
287
+ signal: this.controller.signal
288
+ }, request);
289
+ if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
290
+ if (!request?.cacheOptions?.[SkipCache]) {
291
+ request = deepFreeze(request);
292
+ enhancedRequest = deepFreeze(enhancedRequest);
293
+ }
294
+ } else {
295
+ if (request.headers) {
296
+ upgradeHeaders(request.headers);
297
+ }
298
+ }
299
+ this.enhancedRequest = enhancedRequest;
300
+ this.request = request;
301
+ this.god = god;
302
+ this.stream.promise = this.stream.promise.then(stream => {
303
+ if (this.god.stream === stream && this.hasSubscribers) {
304
+ this.god.stream = null;
305
+ }
306
+ return stream;
307
+ });
308
+ }
309
+ get hasRequestedStream() {
310
+ return this.god.hasRequestedStream;
311
+ }
312
+ getResponse() {
313
+ if (this.hasSetResponse) {
314
+ return this.response;
315
+ }
316
+ if (this.nextCalled === 1) {
317
+ return this.god.response;
318
+ }
319
+ return null;
320
+ }
321
+ getStream() {
322
+ if (this.isRoot) {
323
+ this.god.hasRequestedStream = true;
324
+ }
325
+ if (!this.hasSetResponse) {
326
+ const hint = this.god.response?.headers?.get('content-length');
327
+ this.stream.promise.sizeHint = hint ? parseInt(hint, 10) : 0;
328
+ }
329
+ this.hasSubscribers = true;
330
+ return this.stream.promise;
331
+ }
332
+ abort(reason) {
333
+ this.controller.abort(reason);
334
+ }
335
+ setStream(stream) {
336
+ if (!this.hasSetStream) {
337
+ this.hasSetStream = true;
338
+ if (!(stream instanceof Promise)) {
339
+ this.god.stream = stream;
340
+ }
341
+ // @ts-expect-error
342
+ this.stream.resolve(stream);
343
+ }
344
+ }
345
+ resolveStream() {
346
+ this.setStream(this.nextCalled === 1 ? this.god.stream : null);
347
+ }
348
+ setResponse(response) {
349
+ if (this.hasSetResponse) {
350
+ if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
351
+ throw new Error(`Cannot setResponse when a response has already been set`);
352
+ }
353
+ return;
354
+ }
355
+ this.hasSetResponse = true;
356
+ if (response instanceof Response) {
357
+ // TODO potentially avoid cloning in prod
358
+ let responseData = cloneResponseProperties(response);
359
+ if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
360
+ responseData = deepFreeze(responseData);
361
+ }
362
+ this.response = responseData;
363
+ this.god.response = responseData;
364
+ const sizeHint = response.headers?.get('content-length');
365
+ this.stream.promise.sizeHint = sizeHint ? parseInt(sizeHint, 10) : 0;
366
+ } else {
367
+ this.response = response;
368
+ this.god.response = response;
369
+ }
370
+ }
371
+ }
372
+ class Context {
373
+ /** @internal */
374
+
375
+ /** @internal */
376
+
377
+ /** @internal */
378
+
379
+ constructor(owner, isCacheHandler) {
380
+ this.id = owner.requestId;
381
+ this.___owner = owner;
382
+ this.request = owner.enhancedRequest;
383
+ this._isCacheHandler = isCacheHandler;
384
+ this._finalized = false;
385
+ }
386
+ setStream(stream) {
387
+ this.___owner.setStream(stream);
388
+ }
389
+ setResponse(response) {
390
+ this.___owner.setResponse(response);
391
+ }
392
+ setIdentifier(identifier) {
393
+ macroCondition(getGlobalConfig().WarpDrive.env.DEBUG) ? (test => {
394
+ if (!test) {
395
+ throw new Error(`setIdentifier may only be used synchronously from a CacheHandler`);
396
+ }
397
+ })(identifier && this._isCacheHandler && !this._finalized) : {};
398
+ this.___owner.god.identifier = identifier;
399
+ }
400
+ get hasRequestedStream() {
401
+ return this.___owner.hasRequestedStream;
402
+ }
403
+
404
+ /** @private */
405
+ _finalize() {
406
+ this._finalized = true;
407
+ }
408
+ }
236
409
  const PromiseCache = getOrSetUniversal('PromiseCache', new WeakMap());
237
410
  const RequestMap = getOrSetUniversal('RequestMap', new Map());
238
411
  function setRequestResult(requestId, result) {
@@ -502,177 +675,4 @@ function createFuture(owner) {
502
675
  deferred.promise = promise;
503
676
  return deferred;
504
677
  }
505
- function upgradeHeaders(headers) {
506
- headers.clone = () => {
507
- return new Headers(headers);
508
- };
509
- headers.toJSON = () => {
510
- return Array.from(headers);
511
- };
512
- return headers;
513
- }
514
- function cloneResponseProperties(response) {
515
- const {
516
- headers,
517
- ok,
518
- redirected,
519
- status,
520
- statusText,
521
- type,
522
- url
523
- } = response;
524
- upgradeHeaders(headers);
525
- return {
526
- headers: headers,
527
- ok,
528
- redirected,
529
- status,
530
- statusText,
531
- type,
532
- url
533
- };
534
- }
535
- class ContextOwner {
536
- hasSetStream = false;
537
- hasSetResponse = false;
538
- hasSubscribers = false;
539
- stream = createDeferred();
540
- response = null;
541
- nextCalled = 0;
542
- constructor(request, god, isRoot = false) {
543
- this.isRoot = isRoot;
544
- this.requestId = god.id;
545
- this.controller = request.controller || god.controller;
546
- this.stream.promise.sizeHint = 0;
547
- if (request.controller) {
548
- if (request.controller !== god.controller) {
549
- god.controller.signal.addEventListener('abort', () => {
550
- this.controller.abort(god.controller.signal.reason);
551
- });
552
- }
553
- delete request.controller;
554
- }
555
- let enhancedRequest = Object.assign({
556
- signal: this.controller.signal
557
- }, request);
558
- if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
559
- if (!request?.cacheOptions?.[SkipCache]) {
560
- request = deepFreeze(request);
561
- enhancedRequest = deepFreeze(enhancedRequest);
562
- }
563
- } else {
564
- if (request.headers) {
565
- upgradeHeaders(request.headers);
566
- }
567
- }
568
- this.enhancedRequest = enhancedRequest;
569
- this.request = request;
570
- this.god = god;
571
- this.stream.promise = this.stream.promise.then(stream => {
572
- if (this.god.stream === stream && this.hasSubscribers) {
573
- this.god.stream = null;
574
- }
575
- return stream;
576
- });
577
- }
578
- get hasRequestedStream() {
579
- return this.god.hasRequestedStream;
580
- }
581
- getResponse() {
582
- if (this.hasSetResponse) {
583
- return this.response;
584
- }
585
- if (this.nextCalled === 1) {
586
- return this.god.response;
587
- }
588
- return null;
589
- }
590
- getStream() {
591
- if (this.isRoot) {
592
- this.god.hasRequestedStream = true;
593
- }
594
- if (!this.hasSetResponse) {
595
- const hint = this.god.response?.headers?.get('content-length');
596
- this.stream.promise.sizeHint = hint ? parseInt(hint, 10) : 0;
597
- }
598
- this.hasSubscribers = true;
599
- return this.stream.promise;
600
- }
601
- abort(reason) {
602
- this.controller.abort(reason);
603
- }
604
- setStream(stream) {
605
- if (!this.hasSetStream) {
606
- this.hasSetStream = true;
607
- if (!(stream instanceof Promise)) {
608
- this.god.stream = stream;
609
- }
610
- // @ts-expect-error
611
- this.stream.resolve(stream);
612
- }
613
- }
614
- resolveStream() {
615
- this.setStream(this.nextCalled === 1 ? this.god.stream : null);
616
- }
617
- setResponse(response) {
618
- if (this.hasSetResponse) {
619
- if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
620
- throw new Error(`Cannot setResponse when a response has already been set`);
621
- }
622
- return;
623
- }
624
- this.hasSetResponse = true;
625
- if (response instanceof Response) {
626
- // TODO potentially avoid cloning in prod
627
- let responseData = cloneResponseProperties(response);
628
- if (macroCondition(getGlobalConfig().WarpDrive.env.DEBUG)) {
629
- responseData = deepFreeze(responseData);
630
- }
631
- this.response = responseData;
632
- this.god.response = responseData;
633
- const sizeHint = response.headers?.get('content-length');
634
- this.stream.promise.sizeHint = sizeHint ? parseInt(sizeHint, 10) : 0;
635
- } else {
636
- this.response = response;
637
- this.god.response = response;
638
- }
639
- }
640
- }
641
- class Context {
642
- /** @internal */
643
-
644
- /** @internal */
645
-
646
- /** @internal */
647
-
648
- constructor(owner, isCacheHandler) {
649
- this.id = owner.requestId;
650
- this.___owner = owner;
651
- this.request = owner.enhancedRequest;
652
- this._isCacheHandler = isCacheHandler;
653
- this._finalized = false;
654
- }
655
- setStream(stream) {
656
- this.___owner.setStream(stream);
657
- }
658
- setResponse(response) {
659
- this.___owner.setResponse(response);
660
- }
661
- setIdentifier(identifier) {
662
- macroCondition(getGlobalConfig().WarpDrive.env.DEBUG) ? (test => {
663
- if (!test) {
664
- throw new Error(`setIdentifier may only be used synchronously from a CacheHandler`);
665
- }
666
- })(identifier && this._isCacheHandler && !this._finalized) : {};
667
- this.___owner.god.identifier = identifier;
668
- }
669
- get hasRequestedStream() {
670
- return this.___owner.hasRequestedStream;
671
- }
672
-
673
- /** @private */
674
- _finalize() {
675
- this._finalized = true;
676
- }
677
- }
678
678
  export { IS_CACHE_HANDLER as I, cloneResponseProperties as a, assertValidRequest as b, createDeferred as c, getRequestResult as d, executeNextHandler as e, clearRequestResult as f, getPromiseResult as g, setPromiseResult as s, upgradePromise as u };