qca-sdk 0.1.0-dev.4 → 0.2.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.
Files changed (120) hide show
  1. package/README.md +81 -13
  2. package/dist/core/api-promise.d.ts +8 -4
  3. package/dist/core/api-promise.d.ts.map +1 -1
  4. package/dist/core/api-promise.js +3 -1
  5. package/dist/core/api-promise.js.map +1 -1
  6. package/dist/core/client.d.ts +6 -1
  7. package/dist/core/client.d.ts.map +1 -1
  8. package/dist/core/client.js +68 -16
  9. package/dist/core/client.js.map +1 -1
  10. package/dist/core/credentials.d.ts.map +1 -1
  11. package/dist/core/credentials.js +1 -1
  12. package/dist/core/credentials.js.map +1 -1
  13. package/dist/core/detect-platform.d.ts +2 -0
  14. package/dist/core/detect-platform.d.ts.map +1 -0
  15. package/dist/core/detect-platform.js +46 -0
  16. package/dist/core/detect-platform.js.map +1 -0
  17. package/dist/core/error.d.ts +18 -16
  18. package/dist/core/error.d.ts.map +1 -1
  19. package/dist/core/error.js +23 -10
  20. package/dist/core/error.js.map +1 -1
  21. package/dist/core/pagination.d.ts +1 -1
  22. package/dist/core/pagination.d.ts.map +1 -1
  23. package/dist/core/pagination.js +5 -2
  24. package/dist/core/pagination.js.map +1 -1
  25. package/dist/core/resumable-session-event-stream.d.ts +34 -0
  26. package/dist/core/resumable-session-event-stream.d.ts.map +1 -0
  27. package/dist/core/resumable-session-event-stream.js +199 -0
  28. package/dist/core/resumable-session-event-stream.js.map +1 -0
  29. package/dist/core/streaming.d.ts +3 -0
  30. package/dist/core/streaming.d.ts.map +1 -1
  31. package/dist/core/streaming.js +16 -12
  32. package/dist/core/streaming.js.map +1 -1
  33. package/dist/esm/core/api-promise.d.ts +8 -4
  34. package/dist/esm/core/api-promise.d.ts.map +1 -1
  35. package/dist/esm/core/api-promise.js +3 -1
  36. package/dist/esm/core/api-promise.js.map +1 -1
  37. package/dist/esm/core/client.d.ts +6 -1
  38. package/dist/esm/core/client.d.ts.map +1 -1
  39. package/dist/esm/core/client.js +68 -16
  40. package/dist/esm/core/client.js.map +1 -1
  41. package/dist/esm/core/credentials.d.ts.map +1 -1
  42. package/dist/esm/core/credentials.js +1 -1
  43. package/dist/esm/core/credentials.js.map +1 -1
  44. package/dist/esm/core/detect-platform.d.ts +2 -0
  45. package/dist/esm/core/detect-platform.d.ts.map +1 -0
  46. package/dist/esm/core/detect-platform.js +43 -0
  47. package/dist/esm/core/detect-platform.js.map +1 -0
  48. package/dist/esm/core/error.d.ts +18 -16
  49. package/dist/esm/core/error.d.ts.map +1 -1
  50. package/dist/esm/core/error.js +23 -10
  51. package/dist/esm/core/error.js.map +1 -1
  52. package/dist/esm/core/pagination.d.ts +1 -1
  53. package/dist/esm/core/pagination.d.ts.map +1 -1
  54. package/dist/esm/core/pagination.js +5 -2
  55. package/dist/esm/core/pagination.js.map +1 -1
  56. package/dist/esm/core/resumable-session-event-stream.d.ts +34 -0
  57. package/dist/esm/core/resumable-session-event-stream.d.ts.map +1 -0
  58. package/dist/esm/core/resumable-session-event-stream.js +191 -0
  59. package/dist/esm/core/resumable-session-event-stream.js.map +1 -0
  60. package/dist/esm/core/streaming.d.ts +3 -0
  61. package/dist/esm/core/streaming.d.ts.map +1 -1
  62. package/dist/esm/core/streaming.js +16 -12
  63. package/dist/esm/core/streaming.js.map +1 -1
  64. package/dist/esm/forward/index.d.ts +1 -0
  65. package/dist/esm/forward/index.d.ts.map +1 -1
  66. package/dist/esm/forward/index.js +1 -0
  67. package/dist/esm/forward/index.js.map +1 -1
  68. package/dist/esm/forward/schedule.js +1 -1
  69. package/dist/esm/forward/schedule.js.map +1 -1
  70. package/dist/esm/forward/session-event.d.ts +3 -0
  71. package/dist/esm/forward/session-event.d.ts.map +1 -1
  72. package/dist/esm/forward/session-event.js +6 -0
  73. package/dist/esm/forward/session-event.js.map +1 -1
  74. package/dist/esm/index.d.ts +2 -0
  75. package/dist/esm/index.d.ts.map +1 -1
  76. package/dist/esm/index.js +2 -0
  77. package/dist/esm/index.js.map +1 -1
  78. package/dist/esm/managed/index.d.ts +1 -0
  79. package/dist/esm/managed/index.d.ts.map +1 -1
  80. package/dist/esm/managed/index.js +1 -0
  81. package/dist/esm/managed/index.js.map +1 -1
  82. package/dist/esm/managed/resources/session-event.d.ts +3 -0
  83. package/dist/esm/managed/resources/session-event.d.ts.map +1 -1
  84. package/dist/esm/managed/resources/session-event.js +8 -1
  85. package/dist/esm/managed/resources/session-event.js.map +1 -1
  86. package/dist/esm/managed/types.d.ts +4 -0
  87. package/dist/esm/managed/types.d.ts.map +1 -1
  88. package/dist/esm/version.d.ts +2 -0
  89. package/dist/esm/version.d.ts.map +1 -0
  90. package/dist/esm/version.js +7 -0
  91. package/dist/esm/version.js.map +1 -0
  92. package/dist/forward/index.d.ts +1 -0
  93. package/dist/forward/index.d.ts.map +1 -1
  94. package/dist/forward/index.js +3 -1
  95. package/dist/forward/index.js.map +1 -1
  96. package/dist/forward/schedule.js +1 -1
  97. package/dist/forward/schedule.js.map +1 -1
  98. package/dist/forward/session-event.d.ts +3 -0
  99. package/dist/forward/session-event.d.ts.map +1 -1
  100. package/dist/forward/session-event.js +6 -0
  101. package/dist/forward/session-event.js.map +1 -1
  102. package/dist/index.d.ts +2 -0
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +5 -1
  105. package/dist/index.js.map +1 -1
  106. package/dist/managed/index.d.ts +1 -0
  107. package/dist/managed/index.d.ts.map +1 -1
  108. package/dist/managed/index.js +3 -1
  109. package/dist/managed/index.js.map +1 -1
  110. package/dist/managed/resources/session-event.d.ts +3 -0
  111. package/dist/managed/resources/session-event.d.ts.map +1 -1
  112. package/dist/managed/resources/session-event.js +8 -1
  113. package/dist/managed/resources/session-event.js.map +1 -1
  114. package/dist/managed/types.d.ts +4 -0
  115. package/dist/managed/types.d.ts.map +1 -1
  116. package/dist/version.d.ts +2 -0
  117. package/dist/version.d.ts.map +1 -0
  118. package/dist/version.js +10 -0
  119. package/dist/version.js.map +1 -0
  120. package/package.json +7 -2
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.platformHeaders = platformHeaders;
4
+ const version_js_1 = require("../version.js");
5
+ // The spellings match the Go SDK's convention/requestconfig.go on purpose: the
6
+ // server aggregates SDK usage across languages, so the same machine has to land in
7
+ // the same bucket no matter which SDK called. process.arch and Go's runtime.GOARCH
8
+ // name the same architecture differently, hence the aliases.
9
+ const OS_NAMES = {
10
+ darwin: 'MacOS',
11
+ win32: 'Windows',
12
+ windows: 'Windows',
13
+ linux: 'Linux',
14
+ ios: 'iOS',
15
+ android: 'Android',
16
+ freebsd: 'FreeBSD',
17
+ openbsd: 'OpenBSD',
18
+ };
19
+ const ARCH_NAMES = {
20
+ ia32: 'x32',
21
+ x32: 'x32',
22
+ x64: 'x64',
23
+ x86_64: 'x64',
24
+ arm: 'arm',
25
+ arm64: 'arm64',
26
+ aarch64: 'arm64',
27
+ };
28
+ // The package targets Node (see engines), and has no @types/node, so reach for
29
+ // process the same way credentials.ts does.
30
+ function nodeProcess() {
31
+ return globalThis.process ?? {};
32
+ }
33
+ function platformHeaders() {
34
+ const { platform, arch, version } = nodeProcess();
35
+ return {
36
+ 'X-Qoder-Lang': 'js',
37
+ 'X-Qoder-Package-Version': version_js_1.VERSION,
38
+ 'X-Qoder-OS': platform ? OS_NAMES[platform] ?? `Other:${platform}` : 'Unknown',
39
+ 'X-Qoder-Arch': arch ? ARCH_NAMES[arch] ?? `other:${arch}` : 'unknown',
40
+ // Only Node is supported today; report the runtime we actually detect rather
41
+ // than claiming node when process is missing.
42
+ 'X-Qoder-Runtime': version ? 'node' : 'unknown',
43
+ 'X-Qoder-Runtime-Version': version ? version.replace(/^v/, '') : 'unknown',
44
+ };
45
+ }
46
+ //# sourceMappingURL=detect-platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-platform.js","sourceRoot":"","sources":["../../src/core/detect-platform.ts"],"names":[],"mappings":";;AAiCA,0CAYC;AA7CD,8CAAwC;AAExC,+EAA+E;AAC/E,mFAAmF;AACnF,mFAAmF;AACnF,6DAA6D;AAC7D,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,OAAO;IACf,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF,MAAM,UAAU,GAA2B;IACzC,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;CACjB,CAAC;AAEF,+EAA+E;AAC/E,4CAA4C;AAC5C,SAAS,WAAW;IAClB,OAAQ,UAA8F,CAAC,OAAO,IAAI,EAAE,CAAC;AACvH,CAAC;AAED,SAAgB,eAAe;IAC7B,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;IAClD,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,yBAAyB,EAAE,oBAAO;QAClC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QAC9E,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;QACtE,6EAA6E;QAC7E,8CAA8C;QAC9C,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC/C,yBAAyB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KAC3E,CAAC;AACJ,CAAC"}
@@ -1,39 +1,41 @@
1
1
  export declare class QoderError extends Error {
2
2
  constructor(message: string, options?: ErrorOptions);
3
3
  }
4
- export declare class APIError extends QoderError {
5
- readonly status: number;
6
- readonly error: unknown;
7
- readonly headers: Headers;
4
+ export declare class APIError<TStatus extends number | undefined = number | undefined, THeaders extends Headers | undefined = Headers | undefined, TError = unknown> extends QoderError {
5
+ readonly status: TStatus;
6
+ readonly error: TError;
7
+ readonly headers: THeaders;
8
8
  readonly response?: Response | undefined;
9
9
  readonly request_id: string | null;
10
10
  readonly requestID: string | null;
11
11
  readonly code?: string;
12
12
  readonly type?: string;
13
13
  request?: Request;
14
- constructor(status: number, error: unknown, message?: string, headers?: Headers, response?: Response | undefined);
15
- static generate(status: number, error: unknown, message?: string, headers?: Headers, response?: Response): APIError;
14
+ constructor(status: TStatus, error: TError, message?: string, headers?: THeaders, response?: Response | undefined, options?: ErrorOptions);
15
+ static generate(status: number, error: unknown, message?: string, headers?: Headers, response?: Response): APIError<number, Headers>;
16
16
  }
17
- export declare class BadRequestError extends APIError {
17
+ export declare class BadRequestError extends APIError<400, Headers> {
18
18
  }
19
- export declare class AuthenticationError extends APIError {
19
+ export declare class AuthenticationError extends APIError<401, Headers> {
20
20
  }
21
- export declare class PermissionDeniedError extends APIError {
21
+ export declare class PermissionDeniedError extends APIError<403, Headers> {
22
22
  }
23
- export declare class NotFoundError extends APIError {
23
+ export declare class NotFoundError extends APIError<404, Headers> {
24
24
  }
25
- export declare class ConflictError extends APIError {
25
+ export declare class ConflictError extends APIError<409, Headers> {
26
26
  }
27
- export declare class UnprocessableEntityError extends APIError {
27
+ export declare class UnprocessableEntityError extends APIError<422, Headers> {
28
28
  }
29
- export declare class RateLimitError extends APIError {
29
+ export declare class RateLimitError extends APIError<429, Headers> {
30
30
  }
31
- export declare class InternalServerError extends APIError {
31
+ export declare class InternalServerError extends APIError<number, Headers> {
32
32
  }
33
- export declare class APIConnectionError extends QoderError {
33
+ export declare class APIConnectionError extends APIError<undefined, undefined, undefined> {
34
+ constructor(message: string, options?: ErrorOptions);
34
35
  }
35
36
  export declare class APIConnectionTimeoutError extends APIConnectionError {
36
37
  }
37
- export declare class APIUserAbortError extends QoderError {
38
+ export declare class APIUserAbortError extends APIError<undefined, undefined, undefined> {
39
+ constructor(message: string, options?: ErrorOptions);
38
40
  }
39
41
  //# sourceMappingURL=error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/core/error.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED,qBAAa,QAAS,SAAQ,UAAU;IAOpC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO;IAEvB,QAAQ,CAAC,OAAO;IAChB,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAV9B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEP,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,MAAM,EACP,OAAO,UAAgB,EACvB,QAAQ,CAAC,EAAE,QAAQ,YAAA;IAY9B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ;CAMpH;AACD,qBAAa,eAAgB,SAAQ,QAAQ;CAAG;AAChD,qBAAa,mBAAoB,SAAQ,QAAQ;CAAG;AACpD,qBAAa,qBAAsB,SAAQ,QAAQ;CAAG;AACtD,qBAAa,aAAc,SAAQ,QAAQ;CAAG;AAC9C,qBAAa,aAAc,SAAQ,QAAQ;CAAG;AAC9C,qBAAa,wBAAyB,SAAQ,QAAQ;CAAG;AACzD,qBAAa,cAAe,SAAQ,QAAQ;CAAG;AAC/C,qBAAa,mBAAoB,SAAQ,QAAQ;CAAG;AACpD,qBAAa,kBAAmB,SAAQ,UAAU;CAAG;AACrD,qBAAa,yBAA0B,SAAQ,kBAAkB;CAAG;AACpE,qBAAa,iBAAkB,SAAQ,UAAU;CAAG"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/core/error.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAIpD;AAED,qBAAa,QAAQ,CACnB,OAAO,SAAS,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,EACvD,QAAQ,SAAS,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,EAC1D,MAAM,GAAG,OAAO,CAChB,SAAQ,UAAU;IAOhB,QAAQ,CAAC,MAAM,EAAE,OAAO;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM;IAEtB,QAAQ,CAAC,OAAO,EAAE,QAAQ;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAV9B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEP,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE,MAAM,EACP,OAAO,GAAE,QAAyE,EAClF,QAAQ,CAAC,EAAE,QAAQ,YAAA,EAC5B,OAAO,CAAC,EAAE,YAAY;IAYxB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,UAAgB,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAa3I;AACD,qBAAa,eAAgB,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AAC9D,qBAAa,mBAAoB,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AAClE,qBAAa,qBAAsB,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AACpE,qBAAa,aAAc,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AAC5D,qBAAa,aAAc,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AAC5D,qBAAa,wBAAyB,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AACvE,qBAAa,cAAe,SAAQ,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CAAG;AAC7D,qBAAa,mBAAoB,SAAQ,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAAG;AACrE,qBAAa,kBAAmB,SAAQ,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;gBACnE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGpD;AACD,qBAAa,yBAA0B,SAAQ,kBAAkB;CAAG;AACpE,qBAAa,iBAAkB,SAAQ,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;gBAClE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGpD"}
@@ -18,25 +18,32 @@ class APIError extends QoderError {
18
18
  code;
19
19
  type;
20
20
  request;
21
- constructor(status, error, message, headers = new Headers(), response) {
21
+ constructor(status, error, message, headers = (status === undefined ? undefined : new Headers()), response, options) {
22
22
  const envelope = error && typeof error === 'object' ? error : {};
23
23
  const detail = envelope.error && typeof envelope.error === 'object'
24
24
  ? envelope.error : envelope;
25
- super(message ?? (typeof detail.message === 'string' ? detail.message : `HTTP ${status}${typeof error === 'string' && error ? `: ${error}` : ''}`));
25
+ super(message ?? (typeof detail.message === 'string' ? detail.message : `HTTP ${status}${typeof error === 'string' && error ? `: ${error}` : ''}`), options);
26
26
  this.status = status;
27
27
  this.error = error;
28
28
  this.headers = headers;
29
29
  this.response = response;
30
- this.request_id = typeof envelope.request_id === 'string' && envelope.request_id ? envelope.request_id : headers.get('x-request-id') ?? headers.get('request-id');
30
+ this.request_id = typeof envelope.request_id === 'string' && envelope.request_id ? envelope.request_id : headers?.get('x-request-id') ?? headers?.get('request-id') ?? null;
31
31
  this.requestID = this.request_id;
32
32
  this.code = typeof detail.code === 'string' ? detail.code : undefined;
33
33
  this.type = typeof detail.type === 'string' ? detail.type : undefined;
34
34
  }
35
- static generate(status, error, message, headers, response) {
36
- const Type = { 400: BadRequestError, 401: AuthenticationError, 403: PermissionDeniedError,
37
- 404: NotFoundError, 409: ConflictError, 422: UnprocessableEntityError, 429: RateLimitError }[status]
38
- ?? (status >= 500 ? InternalServerError : APIError);
39
- return new Type(status, error, message, headers, response);
35
+ static generate(status, error, message, headers = new Headers(), response) {
36
+ switch (status) {
37
+ case 400: return new BadRequestError(status, error, message, headers, response);
38
+ case 401: return new AuthenticationError(status, error, message, headers, response);
39
+ case 403: return new PermissionDeniedError(status, error, message, headers, response);
40
+ case 404: return new NotFoundError(status, error, message, headers, response);
41
+ case 409: return new ConflictError(status, error, message, headers, response);
42
+ case 422: return new UnprocessableEntityError(status, error, message, headers, response);
43
+ case 429: return new RateLimitError(status, error, message, headers, response);
44
+ default: return status >= 500 ? new InternalServerError(status, error, message, headers, response)
45
+ : new APIError(status, error, message, headers, response);
46
+ }
40
47
  }
41
48
  }
42
49
  exports.APIError = APIError;
@@ -64,13 +71,19 @@ exports.RateLimitError = RateLimitError;
64
71
  class InternalServerError extends APIError {
65
72
  }
66
73
  exports.InternalServerError = InternalServerError;
67
- class APIConnectionError extends QoderError {
74
+ class APIConnectionError extends APIError {
75
+ constructor(message, options) {
76
+ super(undefined, undefined, message, undefined, undefined, options);
77
+ }
68
78
  }
69
79
  exports.APIConnectionError = APIConnectionError;
70
80
  class APIConnectionTimeoutError extends APIConnectionError {
71
81
  }
72
82
  exports.APIConnectionTimeoutError = APIConnectionTimeoutError;
73
- class APIUserAbortError extends QoderError {
83
+ class APIUserAbortError extends APIError {
84
+ constructor(message, options) {
85
+ super(undefined, undefined, message, undefined, undefined, options);
86
+ }
74
87
  }
75
88
  exports.APIUserAbortError = APIUserAbortError;
76
89
  //# sourceMappingURL=error.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/core/error.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/core/error.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ export declare class Page<T> implements AsyncIterable<T> {
30
30
  toJSON(): PageResponse<T>;
31
31
  hasNextPage(): boolean;
32
32
  getPaginatedItems(): T[];
33
- getNextPage(): Promise<Page<T> | null>;
33
+ getNextPage(): Promise<Page<T>>;
34
34
  iterPages(): AsyncGenerator<Page<T>>;
35
35
  [Symbol.asyncIterator](): AsyncGenerator<T>;
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAC9D,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,IAAI,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAU5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAfvB,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACnB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;gBAGJ,MAAM,EAAE,SAAS,EACzB,QAAQ,EAAE,QAAQ,EACV,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,cAAc;IAcvC,OAAO,CAAC,SAAS;IAuBjB,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;IAEzB,WAAW,IAAI,OAAO;IACtB,iBAAiB,IAAI,CAAC,EAAE;IAElB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAKrC,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAcpC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CAGnD;AAED,qBAAa,WAAW,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAC1E,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;AAC9D,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qBAAa,IAAI,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAU5C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAfvB,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACnB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;gBAGJ,MAAM,EAAE,SAAS,EACzB,QAAQ,EAAE,QAAQ,EACV,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,cAAc;IAcvC,OAAO,CAAC,SAAS;IAuBjB,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC;IAEzB,WAAW,IAAI,OAAO;IACtB,iBAAiB,IAAI,CAAC,EAAE;IAElB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAQ9B,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAcpC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CAGnD;AAED,qBAAa,WAAW,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAC1E,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CACnD"}
@@ -71,12 +71,15 @@ class Page {
71
71
  getPaginatedItems() { return this.data; }
72
72
  async getNextPage() {
73
73
  const query = this.nextQuery();
74
- return query ? await this.client.getAPIList(this.path, query, this.options, this.mode) : null;
74
+ if (!query) {
75
+ throw new error_js_1.QoderError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.');
76
+ }
77
+ return await this.client.getAPIList(this.path, query, this.options, this.mode);
75
78
  }
76
79
  async *iterPages() {
77
80
  let page = this;
78
81
  const cursors = new Set();
79
- while (page) {
82
+ while (true) {
80
83
  yield page;
81
84
  const next = page.nextQuery();
82
85
  if (!next)
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/core/pagination.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type HeadersLike } from './client.js';
2
+ import type { Stream } from './streaming.js';
3
+ type StreamFactory<T> = (lastEventID: string | undefined, signal: AbortSignal) => Promise<Stream<T>>;
4
+ /** @internal Resolve the cursor with the same precedence as a direct stream request. */
5
+ export declare function initialLastEventID(value: string | null | undefined, defaultHeaders?: HeadersLike, headers?: HeadersLike): string | undefined;
6
+ /** @internal Replace only the cursor while retaining all other header overrides and deletions. */
7
+ export declare function resumableRequestHeaders(headers: HeadersLike | undefined, lastEventID: string | undefined): HeadersLike;
8
+ /** @internal Exported for deterministic retry-policy tests. */
9
+ export declare function isResumableStreamRetryable(error: unknown): boolean;
10
+ /** @internal Exported for deterministic backoff tests. */
11
+ export declare function resumableStreamRetryDelay(attempt: number, random?: () => number): number;
12
+ /**
13
+ * A stateful, single-consumer Session Events stream that reconnects after retryable
14
+ * failures and resumes from the last fully decoded SSE frame.
15
+ */
16
+ export declare class ResumableSessionEventStream<T> implements AsyncIterable<T> {
17
+ private readonly openStream;
18
+ readonly controller: AbortController;
19
+ lastEventID: string | undefined;
20
+ private activeStream?;
21
+ private activeIterator?;
22
+ private consumed;
23
+ private closed;
24
+ private abortCleanup?;
25
+ private readonly callerSignal?;
26
+ private readonly onCallerAbort;
27
+ private readonly onAbort;
28
+ constructor(openStream: StreamFactory<T>, initialLastEventID?: string | null, signal?: AbortSignal | null);
29
+ private releaseActiveStream;
30
+ close(): Promise<void>;
31
+ [Symbol.asyncIterator](): AsyncGenerator<T>;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=resumable-session-event-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumable-session-event-stream.d.ts","sourceRoot":"","sources":["../../src/core/resumable-session-event-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK7C,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAErG,wFAAwF;AACxF,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,cAAc,CAAC,EAAE,WAAW,EAC5B,OAAO,CAAC,EAAE,WAAW,GACpB,MAAM,GAAG,SAAS,CAGpB;AAED,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAYtH;AAED,+DAA+D;AAC/D,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAWlE;AAED,0DAA0D;AAC1D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAc,GAAG,MAAM,CAGvF;AA4BD;;;GAGG;AACH,qBAAa,2BAA2B,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAcnE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAb7B,QAAQ,CAAC,UAAU,kBAAyB;IAC5C,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAEhC,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,cAAc,CAAC,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAC,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;gBAGlB,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC,EAC7C,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,EAClC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI;YAWf,mBAAmB;IAS3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWrB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CAyDnD"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResumableSessionEventStream = void 0;
4
+ exports.initialLastEventID = initialLastEventID;
5
+ exports.resumableRequestHeaders = resumableRequestHeaders;
6
+ exports.isResumableStreamRetryable = isResumableStreamRetryable;
7
+ exports.resumableStreamRetryDelay = resumableStreamRetryDelay;
8
+ const client_js_1 = require("./client.js");
9
+ const error_js_1 = require("./error.js");
10
+ const INITIAL_RETRY_DELAY = 500;
11
+ const MAX_RETRY_DELAY = 10_000;
12
+ /** @internal Resolve the cursor with the same precedence as a direct stream request. */
13
+ function initialLastEventID(value, defaultHeaders, headers) {
14
+ const typedHeader = value == null ? undefined : { 'Last-Event-ID': value };
15
+ return (0, client_js_1.mergeHeaders)(defaultHeaders, typedHeader, headers).get('last-event-id') ?? undefined;
16
+ }
17
+ /** @internal Replace only the cursor while retaining all other header overrides and deletions. */
18
+ function resumableRequestHeaders(headers, lastEventID) {
19
+ const values = {};
20
+ if (headers instanceof Headers || Array.isArray(headers)) {
21
+ new Headers(headers).forEach((value, key) => { values[key] = value; });
22
+ }
23
+ else if (headers) {
24
+ Object.assign(values, headers);
25
+ }
26
+ for (const key of Object.keys(values)) {
27
+ if (key.toLowerCase() === 'last-event-id')
28
+ delete values[key];
29
+ }
30
+ values['Last-Event-ID'] = lastEventID ?? null;
31
+ return values;
32
+ }
33
+ /** @internal Exported for deterministic retry-policy tests. */
34
+ function isResumableStreamRetryable(error) {
35
+ if (error instanceof error_js_1.APIUserAbortError)
36
+ return false;
37
+ if (error instanceof error_js_1.APIConnectionError)
38
+ return true;
39
+ if (error instanceof error_js_1.APIError) {
40
+ if (error.status === 409)
41
+ return false;
42
+ if (error.headers?.get('x-should-retry') === 'false')
43
+ return false;
44
+ if (error.headers?.get('x-should-retry') === 'true')
45
+ return true;
46
+ return error.status === 408 || error.status === 429 || (error.status !== undefined && error.status >= 500);
47
+ }
48
+ // Response-body transport failures are surfaced by ReadableStream as their original error.
49
+ return !(error instanceof error_js_1.QoderError) && !(error instanceof SyntaxError);
50
+ }
51
+ /** @internal Exported for deterministic backoff tests. */
52
+ function resumableStreamRetryDelay(attempt, random = Math.random) {
53
+ const backoff = Math.min(INITIAL_RETRY_DELAY * 2 ** attempt, MAX_RETRY_DELAY);
54
+ return backoff * (0.5 + random() * 0.5);
55
+ }
56
+ function aborted(signal) {
57
+ return new error_js_1.APIUserAbortError('Request was aborted', { cause: signal.reason });
58
+ }
59
+ function isTerminalSessionEvent(value) {
60
+ if (!value || typeof value !== 'object')
61
+ return false;
62
+ const type = value.type;
63
+ return type === 'session.status_terminated' || type === 'session.deleted';
64
+ }
65
+ async function waitForRetry(ms, signal) {
66
+ if (signal.aborted)
67
+ throw aborted(signal);
68
+ let timer;
69
+ await new Promise((resolve, reject) => {
70
+ const onAbort = () => {
71
+ clearTimeout(timer);
72
+ reject(aborted(signal));
73
+ };
74
+ signal.addEventListener('abort', onAbort, { once: true });
75
+ timer = setTimeout(() => {
76
+ signal.removeEventListener('abort', onAbort);
77
+ resolve();
78
+ }, ms);
79
+ });
80
+ }
81
+ /**
82
+ * A stateful, single-consumer Session Events stream that reconnects after retryable
83
+ * failures and resumes from the last fully decoded SSE frame.
84
+ */
85
+ class ResumableSessionEventStream {
86
+ openStream;
87
+ controller = new AbortController();
88
+ lastEventID;
89
+ activeStream;
90
+ activeIterator;
91
+ consumed = false;
92
+ closed = false;
93
+ abortCleanup;
94
+ callerSignal;
95
+ onCallerAbort;
96
+ onAbort;
97
+ constructor(openStream, initialLastEventID, signal) {
98
+ this.openStream = openStream;
99
+ this.lastEventID = initialLastEventID ?? undefined;
100
+ this.callerSignal = signal ?? undefined;
101
+ this.onCallerAbort = () => this.controller.abort(this.callerSignal?.reason);
102
+ this.onAbort = () => { this.abortCleanup ??= this.releaseActiveStream(); };
103
+ this.controller.signal.addEventListener('abort', this.onAbort, { once: true });
104
+ if (this.callerSignal?.aborted)
105
+ this.onCallerAbort();
106
+ else
107
+ this.callerSignal?.addEventListener('abort', this.onCallerAbort, { once: true });
108
+ }
109
+ async releaseActiveStream() {
110
+ const iterator = this.activeIterator;
111
+ const stream = this.activeStream;
112
+ this.activeIterator = undefined;
113
+ this.activeStream = undefined;
114
+ await iterator?.return?.().catch(() => { });
115
+ await stream?.close();
116
+ }
117
+ async close() {
118
+ if (this.closed) {
119
+ await this.abortCleanup;
120
+ return;
121
+ }
122
+ this.closed = true;
123
+ this.callerSignal?.removeEventListener('abort', this.onCallerAbort);
124
+ this.controller.abort();
125
+ await (this.abortCleanup ?? this.releaseActiveStream());
126
+ }
127
+ async *[Symbol.asyncIterator]() {
128
+ if (this.consumed)
129
+ throw new error_js_1.QoderError('Cannot iterate over a consumed stream');
130
+ this.consumed = true;
131
+ let attempt = 0;
132
+ try {
133
+ while (!this.closed) {
134
+ let stream;
135
+ try {
136
+ stream = await this.openStream(this.lastEventID, this.controller.signal);
137
+ if (this.closed) {
138
+ await stream.close();
139
+ return;
140
+ }
141
+ this.activeStream = stream;
142
+ const iterator = stream[Symbol.asyncIterator]();
143
+ this.activeIterator = iterator;
144
+ for (;;) {
145
+ const result = await iterator.next();
146
+ if (stream.hasLastEventID)
147
+ this.lastEventID = stream.lastEventID;
148
+ if (result.done) {
149
+ if (stream.completed)
150
+ return;
151
+ break;
152
+ }
153
+ if (this.closed)
154
+ return;
155
+ attempt = 0;
156
+ const terminal = isTerminalSessionEvent(result.value);
157
+ yield result.value;
158
+ if (terminal)
159
+ return;
160
+ }
161
+ }
162
+ catch (error) {
163
+ if (stream?.hasLastEventID)
164
+ this.lastEventID = stream.lastEventID;
165
+ if (this.closed)
166
+ return;
167
+ if (this.controller.signal.aborted)
168
+ throw error instanceof error_js_1.APIUserAbortError ? error : aborted(this.controller.signal);
169
+ if (!isResumableStreamRetryable(error))
170
+ throw error;
171
+ }
172
+ finally {
173
+ const iterator = this.activeIterator;
174
+ if (this.activeStream === stream) {
175
+ this.activeIterator = undefined;
176
+ this.activeStream = undefined;
177
+ }
178
+ await iterator?.return?.().catch(() => { });
179
+ await stream?.close();
180
+ }
181
+ if (this.closed)
182
+ return;
183
+ try {
184
+ await waitForRetry(resumableStreamRetryDelay(attempt++), this.controller.signal);
185
+ }
186
+ catch (error) {
187
+ if (this.closed)
188
+ return;
189
+ throw error;
190
+ }
191
+ }
192
+ }
193
+ finally {
194
+ await this.close();
195
+ }
196
+ }
197
+ }
198
+ exports.ResumableSessionEventStream = ResumableSessionEventStream;
199
+ //# sourceMappingURL=resumable-session-event-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumable-session-event-stream.js","sourceRoot":"","sources":["../../src/core/resumable-session-event-stream.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ export interface ServerSentEvent {
2
2
  event: string;
3
3
  data: string;
4
4
  id: string;
5
+ hasID: boolean;
5
6
  retry?: number;
6
7
  }
7
8
  /** Incremental SSE decoding: IDs identify events, not individual delta frames. */
@@ -10,6 +11,8 @@ export declare class Stream<T> implements AsyncIterable<T> {
10
11
  readonly response: Response;
11
12
  readonly controller: AbortController;
12
13
  lastEventID: string;
14
+ hasLastEventID: boolean;
15
+ completed: boolean;
13
16
  private consumed;
14
17
  private closed;
15
18
  constructor(response: Response, controller?: AbortController);
@@ -1 +1 @@
1
- {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/core/streaming.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kFAAkF;AAClF,wBAAuB,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,eAAe,CAAC,CAmDlG;AAED,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAMpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IALvC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,WAAW,SAAM;IACjB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEF,QAAQ,EAAE,QAAQ,EAAE,UAAU,kBAAwB;IAI3E,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,kBAAwB,GAAG,MAAM,CAAC,CAAC,CAAC;IAItF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CAwBnD"}
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/core/streaming.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kFAAkF;AAClF,wBAAuB,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,eAAe,CAAC,CAkDlG;AAED,qBAAa,MAAM,CAAC,CAAC,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAQpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ;IAPvC,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,WAAW,SAAM;IACjB,cAAc,UAAS;IACvB,SAAS,UAAS;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEF,QAAQ,EAAE,QAAQ,EAAE,UAAU,kBAAwB;IAI3E,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,kBAAwB,GAAG,MAAM,CAAC,CAAC,CAAC;IAItF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOrB,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC;CA2BnD"}
@@ -9,6 +9,7 @@ async function* decodeSSE(body) {
9
9
  const decoder = new TextDecoder();
10
10
  let buffer = '';
11
11
  let lastID = '';
12
+ let hasID = false;
12
13
  let type = 'message';
13
14
  let data = [];
14
15
  let retry;
@@ -17,9 +18,10 @@ async function* decodeSSE(body) {
17
18
  if (new TextEncoder().encode(text).byteLength > 32 * 1024 * 1024)
18
19
  throw new error_js_1.QoderError('SSE line exceeds 32 MiB');
19
20
  if (!text) {
20
- const event = data.length ? { event: type, data: data.join('\n'), id: lastID, retry } : undefined;
21
+ const event = data.length || hasID ? { event: type, data: data.join('\n'), id: lastID, hasID, retry } : undefined;
21
22
  type = 'message';
22
23
  data = [];
24
+ hasID = false;
23
25
  retry = undefined;
24
26
  return event;
25
27
  }
@@ -34,8 +36,10 @@ async function* decodeSSE(body) {
34
36
  type = value;
35
37
  if (key === 'data')
36
38
  data.push(value);
37
- if (key === 'id' && !value.includes('\0'))
39
+ if (key === 'id' && !value.includes('\0')) {
38
40
  lastID = value;
41
+ hasID = true;
42
+ }
39
43
  if (key === 'retry' && /^\d+$/.test(value))
40
44
  retry = Number(value);
41
45
  };
@@ -62,14 +66,7 @@ async function* decodeSSE(body) {
62
66
  if (buffer.length > 32 * 1024 * 1024)
63
67
  throw new error_js_1.QoderError('SSE line exceeds 32 MiB');
64
68
  }
65
- if (buffer) {
66
- const event = line(buffer);
67
- if (event)
68
- yield event;
69
- }
70
- const event = line('');
71
- if (event)
72
- yield event;
69
+ // EOF does not complete a frame; retain the last cursor only after a blank-line dispatch.
73
70
  }
74
71
  finally {
75
72
  if (!done)
@@ -81,6 +78,8 @@ class Stream {
81
78
  response;
82
79
  controller;
83
80
  lastEventID = '';
81
+ hasLastEventID = false;
82
+ completed = false;
84
83
  consumed = false;
85
84
  closed = false;
86
85
  constructor(response, controller = new AbortController()) {
@@ -108,13 +107,18 @@ class Stream {
108
107
  throw new error_js_1.QoderError('Missing SSE response body');
109
108
  try {
110
109
  for await (const frame of decodeSSE(this.response.body)) {
111
- this.lastEventID = frame.id;
110
+ if (frame.hasID) {
111
+ this.lastEventID = frame.id;
112
+ this.hasLastEventID = true;
113
+ }
112
114
  if (this.closed)
113
115
  return;
114
116
  if (frame.event === 'ping' || !frame.data)
115
117
  continue;
116
- if (frame.data === '[DONE]')
118
+ if (frame.data === '[DONE]') {
119
+ this.completed = true;
117
120
  return;
121
+ }
118
122
  const data = JSON.parse(frame.data);
119
123
  if (frame.event === 'error') {
120
124
  throw error_js_1.APIError.generate(this.response.status, data, undefined, this.response.headers, this.response);