@outfoxx/sunday 2.0.0-beta.18 → 2.0.0-beta.19

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.
Files changed (66) hide show
  1. package/README.md +191 -30
  2. package/build/client-settings.d.ts +6 -7
  3. package/build/client-settings.js +58 -28
  4. package/build/client-settings.js.map +1 -1
  5. package/build/event-parser.d.ts +21 -8
  6. package/build/event-parser.js +93 -121
  7. package/build/event-parser.js.map +1 -1
  8. package/build/fetch-copy.d.ts +15 -0
  9. package/build/fetch-copy.js +70 -0
  10. package/build/fetch-copy.js.map +1 -0
  11. package/build/fetch-event-source.d.ts +6 -5
  12. package/build/fetch-event-source.js +168 -137
  13. package/build/fetch-event-source.js.map +1 -1
  14. package/build/fetch-oauth-token-provider.js +61 -19
  15. package/build/fetch-oauth-token-provider.js.map +1 -1
  16. package/build/fetch-transport.d.ts +14 -6
  17. package/build/fetch-transport.js +126 -168
  18. package/build/fetch-transport.js.map +1 -1
  19. package/build/fetch.js +5 -0
  20. package/build/fetch.js.map +1 -1
  21. package/build/index.d.ts +7 -2
  22. package/build/index.js +6 -2
  23. package/build/index.js.map +1 -1
  24. package/build/request-adapter.d.ts +8 -0
  25. package/build/{token-manager-factory.js → request-adapter.js} +1 -1
  26. package/build/request-adapter.js.map +1 -0
  27. package/build/request-adapters.d.ts +25 -8
  28. package/build/request-adapters.js +126 -14
  29. package/build/request-adapters.js.map +1 -1
  30. package/build/request-body.d.ts +24 -0
  31. package/build/request-body.js +104 -0
  32. package/build/request-body.js.map +1 -0
  33. package/build/request-cancellation-error.d.ts +13 -0
  34. package/build/request-cancellation-error.js +43 -0
  35. package/build/request-cancellation-error.js.map +1 -0
  36. package/build/request-execution.d.ts +18 -0
  37. package/build/request-execution.js +108 -0
  38. package/build/request-execution.js.map +1 -0
  39. package/build/request-security.d.ts +9 -3
  40. package/build/request-security.js +101 -36
  41. package/build/request-security.js.map +1 -1
  42. package/build/response-adapter.d.ts +10 -0
  43. package/build/response-adapter.js +15 -0
  44. package/build/response-adapter.js.map +1 -0
  45. package/build/response-adapters.d.ts +13 -0
  46. package/build/response-adapters.js +75 -0
  47. package/build/response-adapters.js.map +1 -0
  48. package/build/token-manager.d.ts +13 -4
  49. package/build/token-manager.js +110 -33
  50. package/build/token-manager.js.map +1 -1
  51. package/build/token-provider.d.ts +8 -1
  52. package/build/token-provider.js +71 -0
  53. package/build/token-provider.js.map +1 -1
  54. package/build/transport.d.ts +3 -3
  55. package/build/util/abort.d.ts +3 -0
  56. package/build/util/abort.js +42 -0
  57. package/build/util/abort.js.map +1 -0
  58. package/build/util/native-fetch.d.ts +2 -0
  59. package/build/util/native-fetch.js +39 -0
  60. package/build/util/native-fetch.js.map +1 -0
  61. package/build/util/owned-body.d.ts +12 -0
  62. package/build/util/owned-body.js +243 -0
  63. package/build/util/owned-body.js.map +1 -0
  64. package/package.json +9 -6
  65. package/build/token-manager-factory.d.ts +0 -9
  66. package/build/token-manager-factory.js.map +0 -1
@@ -11,141 +11,113 @@
11
11
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
+ /** Incremental UTF-8 SSE parser. Create one instance per connection; incomplete events end with it. */
14
15
  export class EventParser {
15
- decoder = new TextDecoder('utf-8');
16
- unprocessedBuffer;
17
- process(buffer, dispatcher) {
18
- const availableBuffer = this.buildAvailableBuffer(buffer);
19
- if (!availableBuffer) {
20
- return;
21
- }
22
- const eventStrings = this.extractEventStringsFromBuffer(availableBuffer);
23
- if (!eventStrings.length) {
24
- return;
25
- }
26
- EventParser.parseAndDispatchEvents(eventStrings, dispatcher);
16
+ control;
17
+ // Node can strip two consecutive BOMs when the first spans chunks; remove exactly one here.
18
+ decoder = new TextDecoder('utf-8', { ignoreBOM: true });
19
+ atStart = true;
20
+ lineParts = [];
21
+ event = {};
22
+ data = [];
23
+ skipLF = false;
24
+ /** Receives each completed control line, even when EOF discards the unfinished message. */
25
+ constructor(control = () => { }) {
26
+ this.control = control;
27
27
  }
28
- buildAvailableBuffer(buffer) {
29
- const unprocessedBuffer = this.unprocessedBuffer;
30
- this.unprocessedBuffer = undefined;
31
- if (!buffer.byteLength) {
32
- return unprocessedBuffer;
33
- }
34
- else if (!unprocessedBuffer?.byteLength) {
35
- return buffer;
28
+ /** Parses complete lines and events, discarding the rest of a chunk when the signal aborts. */
29
+ process(buffer, dispatcher, signal) {
30
+ if (signal?.aborted) {
31
+ this.discard();
32
+ return;
36
33
  }
37
- const newBuffer = new Uint8Array(unprocessedBuffer.byteLength + buffer.byteLength);
38
- newBuffer.set(new Uint8Array(unprocessedBuffer), 0);
39
- newBuffer.set(new Uint8Array(buffer), unprocessedBuffer.byteLength);
40
- return newBuffer.buffer;
41
- }
42
- extractEventStringsFromBuffer(buffer) {
43
- const eventStrings = [];
44
- while (buffer.byteLength) {
45
- // Find end of next event separator in buffer, exiting if none found.
46
- const eventSeparator = EventParser.findEventSeparator(buffer);
47
- if (!eventSeparator) {
48
- // Save unprocessed data
49
- this.unprocessedBuffer = buffer;
50
- break;
51
- }
52
- const [endOfCurrentEventIdx, startOfNextEventIdx] = eventSeparator;
53
- const eventBuffer = buffer.slice(0, endOfCurrentEventIdx);
54
- buffer = buffer.slice(startOfNextEventIdx);
55
- const eventString = this.decoder.decode(eventBuffer, {
56
- stream: true,
57
- });
58
- eventStrings.push(eventString);
34
+ let text = this.decoder.decode(buffer, { stream: true });
35
+ if (this.atStart && text.length) {
36
+ this.atStart = false;
37
+ if (text[0] === '\ufeff')
38
+ text = text.slice(1);
59
39
  }
60
- return eventStrings;
61
- }
62
- static findEventSeparator(buffer) {
63
- const bytes = new Uint8Array(buffer);
64
- for (let idx = 0; idx < bytes.length; ++idx) {
65
- const byte = bytes[idx];
66
- switch (byte) {
67
- // line-feed
68
- case 0xa: {
69
- // if the next byte is the
70
- // same, we found a separator
71
- if (bytes[idx + 1] == 0xa) {
72
- return [idx, idx + 2];
73
- }
74
- break;
75
- }
76
- // carriage-return
77
- case 0xd: {
78
- // if the next byte is the
79
- // same, we found a separator
80
- if (bytes[idx + 1] == 0xd) {
81
- return [idx, idx + 2];
82
- }
83
- // if next is line-feed, and pattern
84
- // repeats, we found a separator.
85
- if (bytes[idx + 1] == 0xa &&
86
- bytes[idx + 2] == 0xd &&
87
- bytes[idx + 3] == 0xa) {
88
- return [idx, idx + 4];
89
- }
90
- break;
40
+ let start = 0;
41
+ for (let index = 0; index < text.length; index++) {
42
+ const character = text[index];
43
+ // A CR completes its line immediately; only its optional following LF is skipped.
44
+ if (this.skipLF) {
45
+ this.skipLF = false;
46
+ if (character === '\n') {
47
+ start = index + 1;
48
+ continue;
91
49
  }
92
- default:
93
50
  }
94
- }
95
- return undefined;
96
- }
97
- static parseAndDispatchEvents(eventStrings, dispatcher) {
98
- for (const eventString of eventStrings) {
99
- if (!eventString.length) {
51
+ if (character !== '\r' && character !== '\n')
100
52
  continue;
101
- }
102
- const parsedEvent = EventParser.parseEvent(eventString);
103
- dispatcher(parsedEvent);
104
- }
105
- }
106
- static parseEvent(eventString) {
107
- const event = {};
108
- for (const line of eventString.split(lineSeparatorsRegEx)) {
109
- const keyValueSeparatorIdx = line.indexOf(':');
110
- let key;
111
- let value;
112
- if (keyValueSeparatorIdx != -1) {
113
- key = line.slice(0, keyValueSeparatorIdx);
114
- value = line.slice(keyValueSeparatorIdx + 1);
53
+ this.lineParts.push(text.slice(start, index));
54
+ const line = this.lineParts.join('');
55
+ this.lineParts.length = 0;
56
+ this.skipLF = character === '\r';
57
+ start = index + 1;
58
+ if (line) {
59
+ this.processLine(line);
115
60
  }
116
61
  else {
117
- key = line;
118
- value = '';
62
+ const event = this.event;
63
+ if (this.data.length)
64
+ event.data = this.data.join('\n');
65
+ this.event = {};
66
+ this.data.length = 0;
67
+ if (event.data !== undefined || event.id !== undefined)
68
+ dispatcher(event);
119
69
  }
120
- switch (key) {
121
- case 'retry':
122
- event.retry = EventParser.trimFieldValue(value);
123
- break;
124
- case 'data': {
125
- const data = event.data ?? '';
126
- event.data = `${data}${EventParser.trimFieldValue(value)}\n`;
127
- break;
128
- }
129
- case '':
130
- // comment do nothing
131
- break;
132
- default: {
133
- event[key] =
134
- EventParser.trimFieldValue(value);
135
- }
70
+ if (signal?.aborted) {
71
+ this.discard();
72
+ return;
136
73
  }
137
74
  }
138
- if (event.data?.[event.data?.length - 1] == '\n') {
139
- event.data = event.data.slice(0, -1);
140
- }
141
- return event;
75
+ if (start < text.length)
76
+ this.lineParts.push(text.slice(start));
77
+ }
78
+ discard() {
79
+ // decode() without stream resets UTF-8/BOM state, including a partial character in the
80
+ // discarded tail. It must not contaminate a later call after cancellation.
81
+ this.decoder.decode();
82
+ this.atStart = true;
83
+ this.lineParts.length = 0;
84
+ this.event = {};
85
+ this.data.length = 0;
86
+ this.skipLF = false;
142
87
  }
143
- static trimFieldValue(value) {
144
- if (value[0] !== ' ') {
145
- return value;
88
+ processLine(line) {
89
+ const colon = line.indexOf(':');
90
+ const key = colon < 0 ? line : line.slice(0, colon);
91
+ let value = colon < 0 ? '' : line.slice(colon + 1);
92
+ if (value.startsWith(' '))
93
+ value = value.slice(1);
94
+ switch (key) {
95
+ case 'data':
96
+ this.data.push(value);
97
+ break;
98
+ case 'id':
99
+ if (!value.includes('\0'))
100
+ this.event.id = value;
101
+ break;
102
+ case 'retry':
103
+ if (parseEventMilliseconds(value) !== undefined)
104
+ this.control({ retry: value });
105
+ break;
106
+ case 'event':
107
+ this.event.event = value;
108
+ break;
109
+ case 'keepalive':
110
+ case 'retry-max':
111
+ this.control({ [key]: value });
112
+ break;
146
113
  }
147
- return value.slice(1);
148
114
  }
149
115
  }
150
- const lineSeparatorsRegEx = /\r\n|\r|\n/;
116
+ /** @internal Parses bounded SSE millisecond values without accepting partial numbers. */
117
+ export function parseEventMilliseconds(value) {
118
+ if (!/^\d+$/.test(value))
119
+ return undefined;
120
+ const milliseconds = Number(value);
121
+ return Number.isSafeInteger(milliseconds) ? milliseconds : undefined;
122
+ }
151
123
  //# sourceMappingURL=event-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-parser.js","sourceRoot":"","sources":["../src/event-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-parser.js","sourceRoot":"","sources":["../src/event-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copies native Fetch request settings and transfers responsibility for its body. The old request
3
+ * must not subsequently consume the body. Supply a replacement after consuming a body.
4
+ */
5
+ export declare function copyRequest(request: Request, changes?: RequestInit & {
6
+ url?: string | URL;
7
+ duplex?: 'half';
8
+ }): Request;
9
+ /**
10
+ * Copies an inspectable response without teeing its body, retaining Fetch metadata.
11
+ * Opaque/error responses cannot be reconstructed with the platform Response constructor.
12
+ */
13
+ export declare function copyResponse(response: Response, changes?: ResponseInit & {
14
+ body?: BodyInit | null;
15
+ }): Response;
@@ -0,0 +1,70 @@
1
+ // Copyright 2020 Outfox, Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ import { inheritBody } from './util/owned-body.js';
15
+ /**
16
+ * Copies native Fetch request settings and transfers responsibility for its body. The old request
17
+ * must not subsequently consume the body. Supply a replacement after consuming a body.
18
+ */
19
+ export function copyRequest(request, changes = {}) {
20
+ const { url = request.url, ...init } = changes;
21
+ const sameURL = String(url) === request.url;
22
+ // Native Request copies inherit the input body for null as well as undefined. Bun may
23
+ // instead return a bodyless request; inheritBody only records a transfer when a body exists.
24
+ const originalBody = request.body;
25
+ const body = init.body === undefined || (sameURL && init.body === null)
26
+ ? originalBody
27
+ : init.body;
28
+ const result = sameURL
29
+ ? new Request(request, init)
30
+ : new Request(url, {
31
+ method: request.method,
32
+ headers: request.headers,
33
+ signal: request.signal,
34
+ cache: request.cache,
35
+ credentials: request.credentials,
36
+ integrity: request.integrity,
37
+ keepalive: request.keepalive,
38
+ mode: request.mode,
39
+ redirect: request.redirect,
40
+ referrer: request.referrer,
41
+ referrerPolicy: request.referrerPolicy,
42
+ ...(request.body ? { duplex: 'half' } : {}),
43
+ ...init,
44
+ body,
45
+ });
46
+ inheritBody(body instanceof ReadableStream ? body : undefined, result, body === originalBody ? request.body : undefined);
47
+ return result;
48
+ }
49
+ /**
50
+ * Copies an inspectable response without teeing its body, retaining Fetch metadata.
51
+ * Opaque/error responses cannot be reconstructed with the platform Response constructor.
52
+ */
53
+ export function copyResponse(response, changes = {}) {
54
+ const { body = response.body, ...init } = changes;
55
+ const result = new Response(body, {
56
+ status: response.status,
57
+ statusText: response.statusText,
58
+ headers: response.headers,
59
+ ...init,
60
+ });
61
+ for (const name of ['url', 'redirected', 'type']) {
62
+ Object.defineProperty(result, name, {
63
+ value: response[name],
64
+ configurable: true,
65
+ });
66
+ }
67
+ inheritBody(body instanceof ReadableStream ? body : undefined, result);
68
+ return result;
69
+ }
70
+ //# sourceMappingURL=fetch-copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-copy.js","sourceRoot":"","sources":["../src/fetch-copy.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ export interface FetchEventSource {
7
7
  export declare class FetchEventSource extends EventTarget implements ExtEventSource {
8
8
  private static readonly LAST_EVENT_ID_HEADER;
9
9
  private static readonly RETRY_TIME_DEFAULT;
10
+ private static readonly MAX_TIMER_DELAY;
10
11
  private static readonly RETRY_MAX_MULTIPLIER_DEFAULT;
11
12
  private static readonly KEEPALIVE_TIMEOUT_MULTIPLIER;
12
13
  private static readonly KEEPALIVE_TIMEOUT_MINIMUM;
@@ -40,11 +41,10 @@ export declare class FetchEventSource extends EventTarget implements ExtEventSou
40
41
  private readonly eventTimeoutCheckInterval;
41
42
  private eventTimeoutCheckHandle?;
42
43
  private lastEventReceivedTime;
43
- private readonly eventParser;
44
44
  constructor(url: string, eventSourceInit?: EventSourceInit & {
45
45
  adapter?: (url: string, requestInit: RequestInit) => Promise<Request>;
46
46
  /** Executes one connection using a subscription-owned authentication recovery budget. */
47
- fetch?: (request: Request, signal: AbortSignal) => Promise<Response>;
47
+ fetch?: (request: Request, signal: AbortSignal, observeSignal: (signal: AbortSignal) => void) => Promise<Response>;
48
48
  signal?: AbortSignal;
49
49
  eventTimeout?: number;
50
50
  eventTimeoutCheckInterval?: number;
@@ -52,23 +52,24 @@ export declare class FetchEventSource extends EventTarget implements ExtEventSou
52
52
  });
53
53
  connect(): void;
54
54
  private internalConnect;
55
- close(): void;
55
+ /** Stops the subscription, forwarding an optional failure to the request and body producer. */
56
+ close(reason?: unknown): void;
56
57
  private internalClose;
57
58
  private updateLastEventReceived;
58
59
  private startEventTimeoutCheck;
59
60
  private stopEventTimeoutCheck;
60
61
  private checkEventTimeout;
61
62
  private receivedHeaders;
62
- private receivedData;
63
63
  private receivedError;
64
64
  private receivedFatalError;
65
65
  private receivedComplete;
66
66
  private scheduleReconnect;
67
67
  private static calculateRetryTime;
68
68
  private clearReconnect;
69
+ private readonly receiveControls;
69
70
  private readonly dispatchParsedEvent;
70
- private static parseMilliseconds;
71
71
  fireErrorEvent(error: unknown): void;
72
+ private notify;
72
73
  private abortConnection;
73
74
  private startExternalAbortListener;
74
75
  private stopExternalAbortListener;