@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.
- package/README.md +191 -30
- package/build/client-settings.d.ts +6 -7
- package/build/client-settings.js +58 -28
- package/build/client-settings.js.map +1 -1
- package/build/event-parser.d.ts +21 -8
- package/build/event-parser.js +93 -121
- package/build/event-parser.js.map +1 -1
- package/build/fetch-copy.d.ts +15 -0
- package/build/fetch-copy.js +70 -0
- package/build/fetch-copy.js.map +1 -0
- package/build/fetch-event-source.d.ts +6 -5
- package/build/fetch-event-source.js +168 -137
- package/build/fetch-event-source.js.map +1 -1
- package/build/fetch-oauth-token-provider.js +61 -19
- package/build/fetch-oauth-token-provider.js.map +1 -1
- package/build/fetch-transport.d.ts +14 -6
- package/build/fetch-transport.js +126 -168
- package/build/fetch-transport.js.map +1 -1
- package/build/fetch.js +5 -0
- package/build/fetch.js.map +1 -1
- package/build/index.d.ts +7 -2
- package/build/index.js +6 -2
- package/build/index.js.map +1 -1
- package/build/request-adapter.d.ts +8 -0
- package/build/{token-manager-factory.js → request-adapter.js} +1 -1
- package/build/request-adapter.js.map +1 -0
- package/build/request-adapters.d.ts +25 -8
- package/build/request-adapters.js +126 -14
- package/build/request-adapters.js.map +1 -1
- package/build/request-body.d.ts +24 -0
- package/build/request-body.js +104 -0
- package/build/request-body.js.map +1 -0
- package/build/request-cancellation-error.d.ts +13 -0
- package/build/request-cancellation-error.js +43 -0
- package/build/request-cancellation-error.js.map +1 -0
- package/build/request-execution.d.ts +18 -0
- package/build/request-execution.js +108 -0
- package/build/request-execution.js.map +1 -0
- package/build/request-security.d.ts +9 -3
- package/build/request-security.js +101 -36
- package/build/request-security.js.map +1 -1
- package/build/response-adapter.d.ts +10 -0
- package/build/response-adapter.js +15 -0
- package/build/response-adapter.js.map +1 -0
- package/build/response-adapters.d.ts +13 -0
- package/build/response-adapters.js +75 -0
- package/build/response-adapters.js.map +1 -0
- package/build/token-manager.d.ts +13 -4
- package/build/token-manager.js +110 -33
- package/build/token-manager.js.map +1 -1
- package/build/token-provider.d.ts +8 -1
- package/build/token-provider.js +71 -0
- package/build/token-provider.js.map +1 -1
- package/build/transport.d.ts +3 -3
- package/build/util/abort.d.ts +3 -0
- package/build/util/abort.js +42 -0
- package/build/util/abort.js.map +1 -0
- package/build/util/native-fetch.d.ts +2 -0
- package/build/util/native-fetch.js +39 -0
- package/build/util/native-fetch.js.map +1 -0
- package/build/util/owned-body.d.ts +12 -0
- package/build/util/owned-body.js +243 -0
- package/build/util/owned-body.js.map +1 -0
- package/package.json +9 -6
- package/build/token-manager-factory.d.ts +0 -9
- package/build/token-manager-factory.js.map +0 -1
package/build/event-parser.js
CHANGED
|
@@ -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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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 (
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
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":"AAAA,8BAA8B;AAC9B,EAAE;AACF,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,gDAAgD;AAChD,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;
|
|
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
|
-
|
|
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;
|