@learnorama/mozaik-sdk 0.1.0 → 0.5.0-staging.22.1

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 (242) hide show
  1. package/README.md +186 -5
  2. package/dist/api/account.d.ts +2 -2
  3. package/dist/api/account.js +1 -1
  4. package/dist/api/account.js.map +1 -1
  5. package/dist/api/admin-catalogue.d.ts +2 -2
  6. package/dist/api/admin-catalogue.js +1 -1
  7. package/dist/api/admin-catalogue.js.map +1 -1
  8. package/dist/api/admin-consumption.d.ts +7 -2
  9. package/dist/api/admin-consumption.js +6 -1
  10. package/dist/api/admin-consumption.js.map +1 -1
  11. package/dist/api/admin-licenses.d.ts +2 -2
  12. package/dist/api/admin-licenses.js +1 -1
  13. package/dist/api/admin-licenses.js.map +1 -1
  14. package/dist/api/admin-patrons.d.ts +3 -3
  15. package/dist/api/admin-patrons.js +2 -2
  16. package/dist/api/admin-patrons.js.map +1 -1
  17. package/dist/api/admin-reviews.d.ts +2 -2
  18. package/dist/api/admin-reviews.js +1 -1
  19. package/dist/api/admin-reviews.js.map +1 -1
  20. package/dist/api/admin-roles.d.ts +3 -3
  21. package/dist/api/admin-roles.js +2 -2
  22. package/dist/api/admin-roles.js.map +1 -1
  23. package/dist/api/admin-support.d.ts +2 -2
  24. package/dist/api/admin-support.js +1 -1
  25. package/dist/api/admin-support.js.map +1 -1
  26. package/dist/api/admin-tenants.d.ts +14 -2
  27. package/dist/api/admin-tenants.js +38 -2
  28. package/dist/api/admin-tenants.js.map +1 -1
  29. package/dist/api/admin-tutoring.d.ts +2 -2
  30. package/dist/api/admin-tutoring.js +1 -1
  31. package/dist/api/admin-tutoring.js.map +1 -1
  32. package/dist/api/auth.d.ts +2 -2
  33. package/dist/api/auth.js +1 -1
  34. package/dist/api/auth.js.map +1 -1
  35. package/dist/api/biblio-catalogue.d.ts +2 -2
  36. package/dist/api/biblio-catalogue.js +1 -1
  37. package/dist/api/biblio-catalogue.js.map +1 -1
  38. package/dist/api/biblio-home.d.ts +2 -2
  39. package/dist/api/biblio-home.js +1 -1
  40. package/dist/api/biblio-home.js.map +1 -1
  41. package/dist/api/biblio-library.d.ts +2 -2
  42. package/dist/api/biblio-library.js +1 -1
  43. package/dist/api/biblio-library.js.map +1 -1
  44. package/dist/api/biblio-nextory.d.ts +2 -2
  45. package/dist/api/biblio-nextory.js +1 -1
  46. package/dist/api/biblio-nextory.js.map +1 -1
  47. package/dist/api/biblio-press.d.ts +2 -2
  48. package/dist/api/biblio-press.js +1 -1
  49. package/dist/api/biblio-press.js.map +1 -1
  50. package/dist/api/biblio-search.d.ts +2 -2
  51. package/dist/api/biblio-search.js +1 -1
  52. package/dist/api/biblio-search.js.map +1 -1
  53. package/dist/api/biblio-telemetry.d.ts +2 -2
  54. package/dist/api/biblio-telemetry.js +1 -1
  55. package/dist/api/biblio-telemetry.js.map +1 -1
  56. package/dist/api/consumption.d.ts +2 -2
  57. package/dist/api/consumption.js +1 -1
  58. package/dist/api/consumption.js.map +1 -1
  59. package/dist/api/cvs-app.d.ts +2 -2
  60. package/dist/api/cvs-app.js +1 -1
  61. package/dist/api/cvs-app.js.map +1 -1
  62. package/dist/api/cvs-documents.d.ts +16 -4
  63. package/dist/api/cvs-documents.js +22 -5
  64. package/dist/api/cvs-documents.js.map +1 -1
  65. package/dist/api/cvs-favorites.d.ts +2 -2
  66. package/dist/api/cvs-favorites.js +1 -1
  67. package/dist/api/cvs-favorites.js.map +1 -1
  68. package/dist/api/cvs-ils.d.ts +167 -0
  69. package/dist/api/cvs-ils.js +362 -0
  70. package/dist/api/cvs-ils.js.map +1 -0
  71. package/dist/api/cvs-loans.d.ts +2 -2
  72. package/dist/api/cvs-loans.js +1 -1
  73. package/dist/api/cvs-loans.js.map +1 -1
  74. package/dist/api/cvs-payments.d.ts +49 -0
  75. package/dist/api/cvs-payments.js +84 -0
  76. package/dist/api/cvs-payments.js.map +1 -0
  77. package/dist/api/cvs-streaming.d.ts +2 -2
  78. package/dist/api/cvs-streaming.js +1 -1
  79. package/dist/api/cvs-streaming.js.map +1 -1
  80. package/dist/api/index.d.ts +5 -2
  81. package/dist/api/index.js +7 -4
  82. package/dist/api/partner-catalogue.d.ts +2 -2
  83. package/dist/api/partner-catalogue.js +1 -1
  84. package/dist/api/partner-catalogue.js.map +1 -1
  85. package/dist/api/partner-reader.d.ts +2 -2
  86. package/dist/api/partner-reader.js +1 -1
  87. package/dist/api/partner-reader.js.map +1 -1
  88. package/dist/api/profiles.d.ts +2 -2
  89. package/dist/api/profiles.js +1 -1
  90. package/dist/api/profiles.js.map +1 -1
  91. package/dist/api/search.d.ts +18 -0
  92. package/dist/api/search.js +37 -0
  93. package/dist/api/search.js.map +1 -0
  94. package/dist/api/tutoring-catalogue.d.ts +2 -2
  95. package/dist/api/tutoring-catalogue.js +1 -1
  96. package/dist/api/tutoring-catalogue.js.map +1 -1
  97. package/dist/api/tutoring-chat.d.ts +2 -2
  98. package/dist/api/tutoring-chat.js +1 -1
  99. package/dist/api/tutoring-chat.js.map +1 -1
  100. package/dist/api/tutoring-dispatch.d.ts +2 -2
  101. package/dist/api/tutoring-dispatch.js +1 -1
  102. package/dist/api/tutoring-dispatch.js.map +1 -1
  103. package/dist/api/tutoring-practitioner.d.ts +2 -2
  104. package/dist/api/tutoring-practitioner.js +1 -1
  105. package/dist/api/tutoring-practitioner.js.map +1 -1
  106. package/dist/api/tutoring-requests.d.ts +2 -2
  107. package/dist/api/tutoring-requests.js +1 -1
  108. package/dist/api/tutoring-requests.js.map +1 -1
  109. package/dist/auth.d.ts +10 -0
  110. package/dist/auth.js +451 -0
  111. package/dist/auth.js.map +1 -0
  112. package/dist/chat.d.ts +3 -0
  113. package/dist/chat.js +3 -0
  114. package/dist/{client-BDwBZYB0.d.ts → chunks/client.d.ts} +1 -1
  115. package/dist/{client-D3kMOcIr.js → chunks/client.js} +1 -1
  116. package/dist/chunks/client.js.map +1 -0
  117. package/dist/chunks/client2.d.ts +53 -0
  118. package/dist/chunks/connection.d.ts +28 -0
  119. package/dist/chunks/connection.js +141 -0
  120. package/dist/chunks/connection.js.map +1 -0
  121. package/dist/{index-wL_20vR8.d.ts → chunks/index.d.ts} +922 -128
  122. package/dist/index.d.ts +4 -4
  123. package/dist/index.js +4 -4
  124. package/dist/index.js.map +1 -1
  125. package/dist/models.d.ts +2 -2
  126. package/dist/models.js +44 -1
  127. package/dist/models.js.map +1 -1
  128. package/dist/react/account.d.ts +2 -2
  129. package/dist/react/account.js +2 -2
  130. package/dist/react/account.js.map +1 -1
  131. package/dist/react/admin-catalogue.d.ts +2 -2
  132. package/dist/react/admin-catalogue.js +2 -2
  133. package/dist/react/admin-catalogue.js.map +1 -1
  134. package/dist/react/admin-consumption.d.ts +7 -2
  135. package/dist/react/admin-consumption.js +7 -2
  136. package/dist/react/admin-consumption.js.map +1 -1
  137. package/dist/react/admin-licenses.d.ts +2 -2
  138. package/dist/react/admin-licenses.js +2 -2
  139. package/dist/react/admin-licenses.js.map +1 -1
  140. package/dist/react/admin-patrons.d.ts +3 -3
  141. package/dist/react/admin-patrons.js +3 -3
  142. package/dist/react/admin-patrons.js.map +1 -1
  143. package/dist/react/admin-reviews.d.ts +2 -2
  144. package/dist/react/admin-reviews.js +2 -2
  145. package/dist/react/admin-reviews.js.map +1 -1
  146. package/dist/react/admin-roles.d.ts +3 -3
  147. package/dist/react/admin-roles.js +3 -3
  148. package/dist/react/admin-roles.js.map +1 -1
  149. package/dist/react/admin-support.d.ts +2 -2
  150. package/dist/react/admin-support.js +2 -2
  151. package/dist/react/admin-support.js.map +1 -1
  152. package/dist/react/admin-tenants.d.ts +68 -2
  153. package/dist/react/admin-tenants.js +87 -3
  154. package/dist/react/admin-tenants.js.map +1 -1
  155. package/dist/react/admin-tutoring.d.ts +2 -2
  156. package/dist/react/admin-tutoring.js +2 -2
  157. package/dist/react/admin-tutoring.js.map +1 -1
  158. package/dist/react/auth.d.ts +2 -2
  159. package/dist/react/auth.js +2 -2
  160. package/dist/react/auth.js.map +1 -1
  161. package/dist/react/biblio-catalogue.d.ts +2 -2
  162. package/dist/react/biblio-catalogue.js +2 -2
  163. package/dist/react/biblio-catalogue.js.map +1 -1
  164. package/dist/react/biblio-home.d.ts +2 -2
  165. package/dist/react/biblio-home.js +2 -2
  166. package/dist/react/biblio-home.js.map +1 -1
  167. package/dist/react/biblio-library.d.ts +2 -2
  168. package/dist/react/biblio-library.js +2 -2
  169. package/dist/react/biblio-library.js.map +1 -1
  170. package/dist/react/biblio-nextory.d.ts +2 -2
  171. package/dist/react/biblio-nextory.js +2 -2
  172. package/dist/react/biblio-nextory.js.map +1 -1
  173. package/dist/react/biblio-press.d.ts +2 -2
  174. package/dist/react/biblio-press.js +2 -2
  175. package/dist/react/biblio-press.js.map +1 -1
  176. package/dist/react/biblio-search.d.ts +2 -2
  177. package/dist/react/biblio-search.js +2 -2
  178. package/dist/react/biblio-search.js.map +1 -1
  179. package/dist/react/biblio-telemetry.d.ts +2 -2
  180. package/dist/react/biblio-telemetry.js +2 -2
  181. package/dist/react/biblio-telemetry.js.map +1 -1
  182. package/dist/react/chat.d.ts +36 -0
  183. package/dist/react/chat.js +234 -0
  184. package/dist/react/chat.js.map +1 -0
  185. package/dist/react/consumption.d.ts +2 -2
  186. package/dist/react/consumption.js +2 -2
  187. package/dist/react/consumption.js.map +1 -1
  188. package/dist/react/cvs-app.d.ts +2 -2
  189. package/dist/react/cvs-app.js +2 -2
  190. package/dist/react/cvs-app.js.map +1 -1
  191. package/dist/react/cvs-documents.d.ts +17 -4
  192. package/dist/react/cvs-documents.js +25 -8
  193. package/dist/react/cvs-documents.js.map +1 -1
  194. package/dist/react/cvs-favorites.d.ts +2 -2
  195. package/dist/react/cvs-favorites.js +2 -2
  196. package/dist/react/cvs-favorites.js.map +1 -1
  197. package/dist/react/cvs-ils.d.ts +552 -0
  198. package/dist/react/cvs-ils.js +822 -0
  199. package/dist/react/cvs-ils.js.map +1 -0
  200. package/dist/react/cvs-loans.d.ts +2 -2
  201. package/dist/react/cvs-loans.js +2 -2
  202. package/dist/react/cvs-loans.js.map +1 -1
  203. package/dist/react/cvs-payments.d.ts +123 -0
  204. package/dist/react/cvs-payments.js +181 -0
  205. package/dist/react/cvs-payments.js.map +1 -0
  206. package/dist/react/cvs-streaming.d.ts +2 -2
  207. package/dist/react/cvs-streaming.js +2 -2
  208. package/dist/react/cvs-streaming.js.map +1 -1
  209. package/dist/react/index.d.ts +5 -2
  210. package/dist/react/index.js +5 -2
  211. package/dist/react/partner-catalogue.d.ts +2 -2
  212. package/dist/react/partner-catalogue.js +2 -2
  213. package/dist/react/partner-catalogue.js.map +1 -1
  214. package/dist/react/partner-reader.d.ts +2 -2
  215. package/dist/react/partner-reader.js +2 -2
  216. package/dist/react/partner-reader.js.map +1 -1
  217. package/dist/react/profiles.d.ts +2 -2
  218. package/dist/react/profiles.js +2 -2
  219. package/dist/react/profiles.js.map +1 -1
  220. package/dist/react/search.d.ts +47 -0
  221. package/dist/react/search.js +81 -0
  222. package/dist/react/search.js.map +1 -0
  223. package/dist/react/sso.d.ts +15 -0
  224. package/dist/react/sso.js +48 -0
  225. package/dist/react/sso.js.map +1 -0
  226. package/dist/react/tutoring-catalogue.d.ts +2 -2
  227. package/dist/react/tutoring-catalogue.js +2 -2
  228. package/dist/react/tutoring-catalogue.js.map +1 -1
  229. package/dist/react/tutoring-chat.d.ts +2 -2
  230. package/dist/react/tutoring-chat.js +2 -2
  231. package/dist/react/tutoring-chat.js.map +1 -1
  232. package/dist/react/tutoring-dispatch.d.ts +2 -2
  233. package/dist/react/tutoring-dispatch.js +2 -2
  234. package/dist/react/tutoring-dispatch.js.map +1 -1
  235. package/dist/react/tutoring-practitioner.d.ts +2 -2
  236. package/dist/react/tutoring-practitioner.js +2 -2
  237. package/dist/react/tutoring-practitioner.js.map +1 -1
  238. package/dist/react/tutoring-requests.d.ts +2 -2
  239. package/dist/react/tutoring-requests.js +2 -2
  240. package/dist/react/tutoring-requests.js.map +1 -1
  241. package/package.json +29 -1
  242. package/dist/client-D3kMOcIr.js.map +0 -1
@@ -0,0 +1,141 @@
1
+
2
+ import { t as ApiError } from "./client.js";
3
+ import { MessageKind } from "../models.js";
4
+ import { mintChatTicket } from "../api/tutoring-chat.js";
5
+ //#region src/chat/connection.ts
6
+ const positiveId = (value) => Number.isSafeInteger(value) && value > 0;
7
+ function parseMessage(value, requestId) {
8
+ if (!value || typeof value !== "object") throw new Error("Invalid chat message");
9
+ const frame = value;
10
+ if (!positiveId(frame.id) || frame.requestId !== requestId || !Object.values(MessageKind).includes(frame.kind) || frame.senderId != null && !positiveId(frame.senderId) || frame.body != null && typeof frame.body !== "string" || typeof frame.createdAt !== "string" || !Number.isFinite(Date.parse(frame.createdAt))) throw new Error("Invalid chat message");
11
+ return {
12
+ id: frame.id,
13
+ requestId,
14
+ kind: frame.kind,
15
+ senderId: frame.senderId,
16
+ body: frame.body,
17
+ createdAt: frame.createdAt
18
+ };
19
+ }
20
+ const terminal = (error) => error instanceof ApiError && [
21
+ 401,
22
+ 403,
23
+ 404
24
+ ].includes(error.status);
25
+ const asError = (error) => error instanceof Error ? error : /* @__PURE__ */ new Error("Chat connection failed");
26
+ /** Open an authenticated live feed. Use generated REST methods to send and read history. */
27
+ function connectTutoringChat(options) {
28
+ if (!positiveId(options.requestId)) throw new TypeError("requestId must be a positive safe integer");
29
+ const makeSocket = options.webSocketFactory ?? ((url) => new WebSocket(url));
30
+ const timeoutMs = options.connectTimeoutMs ?? 15e3;
31
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) throw new TypeError("connectTimeoutMs must be positive");
32
+ let stopped = false;
33
+ let attempt = 0;
34
+ let retryTimer;
35
+ let disposeAttempt;
36
+ async function connect() {
37
+ if (stopped) return;
38
+ const abort = new AbortController();
39
+ let socket;
40
+ let ready = false;
41
+ const buffered = [];
42
+ const timer = setTimeout(() => fail(/* @__PURE__ */ new Error("Chat connection timed out")), timeoutMs);
43
+ const active = () => !stopped && !abort.signal.aborted;
44
+ function dispose() {
45
+ clearTimeout(timer);
46
+ abort.abort();
47
+ if (socket) {
48
+ socket.removeEventListener("open", opened);
49
+ socket.removeEventListener("message", received);
50
+ socket.removeEventListener("close", closed);
51
+ socket.removeEventListener("error", errored);
52
+ if (socket.readyState < 2) socket.close();
53
+ }
54
+ buffered.length = 0;
55
+ }
56
+ function fail(error, permanent = false) {
57
+ if (!active()) return;
58
+ dispose();
59
+ options.onError?.(error);
60
+ if (permanent) {
61
+ stopped = true;
62
+ options.onStatusChange?.("error");
63
+ return;
64
+ }
65
+ options.onStatusChange?.("reconnecting");
66
+ const delay = options.retryDelay?.(attempt) ?? Math.min(3e4, 1e3 * 2 ** Math.min(attempt, 5)) * (.5 + Math.random() * .5);
67
+ attempt++;
68
+ retryTimer = setTimeout(() => {
69
+ connect();
70
+ }, Math.max(0, delay));
71
+ }
72
+ function opened() {
73
+ clearTimeout(timer);
74
+ options.onStatusChange?.("syncing");
75
+ (async () => {
76
+ try {
77
+ await options.onConnect?.(abort.signal);
78
+ if (!active()) return;
79
+ for (const message of buffered) options.onMessage(message);
80
+ buffered.length = 0;
81
+ ready = true;
82
+ attempt = 0;
83
+ options.onStatusChange?.("connected");
84
+ } catch (error) {
85
+ fail(asError(error), terminal(error));
86
+ }
87
+ })();
88
+ }
89
+ function received(event) {
90
+ if (!active()) return;
91
+ try {
92
+ if (typeof event.data !== "string") throw new Error("Expected a text chat frame");
93
+ const message = parseMessage(JSON.parse(event.data), options.requestId);
94
+ if (ready) options.onMessage(message);
95
+ else {
96
+ if (buffered.length >= 1e3) throw new Error("Chat recovery buffer exceeded");
97
+ buffered.push(message);
98
+ }
99
+ } catch (error) {
100
+ fail(asError(error));
101
+ }
102
+ }
103
+ function closed(event) {
104
+ fail(/* @__PURE__ */ new Error(`Chat connection closed (${event.code})`), event.code === 1008);
105
+ }
106
+ function errored() {
107
+ fail(/* @__PURE__ */ new Error("Chat connection failed"));
108
+ }
109
+ disposeAttempt = dispose;
110
+ options.onStatusChange?.(attempt === 0 ? "connecting" : "reconnecting");
111
+ try {
112
+ const { ticket } = await mintChatTicket(options.requestId, {
113
+ client: options.client,
114
+ signal: abort.signal
115
+ });
116
+ if (!active()) return;
117
+ const url = new URL(`/tutoring/requests/${options.requestId}/chat`, options.client.baseUrl);
118
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
119
+ url.searchParams.set("ticket", ticket);
120
+ socket = makeSocket(url.href);
121
+ socket.addEventListener("open", opened);
122
+ socket.addEventListener("message", received);
123
+ socket.addEventListener("close", closed);
124
+ socket.addEventListener("error", errored);
125
+ } catch (error) {
126
+ fail(asError(error), terminal(error));
127
+ }
128
+ }
129
+ connect();
130
+ return { close() {
131
+ if (stopped) return;
132
+ stopped = true;
133
+ clearTimeout(retryTimer);
134
+ disposeAttempt?.();
135
+ options.onStatusChange?.("closed");
136
+ } };
137
+ }
138
+ //#endregion
139
+ export { parseMessage as n, connectTutoringChat as t };
140
+
141
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","names":[],"sources":["../../src/chat/connection.ts"],"sourcesContent":["// Handwritten transport. Orval owns src/api, src/react and src/models only.\nimport { ApiError, type Client } from '../client';\nimport { mintChatTicket } from '../api/tutoring-chat/tutoring-chat';\nimport { MessageKind, type MessageRead } from '../models';\n\nexport type ChatStatus = 'connecting' | 'syncing' | 'connected' | 'reconnecting' | 'error' | 'closed';\n\nexport interface ChatConnectionOptions {\n client: Client;\n requestId: number;\n onMessage: (message: MessageRead) => void;\n /** Runs after subscription readiness, with live messages buffered until it resolves. */\n onConnect?: (signal: AbortSignal) => Promise<void>;\n onStatusChange?: (status: ChatStatus) => void;\n onError?: (error: Error) => void;\n /** Defaults to the browser's native WebSocket. Also useful for native clients/tests. */\n webSocketFactory?: (url: string) => WebSocket;\n /** Attempt starts at zero; the default is exponential backoff with jitter, capped at 30s. */\n retryDelay?: (attempt: number) => number;\n connectTimeoutMs?: number;\n}\n\nexport interface ChatConnection {\n /** Cancels ticket/history requests, reconnect timers and the socket. Safe to call twice. */\n close(): void;\n}\n\nconst positiveId = (value: unknown): value is number => Number.isSafeInteger(value) && (value as number) > 0;\n\nexport function parseMessage(value: unknown, requestId: number): MessageRead {\n if (!value || typeof value !== 'object') throw new Error('Invalid chat message');\n const frame = value as Record<string, unknown>;\n if (!positiveId(frame.id) || frame.requestId !== requestId ||\n !(Object.values(MessageKind) as unknown[]).includes(frame.kind) ||\n (frame.senderId != null && !positiveId(frame.senderId)) ||\n (frame.body != null && typeof frame.body !== 'string') ||\n typeof frame.createdAt !== 'string' || !Number.isFinite(Date.parse(frame.createdAt))) {\n throw new Error('Invalid chat message');\n }\n return {\n id: frame.id, requestId, kind: frame.kind as MessageRead['kind'],\n senderId: frame.senderId as number | null | undefined,\n body: frame.body as string | null | undefined, createdAt: frame.createdAt,\n };\n}\n\nconst terminal = (error: unknown) => error instanceof ApiError && [401, 403, 404].includes(error.status);\nconst asError = (error: unknown) => error instanceof Error ? error : new Error('Chat connection failed');\n\n/** Open an authenticated live feed. Use generated REST methods to send and read history. */\nexport function connectTutoringChat(options: ChatConnectionOptions): ChatConnection {\n if (!positiveId(options.requestId)) throw new TypeError('requestId must be a positive safe integer');\n const makeSocket = options.webSocketFactory ?? (url => new WebSocket(url));\n const timeoutMs = options.connectTimeoutMs ?? 15_000;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) throw new TypeError('connectTimeoutMs must be positive');\n let stopped = false;\n let attempt = 0;\n let retryTimer: ReturnType<typeof setTimeout> | undefined;\n let disposeAttempt: (() => void) | undefined;\n\n async function connect(): Promise<void> {\n if (stopped) return;\n const abort = new AbortController();\n let socket: WebSocket | undefined;\n let ready = false;\n const buffered: MessageRead[] = [];\n const timer = setTimeout(() => fail(new Error('Chat connection timed out')), timeoutMs);\n const active = () => !stopped && !abort.signal.aborted;\n\n function dispose() {\n clearTimeout(timer);\n abort.abort();\n if (socket) {\n socket.removeEventListener('open', opened);\n socket.removeEventListener('message', received);\n socket.removeEventListener('close', closed);\n socket.removeEventListener('error', errored);\n if (socket.readyState < 2) socket.close();\n }\n buffered.length = 0;\n }\n\n function fail(error: Error, permanent = false) {\n if (!active()) return;\n dispose();\n options.onError?.(error);\n if (permanent) {\n stopped = true;\n options.onStatusChange?.('error');\n return;\n }\n options.onStatusChange?.('reconnecting');\n const delay = options.retryDelay?.(attempt) ?? Math.min(30_000, 1_000 * 2 ** Math.min(attempt, 5)) * (0.5 + Math.random() * 0.5);\n attempt++;\n retryTimer = setTimeout(() => { void connect(); }, Math.max(0, delay));\n }\n\n function opened() {\n clearTimeout(timer);\n options.onStatusChange?.('syncing');\n void (async () => {\n try {\n await options.onConnect?.(abort.signal);\n if (!active()) return;\n for (const message of buffered) options.onMessage(message);\n buffered.length = 0;\n ready = true;\n attempt = 0;\n options.onStatusChange?.('connected');\n } catch (error) { fail(asError(error), terminal(error)); }\n })();\n }\n\n function received(event: MessageEvent) {\n if (!active()) return;\n try {\n if (typeof event.data !== 'string') throw new Error('Expected a text chat frame');\n const message = parseMessage(JSON.parse(event.data), options.requestId);\n if (ready) options.onMessage(message);\n else {\n if (buffered.length >= 1_000) throw new Error('Chat recovery buffer exceeded');\n buffered.push(message);\n }\n } catch (error) { fail(asError(error)); }\n }\n\n function closed(event: CloseEvent) {\n fail(new Error(`Chat connection closed (${event.code})`), event.code === 1008);\n }\n function errored() { fail(new Error('Chat connection failed')); }\n\n disposeAttempt = dispose;\n options.onStatusChange?.(attempt === 0 ? 'connecting' : 'reconnecting');\n try {\n const { ticket } = await mintChatTicket(options.requestId, { client: options.client, signal: abort.signal });\n if (!active()) return;\n const url = new URL(`/tutoring/requests/${options.requestId}/chat`, options.client.baseUrl);\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n url.searchParams.set('ticket', ticket);\n socket = makeSocket(url.href);\n socket.addEventListener('open', opened);\n socket.addEventListener('message', received);\n socket.addEventListener('close', closed);\n socket.addEventListener('error', errored);\n } catch (error) { fail(asError(error), terminal(error)); }\n }\n\n void connect();\n return {\n close() {\n if (stopped) return;\n stopped = true;\n clearTimeout(retryTimer);\n disposeAttempt?.();\n options.onStatusChange?.('closed');\n },\n };\n}\n"],"mappings":"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"}