cantian-request 0.0.11 → 0.0.12

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/sse.js CHANGED
@@ -1,13 +1,40 @@
1
1
  import { createParser } from 'eventsource-parser';
2
2
  import { createThrowHttpErrorFetch } from './basic.js';
3
+ const SSE_IDLE_TIMEOUT_MS = 30000;
4
+ const SSE_HEADERS_TIMEOUT_MS = 30000;
3
5
  const basicSse = createThrowHttpErrorFetch();
6
+ const withHeadersTimeoutInit = (init, timeoutSignal) => {
7
+ return {
8
+ ...init,
9
+ signal: init?.signal ? AbortSignal.any([init.signal, timeoutSignal]) : timeoutSignal,
10
+ };
11
+ };
4
12
  export const sse = async function* (input, init) {
5
- const response = await basicSse(input, init);
13
+ const headersTimeoutController = new AbortController();
14
+ const headersTimeoutId = setTimeout(() => {
15
+ headersTimeoutController.abort(new Error(`SSE headers timeout (${SSE_HEADERS_TIMEOUT_MS}ms)`));
16
+ }, SSE_HEADERS_TIMEOUT_MS);
17
+ let response;
18
+ try {
19
+ response = await basicSse(input, withHeadersTimeoutInit(init, headersTimeoutController.signal));
20
+ }
21
+ finally {
22
+ clearTimeout(headersTimeoutId);
23
+ }
6
24
  if (!response.body) {
7
25
  console.error(`FETCH_ERROR_NO_BODY`);
8
26
  throw new Error('No body');
9
27
  }
10
28
  const reader = response.body.getReader();
29
+ let idleError;
30
+ let readStartedAt;
31
+ const idleCheckId = setInterval(() => {
32
+ if (!idleError && readStartedAt && Date.now() - readStartedAt >= SSE_IDLE_TIMEOUT_MS) {
33
+ const idleMs = Date.now() - readStartedAt;
34
+ idleError = new Error(`SSE idle timeout while waiting for data (${idleMs}ms >= ${SSE_IDLE_TIMEOUT_MS}ms)`);
35
+ void reader.cancel(idleError).catch(() => { });
36
+ }
37
+ }, 1000);
11
38
  const pending = [];
12
39
  let parserError;
13
40
  const decoder = new TextDecoder();
@@ -19,16 +46,26 @@ export const sse = async function* (input, init) {
19
46
  parserError = error;
20
47
  },
21
48
  });
22
- let error;
23
49
  try {
24
50
  while (true) {
25
51
  while (pending.length) {
26
52
  yield pending.shift();
27
53
  }
28
- let chunk;
29
- chunk = await reader.read();
54
+ readStartedAt = Date.now();
55
+ const chunk = await reader.read();
56
+ readStartedAt = undefined;
57
+ if (idleError) {
58
+ throw idleError;
59
+ }
30
60
  const { value, done } = chunk;
31
61
  if (done) {
62
+ const tail = decoder.decode();
63
+ if (tail) {
64
+ parser.feed(tail);
65
+ if (parserError) {
66
+ throw parserError;
67
+ }
68
+ }
32
69
  break;
33
70
  }
34
71
  parser.feed(decoder.decode(value, { stream: true }));
@@ -37,18 +74,16 @@ export const sse = async function* (input, init) {
37
74
  }
38
75
  }
39
76
  }
40
- catch (e) {
41
- error = e;
77
+ finally {
78
+ clearInterval(idleCheckId);
42
79
  try {
43
80
  await reader.cancel();
44
81
  }
45
82
  catch { }
46
- throw error;
47
- }
48
- finally {
49
- if (!error) {
83
+ try {
50
84
  reader.releaseLock();
51
85
  }
86
+ catch { }
52
87
  }
53
88
  };
54
89
  //# sourceMappingURL=sse.js.map
package/dist/sse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,QAAQ,GAAG,yBAAyB,EAAE,CAAC;AAC7C,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,EAAE,KAAwC,EAAE,IAAkB;IAC9F,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,IAAI,WAAgB,CAAC;IACrB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,OAAO,CAAC,KAAK;YACX,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,KAAK;YACX,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,KAAU,CAAC;IACf,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YAED,IAAI,KAAK,CAAC;YACV,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;YAC9B,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM;YACR,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,WAAW,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,GAAG,CAAC,CAAC;QACV,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cantian-request",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dist/index.js"