@hainiva/agent-sdk 0.0.0-stage → 0.3.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 (119) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/LICENSE +21 -0
  3. package/README.md +278 -2
  4. package/SECURITY.md +33 -0
  5. package/dist/cjs/agent.cjs +320 -0
  6. package/dist/cjs/agent.d.cts +239 -0
  7. package/dist/cjs/calls.cjs +277 -0
  8. package/dist/cjs/calls.d.cts +232 -0
  9. package/dist/cjs/contract.cjs +14 -0
  10. package/dist/cjs/contract.d.cts +225 -0
  11. package/dist/cjs/embed.cjs +253 -0
  12. package/dist/cjs/embed.d.cts +187 -0
  13. package/dist/cjs/emitter.cjs +50 -0
  14. package/dist/cjs/emitter.d.cts +22 -0
  15. package/dist/cjs/errors.cjs +28 -0
  16. package/dist/cjs/errors.d.cts +15 -0
  17. package/dist/cjs/events.cjs +97 -0
  18. package/dist/cjs/events.d.cts +97 -0
  19. package/dist/cjs/index.cjs +72 -0
  20. package/dist/cjs/index.d.cts +28 -0
  21. package/dist/cjs/livekit.cjs +56 -0
  22. package/dist/cjs/livekit.d.cts +35 -0
  23. package/dist/cjs/log.cjs +15 -0
  24. package/dist/cjs/log.d.cts +5 -0
  25. package/dist/cjs/react-native.cjs +32 -0
  26. package/dist/cjs/react-native.d.cts +39 -0
  27. package/dist/cjs/reactNativeDesk.cjs +107 -0
  28. package/dist/cjs/reactNativeDesk.d.cts +53 -0
  29. package/dist/cjs/redact.cjs +71 -0
  30. package/dist/cjs/redact.d.cts +21 -0
  31. package/dist/cjs/rest.cjs +286 -0
  32. package/dist/cjs/rest.d.cts +172 -0
  33. package/dist/cjs/session.cjs +159 -0
  34. package/dist/cjs/session.d.cts +101 -0
  35. package/dist/cjs/singleFlight.cjs +49 -0
  36. package/dist/cjs/singleFlight.d.cts +32 -0
  37. package/dist/cjs/url.cjs +39 -0
  38. package/dist/cjs/url.d.cts +13 -0
  39. package/dist/cjs/web.cjs +28 -0
  40. package/dist/cjs/web.d.cts +23 -0
  41. package/dist/cjs/ws.cjs +246 -0
  42. package/dist/cjs/ws.d.cts +134 -0
  43. package/dist/esm/agent.d.ts +240 -0
  44. package/dist/esm/agent.d.ts.map +1 -0
  45. package/dist/esm/agent.js +317 -0
  46. package/dist/esm/agent.js.map +1 -0
  47. package/dist/esm/calls.d.ts +233 -0
  48. package/dist/esm/calls.d.ts.map +1 -0
  49. package/dist/esm/calls.js +271 -0
  50. package/dist/esm/calls.js.map +1 -0
  51. package/dist/esm/contract.d.ts +226 -0
  52. package/dist/esm/contract.d.ts.map +1 -0
  53. package/dist/esm/contract.js +12 -0
  54. package/dist/esm/contract.js.map +1 -0
  55. package/dist/esm/embed.d.ts +188 -0
  56. package/dist/esm/embed.d.ts.map +1 -0
  57. package/dist/esm/embed.js +247 -0
  58. package/dist/esm/embed.js.map +1 -0
  59. package/dist/esm/emitter.d.ts +23 -0
  60. package/dist/esm/emitter.d.ts.map +1 -0
  61. package/dist/esm/emitter.js +47 -0
  62. package/dist/esm/emitter.js.map +1 -0
  63. package/dist/esm/errors.d.ts +16 -0
  64. package/dist/esm/errors.d.ts.map +1 -0
  65. package/dist/esm/errors.js +25 -0
  66. package/dist/esm/errors.js.map +1 -0
  67. package/dist/esm/events.d.ts +98 -0
  68. package/dist/esm/events.d.ts.map +1 -0
  69. package/dist/esm/events.js +90 -0
  70. package/dist/esm/events.js.map +1 -0
  71. package/dist/esm/index.d.ts +29 -0
  72. package/dist/esm/index.d.ts.map +1 -0
  73. package/dist/esm/index.js +29 -0
  74. package/dist/esm/index.js.map +1 -0
  75. package/dist/esm/livekit.d.ts +36 -0
  76. package/dist/esm/livekit.d.ts.map +1 -0
  77. package/dist/esm/livekit.js +54 -0
  78. package/dist/esm/livekit.js.map +1 -0
  79. package/dist/esm/log.d.ts +6 -0
  80. package/dist/esm/log.d.ts.map +1 -0
  81. package/dist/esm/log.js +13 -0
  82. package/dist/esm/log.js.map +1 -0
  83. package/dist/esm/react-native.d.ts +40 -0
  84. package/dist/esm/react-native.d.ts.map +1 -0
  85. package/dist/esm/react-native.js +26 -0
  86. package/dist/esm/react-native.js.map +1 -0
  87. package/dist/esm/reactNativeDesk.d.ts +54 -0
  88. package/dist/esm/reactNativeDesk.d.ts.map +1 -0
  89. package/dist/esm/reactNativeDesk.js +103 -0
  90. package/dist/esm/reactNativeDesk.js.map +1 -0
  91. package/dist/esm/redact.d.ts +22 -0
  92. package/dist/esm/redact.d.ts.map +1 -0
  93. package/dist/esm/redact.js +66 -0
  94. package/dist/esm/redact.js.map +1 -0
  95. package/dist/esm/rest.d.ts +173 -0
  96. package/dist/esm/rest.d.ts.map +1 -0
  97. package/dist/esm/rest.js +281 -0
  98. package/dist/esm/rest.js.map +1 -0
  99. package/dist/esm/session.d.ts +102 -0
  100. package/dist/esm/session.d.ts.map +1 -0
  101. package/dist/esm/session.js +155 -0
  102. package/dist/esm/session.js.map +1 -0
  103. package/dist/esm/singleFlight.d.ts +33 -0
  104. package/dist/esm/singleFlight.d.ts.map +1 -0
  105. package/dist/esm/singleFlight.js +46 -0
  106. package/dist/esm/singleFlight.js.map +1 -0
  107. package/dist/esm/url.d.ts +14 -0
  108. package/dist/esm/url.d.ts.map +1 -0
  109. package/dist/esm/url.js +37 -0
  110. package/dist/esm/url.js.map +1 -0
  111. package/dist/esm/web.d.ts +24 -0
  112. package/dist/esm/web.d.ts.map +1 -0
  113. package/dist/esm/web.js +23 -0
  114. package/dist/esm/web.js.map +1 -0
  115. package/dist/esm/ws.d.ts +135 -0
  116. package/dist/esm/ws.d.ts.map +1 -0
  117. package/dist/esm/ws.js +242 -0
  118. package/dist/esm/ws.js.map +1 -0
  119. package/package.json +117 -4
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Calls `fn` at most once at a time: callers that arrive while it runs share its
3
+ * result (or its error). The next call after it settles runs `fn` again.
4
+ */
5
+ export function singleFlight(fn) {
6
+ let inFlight = null;
7
+ return () => {
8
+ inFlight ?? (inFlight = (async () => {
9
+ try {
10
+ return await fn();
11
+ }
12
+ finally {
13
+ inFlight = null;
14
+ }
15
+ })());
16
+ return inFlight;
17
+ };
18
+ }
19
+ /**
20
+ * Single-flight token refresh with a pluggable refresh function. Ten requests that
21
+ * find the token expired cause one refresh, not ten — which also keeps a
22
+ * rotating refresh token from being spent twice (reuse detection would then
23
+ * revoke the whole session family).
24
+ */
25
+ export function createTokenRefresher(o) {
26
+ const skew = o.skewMs ?? 60000;
27
+ const now = o.now ?? Date.now;
28
+ let current = null;
29
+ const run = singleFlight(async () => {
30
+ const t = await o.refresh();
31
+ if (!t || typeof t.token !== "string" || !t.token)
32
+ throw new Error("refresh returned no token");
33
+ current = t;
34
+ return t.token;
35
+ });
36
+ return {
37
+ get valid() { return current !== null && current.expiresAt - now() > skew; },
38
+ async get() {
39
+ if (current && current.expiresAt - now() > skew)
40
+ return current.token;
41
+ return run();
42
+ },
43
+ invalidate() { current = null; },
44
+ };
45
+ }
46
+ //# sourceMappingURL=singleFlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleFlight.js","sourceRoot":"","sources":["../../src/singleFlight.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAI,EAAoB;IAClD,IAAI,QAAQ,GAAsB,IAAI,CAAC;IACvC,OAAO,GAAG,EAAE;QACV,QAAQ,KAAR,QAAQ,GAAK,CAAC,KAAK,IAAI,EAAE;YACvB,IAAI,CAAC;gBAAC,OAAO,MAAM,EAAE,EAAE,CAAC;YAAC,CAAC;oBAClB,CAAC;gBAAC,QAAQ,GAAG,IAAI,CAAC;YAAC,CAAC;QAC9B,CAAC,CAAC,EAAE,EAAC;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAyBD;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAwB;IAC3D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,KAAM,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IAC9B,IAAI,OAAO,GAA0B,IAAI,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QAClC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAChG,OAAO,GAAG,CAAC,CAAC;QACZ,OAAO,CAAC,CAAC,KAAK,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO;QACL,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QAC5E,KAAK,CAAC,GAAG;YACP,IAAI,OAAO,IAAI,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,IAAI;gBAAE,OAAO,OAAO,CAAC,KAAK,CAAC;YACtE,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QACD,UAAU,KAAK,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface UrlRules {
2
+ /** "http" for REST (https required), "ws" for sockets (wss required). */
3
+ kind: "http" | "ws";
4
+ /** Allow http:// / ws:// to localhost (local development only). Default false. */
5
+ allowInsecureLocalhost?: boolean;
6
+ }
7
+ /**
8
+ * A base / socket / media URL a partner configured, checked before use: TLS only,
9
+ * no user:password@, and no credential in the query string. Tokens travel in
10
+ * headers or in the socket's first frame — never in a URL, which ends up in
11
+ * access logs, proxies and browser history.
12
+ */
13
+ export declare function assertSafeUrl(raw: string, rules: UrlRules): URL;
14
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/url.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,kFAAkF;IAClF,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAMD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,GAAG,CAiB/D"}
@@ -0,0 +1,37 @@
1
+ import { HainivaAgentError } from "./errors.js";
2
+ const LOCAL = new Set(["localhost", "127.0.0.1", "[::1]", "::1"]);
3
+ /** Query parameter names that would carry a credential. */
4
+ const CREDENTIAL_PARAM = /token|assertion|secret|password|passw|key|auth|jwt|session|signature|ticket/i;
5
+ /**
6
+ * A base / socket / media URL a partner configured, checked before use: TLS only,
7
+ * no user:password@, and no credential in the query string. Tokens travel in
8
+ * headers or in the socket's first frame — never in a URL, which ends up in
9
+ * access logs, proxies and browser history.
10
+ */
11
+ export function assertSafeUrl(raw, rules) {
12
+ let u;
13
+ try {
14
+ u = new URL(raw);
15
+ }
16
+ catch {
17
+ throw new HainivaAgentError(0, "invalid_url", { kind: rules.kind });
18
+ }
19
+ const secure = rules.kind === "http" ? "https:" : "wss:";
20
+ const insecure = rules.kind === "http" ? "http:" : "ws:";
21
+ const local = LOCAL.has(u.hostname);
22
+ if (u.protocol !== secure && !(u.protocol === insecure && local && rules.allowInsecureLocalhost)) {
23
+ throw new HainivaAgentError(0, "insecure_url", { expected: secure, got: u.protocol, host: u.host });
24
+ }
25
+ if (u.username || u.password)
26
+ throw new HainivaAgentError(0, "credentials_in_url", { host: u.host });
27
+ let param = null;
28
+ u.searchParams.forEach((_v, name) => { if (!param && CREDENTIAL_PARAM.test(name))
29
+ param = name; });
30
+ if (param)
31
+ throw new HainivaAgentError(0, "credentials_in_url", { host: u.host, param });
32
+ if (/eyJ[A-Za-z0-9_-]{4,}\.[A-Za-z0-9_-]{4,}/.test(u.search + u.hash + u.pathname)) {
33
+ throw new HainivaAgentError(0, "credentials_in_url", { host: u.host });
34
+ }
35
+ return u;
36
+ }
37
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAShD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;AAClE,2DAA2D;AAC3D,MAAM,gBAAgB,GAAG,8EAA8E,CAAC;AAExG;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,KAAe;IACxD,IAAI,CAAM,CAAC;IACX,IAAI,CAAC;QAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IACxG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IACzD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;QAAE,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrG,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,KAAK;QAAE,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,iBAAiB,CAAC,CAAC,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @hainiva/agent-sdk/web — browser adapters: an opt-in localStorage session store
3
+ * and LiveKit call media (peer dependency `livekit-client`).
4
+ */
5
+ import type { SessionStore } from "./session.js";
6
+ export { memoryStore } from "./session.js";
7
+ export { joinCallRoom, type JoinOptions, type MediaCall, type MediaJoin } from "./livekit.js";
8
+ export interface LocalStorageStoreOptions {
9
+ /** Default "hainiva.agent.session". */
10
+ key?: string;
11
+ /** Default globalThis.localStorage. */
12
+ storage?: Pick<Storage, "getItem" | "setItem" | "removeItem">;
13
+ }
14
+ /**
15
+ * OPT-IN: keep the session in localStorage so a reload stays signed in.
16
+ *
17
+ * ⚠ Any script running on your origin (an XSS, a compromised third-party script)
18
+ * can read localStorage — including the 30-day refresh token. Use it only with a
19
+ * strict Content-Security-Policy and no third-party scripts on the page. The
20
+ * default (memoryStore) keeps nothing: a reload signs in again with a fresh
21
+ * assertion from your backend, which is the safer choice.
22
+ */
23
+ export declare function localStorageStore(o?: LocalStorageStoreOptions): SessionStore;
24
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9F,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;CAC/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAE,wBAA6B,GAAG,YAAY,CAShF"}
@@ -0,0 +1,23 @@
1
+ export { memoryStore } from "./session.js";
2
+ export { joinCallRoom } from "./livekit.js";
3
+ /**
4
+ * OPT-IN: keep the session in localStorage so a reload stays signed in.
5
+ *
6
+ * ⚠ Any script running on your origin (an XSS, a compromised third-party script)
7
+ * can read localStorage — including the 30-day refresh token. Use it only with a
8
+ * strict Content-Security-Policy and no third-party scripts on the page. The
9
+ * default (memoryStore) keeps nothing: a reload signs in again with a fresh
10
+ * assertion from your backend, which is the safer choice.
11
+ */
12
+ export function localStorageStore(o = {}) {
13
+ const key = o.key ?? "hainiva.agent.session";
14
+ const storage = o.storage ?? globalThis.localStorage;
15
+ if (!storage)
16
+ throw new Error("localStorage is not available here; use memoryStore()");
17
+ return {
18
+ get: () => storage.getItem(key),
19
+ set: (v) => storage.setItem(key, v),
20
+ remove: () => storage.removeItem(key),
21
+ };
22
+ }
23
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAoD,MAAM,cAAc,CAAC;AAS9F;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA8B,EAAE;IAChE,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,uBAAuB,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAK,UAAyC,CAAC,YAAY,CAAC;IACrF,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACvF,OAAO;QACL,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/B,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { TypedEmitter } from "./emitter.js";
2
+ import { HainivaAgentError } from "./errors.js";
3
+ import { type Logger } from "./log.js";
4
+ import { Redactor } from "./redact.js";
5
+ export type ConnectionState = "idle" | "connecting" | "open" | "reconnecting" | "closed";
6
+ /** Exponential backoff with full jitter: between half and all of min(max, initial·2^attempt). */
7
+ export declare function backoffDelay(attempt: number, initial?: number, max?: number, rnd?: () => number): number;
8
+ /** The part of the WebSocket API this client uses (browser, React Native, `ws` in Node). */
9
+ export interface WebSocketLike {
10
+ readonly readyState: number;
11
+ send(data: string): void;
12
+ close(code?: number, reason?: string): void;
13
+ onopen: ((ev: unknown) => void) | null;
14
+ onmessage: ((ev: {
15
+ data: unknown;
16
+ }) => void) | null;
17
+ onclose: ((ev: {
18
+ code: number;
19
+ reason?: string;
20
+ }) => void) | null;
21
+ onerror: ((ev: unknown) => void) | null;
22
+ }
23
+ export type WebSocketCtor = new (url: string) => WebSocketLike;
24
+ type AnyFrame = Record<string, unknown>;
25
+ export interface SocketOptions<In = AnyFrame, Out = AnyFrame> {
26
+ /** wss:// URL, or a function returning it. Never carries a credential (checked). */
27
+ url: string | (() => string | Promise<string>);
28
+ /** A valid access token (e.g. `session.accessToken()`); sent in the first frame. */
29
+ getToken: () => Promise<string>;
30
+ /** The server refused the token (close code `tokenExpired`): e.g. `session.invalidate()`. */
31
+ onTokenRejected?: () => void;
32
+ WebSocket?: WebSocketCtor;
33
+ /** First frame after open. Default `{ type: "auth", token }`. */
34
+ authFrame?: (token: string) => Out;
35
+ /** Whether a frame is the server's "authenticated" answer. Default `type === "ready"`. */
36
+ isReady?: (frame: In) => boolean;
37
+ /** Give up on an open socket that is not ready after this long. Default 10 s. */
38
+ authTimeoutMs?: number;
39
+ /** Keep-alive. `false` turns it off. */
40
+ heartbeat?: false | {
41
+ /** Send `frame()` this often. Default 20 s. */
42
+ intervalMs?: number;
43
+ /** Reconnect when nothing at all was received for this long. Default 45 s. */
44
+ timeoutMs?: number;
45
+ /** Default `{ type: "ping" }`. */
46
+ frame?: () => Out;
47
+ };
48
+ /** Resume hook: the frame to send after `ready` when frames were seen before. */
49
+ resume?: (lastSeq: number) => Out | null;
50
+ /** A frame's sequence number, if it has one. Default: numeric `seq`. */
51
+ seqOf?: (frame: In) => number | undefined;
52
+ /** Frame to hand the server a refreshed access token on an open socket. */
53
+ tokenFrame?: (token: string) => Out;
54
+ encode?: (frame: Out) => string;
55
+ decode?: (raw: string) => In;
56
+ backoff?: {
57
+ initialMs?: number;
58
+ maxMs?: number;
59
+ random?: () => number;
60
+ };
61
+ /**
62
+ * Server close codes. Defaults: tokenExpired 4001 (refresh and reconnect),
63
+ * revoked 4003 (stop). `fatal`: codes reconnecting cannot fix (stop, emit
64
+ * `error` with code `socket_closed_<code>`). Default none.
65
+ */
66
+ closeCodes?: {
67
+ tokenExpired?: number;
68
+ revoked?: number;
69
+ fatal?: number[];
70
+ };
71
+ /** Allow ws://localhost in development. Default false. */
72
+ allowInsecureLocalhost?: boolean;
73
+ log?: Logger;
74
+ redactor?: Redactor;
75
+ }
76
+ export interface SocketEvents<In> {
77
+ state: ConnectionState;
78
+ /** Authenticated (after every (re)connect). */
79
+ ready: In;
80
+ /** Every frame after `ready`, except ones already seen (seq ≤ lastSeq). */
81
+ frame: In;
82
+ /** The server revoked the session: the socket stays closed until connect() is called again. */
83
+ revoked: {
84
+ code: number;
85
+ };
86
+ error: HainivaAgentError;
87
+ }
88
+ /**
89
+ * A WebSocket that stays connected: exponential backoff with jitter, auth in the
90
+ * first frame (the token is never in the URL), heartbeat with a dead-connection
91
+ * timeout, and a resume hook carrying the last sequence number seen. Frame shapes
92
+ * are the caller's: pass `authFrame`, `isReady`, `resume`, `seqOf` for the
93
+ * protocol (`/agent/v1/ws` bindings: TODO(S3b)).
94
+ */
95
+ export declare class ReconnectingSocket<In = AnyFrame, Out = AnyFrame> {
96
+ private readonly o;
97
+ readonly events: TypedEmitter<SocketEvents<In>>;
98
+ private ws;
99
+ private st;
100
+ private want;
101
+ private authed;
102
+ private attempt;
103
+ private seq;
104
+ private lastFrameAt;
105
+ private reconnectTimer;
106
+ private authTimer;
107
+ private pingTimer;
108
+ private readonly WS;
109
+ private readonly redactor;
110
+ private readonly log;
111
+ private readonly expiredCode;
112
+ private readonly revokedCode;
113
+ constructor(o: SocketOptions<In, Out>);
114
+ get state(): ConnectionState;
115
+ /** The highest sequence number received (what `resume` is called with). */
116
+ get lastSeq(): number;
117
+ /** Restore a sequence number kept from an earlier run. */
118
+ setLastSeq(n: number): void;
119
+ connect(): void;
120
+ disconnect(): void;
121
+ /** Send a frame on an authenticated socket. False when not open (nothing is queued). */
122
+ send(frame: Out): boolean;
123
+ /** Hand a refreshed access token to the open socket (needs `tokenFrame`). */
124
+ updateToken(token: string): boolean;
125
+ private encode;
126
+ private setState;
127
+ private fail;
128
+ private open;
129
+ private onFrame;
130
+ private startHeartbeat;
131
+ private scheduleReconnect;
132
+ private clearTimers;
133
+ }
134
+ export {};
135
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/ws.ts"],"names":[],"mappings":"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"}
package/dist/esm/ws.js ADDED
@@ -0,0 +1,242 @@
1
+ import { TypedEmitter } from "./emitter.js";
2
+ import { HainivaAgentError } from "./errors.js";
3
+ import { safeLogger } from "./log.js";
4
+ import { Redactor } from "./redact.js";
5
+ import { assertSafeUrl } from "./url.js";
6
+ /** Exponential backoff with full jitter: between half and all of min(max, initial·2^attempt). */
7
+ export function backoffDelay(attempt, initial = 1000, max = 30000, rnd = Math.random) {
8
+ const cap = Math.min(max, initial * 2 ** Math.max(0, attempt));
9
+ return Math.round(cap / 2 + rnd() * (cap / 2));
10
+ }
11
+ const OPEN = 1;
12
+ /**
13
+ * A WebSocket that stays connected: exponential backoff with jitter, auth in the
14
+ * first frame (the token is never in the URL), heartbeat with a dead-connection
15
+ * timeout, and a resume hook carrying the last sequence number seen. Frame shapes
16
+ * are the caller's: pass `authFrame`, `isReady`, `resume`, `seqOf` for the
17
+ * protocol (`/agent/v1/ws` bindings: TODO(S3b)).
18
+ */
19
+ export class ReconnectingSocket {
20
+ constructor(o) {
21
+ this.o = o;
22
+ this.ws = null;
23
+ this.st = "idle";
24
+ this.want = false;
25
+ this.authed = false;
26
+ this.attempt = 0;
27
+ this.seq = 0;
28
+ this.lastFrameAt = 0;
29
+ this.reconnectTimer = null;
30
+ this.authTimer = null;
31
+ this.pingTimer = null;
32
+ this.WS = o.WebSocket ?? globalThis.WebSocket;
33
+ this.redactor = o.redactor ?? new Redactor();
34
+ this.log = safeLogger(o.log, this.redactor);
35
+ this.events = new TypedEmitter((e) => this.log("listener_error", e));
36
+ this.expiredCode = o.closeCodes?.tokenExpired ?? 4001;
37
+ this.revokedCode = o.closeCodes?.revoked ?? 4003;
38
+ }
39
+ get state() { return this.st; }
40
+ /** The highest sequence number received (what `resume` is called with). */
41
+ get lastSeq() { return this.seq; }
42
+ /** Restore a sequence number kept from an earlier run. */
43
+ setLastSeq(n) { if (Number.isFinite(n) && n >= 0)
44
+ this.seq = n; }
45
+ connect() {
46
+ this.want = true;
47
+ if (this.ws || this.reconnectTimer)
48
+ return;
49
+ if (!this.WS) {
50
+ this.fail(new HainivaAgentError(0, "no_websocket"));
51
+ return;
52
+ }
53
+ void this.open();
54
+ }
55
+ disconnect() {
56
+ this.want = false;
57
+ this.clearTimers();
58
+ const ws = this.ws;
59
+ this.ws = null;
60
+ this.authed = false;
61
+ ws?.close(1000);
62
+ this.setState("closed");
63
+ }
64
+ /** Send a frame on an authenticated socket. False when not open (nothing is queued). */
65
+ send(frame) {
66
+ if (!this.ws || !this.authed || this.ws.readyState !== OPEN)
67
+ return false;
68
+ this.ws.send(this.encode(frame));
69
+ return true;
70
+ }
71
+ /** Hand a refreshed access token to the open socket (needs `tokenFrame`). */
72
+ updateToken(token) {
73
+ this.redactor.add(token);
74
+ return this.o.tokenFrame ? this.send(this.o.tokenFrame(token)) : false;
75
+ }
76
+ encode(f) { return (this.o.encode ?? JSON.stringify)(f); }
77
+ setState(s) {
78
+ if (this.st === s)
79
+ return;
80
+ this.st = s;
81
+ this.events.emit("state", s);
82
+ }
83
+ fail(e) {
84
+ this.log("socket_error", { code: e.code });
85
+ this.events.emit("error", e);
86
+ }
87
+ async open() {
88
+ this.setState(this.attempt ? "reconnecting" : "connecting");
89
+ let token;
90
+ let url;
91
+ try {
92
+ token = await this.o.getToken();
93
+ this.redactor.add(token);
94
+ url = typeof this.o.url === "function" ? await this.o.url() : this.o.url;
95
+ }
96
+ catch (e) {
97
+ this.fail(HainivaAgentError.from(e, "socket_auth_failed", this.redactor));
98
+ return this.scheduleReconnect();
99
+ }
100
+ if (!this.want)
101
+ return;
102
+ try {
103
+ assertSafeUrl(url, { kind: "ws", ...(this.o.allowInsecureLocalhost ? { allowInsecureLocalhost: true } : {}) });
104
+ if (token && url.includes(token))
105
+ throw new HainivaAgentError(0, "credentials_in_url");
106
+ }
107
+ catch (e) {
108
+ // A configuration mistake: retrying cannot fix it.
109
+ this.want = false;
110
+ this.setState("closed");
111
+ return this.fail(HainivaAgentError.from(e, "invalid_url", this.redactor));
112
+ }
113
+ let ws;
114
+ try {
115
+ ws = new this.WS(url);
116
+ }
117
+ catch (e) {
118
+ this.fail(HainivaAgentError.from(e, "socket_failed", this.redactor));
119
+ return this.scheduleReconnect();
120
+ }
121
+ this.ws = ws;
122
+ this.authed = false;
123
+ ws.onopen = () => {
124
+ if (this.ws !== ws)
125
+ return;
126
+ // First frame: the credential. Nothing else is sent before the server says ready.
127
+ ws.send(this.encode((this.o.authFrame ?? ((t) => ({ type: "auth", token: t })))(token)));
128
+ this.authTimer = setTimeout(() => {
129
+ if (this.ws === ws && !this.authed) {
130
+ this.log("auth_timeout");
131
+ ws.close(4000, "auth timeout");
132
+ }
133
+ }, this.o.authTimeoutMs ?? 10000);
134
+ };
135
+ ws.onmessage = (ev) => { if (this.ws === ws)
136
+ this.onFrame(ws, typeof ev.data === "string" ? ev.data : String(ev.data)); };
137
+ ws.onerror = () => { };
138
+ ws.onclose = (ev) => {
139
+ if (this.ws !== ws)
140
+ return;
141
+ this.ws = null;
142
+ this.authed = false;
143
+ this.clearTimers();
144
+ this.log("socket_closed", { code: ev.code });
145
+ if (!this.want)
146
+ return this.setState("closed");
147
+ if (ev.code === this.revokedCode) {
148
+ this.want = false;
149
+ this.setState("closed");
150
+ this.events.emit("revoked", { code: ev.code });
151
+ return;
152
+ }
153
+ if (this.o.closeCodes?.fatal?.includes(ev.code)) {
154
+ this.want = false;
155
+ this.setState("closed");
156
+ return this.fail(new HainivaAgentError(0, `socket_closed_${ev.code}`, {}, this.redactor));
157
+ }
158
+ if (ev.code === this.expiredCode)
159
+ this.o.onTokenRejected?.();
160
+ this.scheduleReconnect();
161
+ };
162
+ }
163
+ onFrame(ws, raw) {
164
+ let f;
165
+ try {
166
+ f = (this.o.decode ?? JSON.parse)(raw);
167
+ }
168
+ catch {
169
+ return;
170
+ }
171
+ this.lastFrameAt = Date.now();
172
+ if (!this.authed) {
173
+ const ready = this.o.isReady ?? ((x) => x?.["type"] === "ready");
174
+ if (!ready(f))
175
+ return; // nothing is delivered before the server accepted the credential
176
+ this.authed = true;
177
+ this.attempt = 0;
178
+ if (this.authTimer) {
179
+ clearTimeout(this.authTimer);
180
+ this.authTimer = null;
181
+ }
182
+ this.startHeartbeat(ws);
183
+ this.setState("open");
184
+ const resume = this.seq > 0 ? this.o.resume?.(this.seq) : null;
185
+ if (resume)
186
+ ws.send(this.encode(resume));
187
+ this.events.emit("ready", f);
188
+ return;
189
+ }
190
+ const seqOf = this.o.seqOf ?? ((x) => { const s = x?.["seq"]; return typeof s === "number" ? s : undefined; });
191
+ const s = seqOf(f);
192
+ if (s !== undefined) {
193
+ if (s <= this.seq)
194
+ return; // a replayed frame already delivered
195
+ this.seq = s;
196
+ }
197
+ this.events.emit("frame", f);
198
+ }
199
+ startHeartbeat(ws) {
200
+ const hb = this.o.heartbeat;
201
+ if (hb === false)
202
+ return;
203
+ const every = hb?.intervalMs ?? 20000;
204
+ const dead = hb?.timeoutMs ?? 45000;
205
+ const frame = hb?.frame ?? (() => ({ type: "ping" }));
206
+ this.pingTimer = setInterval(() => {
207
+ if (this.ws !== ws)
208
+ return;
209
+ if (Date.now() - this.lastFrameAt > dead) {
210
+ this.log("heartbeat_timeout");
211
+ ws.close(4000, "heartbeat timeout");
212
+ return;
213
+ }
214
+ if (ws.readyState === OPEN)
215
+ ws.send(this.encode(frame()));
216
+ }, every);
217
+ }
218
+ scheduleReconnect() {
219
+ if (!this.want)
220
+ return;
221
+ const b = this.o.backoff;
222
+ const d = backoffDelay(this.attempt++, b?.initialMs, b?.maxMs, b?.random);
223
+ this.setState("reconnecting");
224
+ this.reconnectTimer = setTimeout(() => { this.reconnectTimer = null; if (this.want)
225
+ void this.open(); }, d);
226
+ }
227
+ clearTimers() {
228
+ if (this.reconnectTimer) {
229
+ clearTimeout(this.reconnectTimer);
230
+ this.reconnectTimer = null;
231
+ }
232
+ if (this.authTimer) {
233
+ clearTimeout(this.authTimer);
234
+ this.authTimer = null;
235
+ }
236
+ if (this.pingTimer) {
237
+ clearInterval(this.pingTimer);
238
+ this.pingTimer = null;
239
+ }
240
+ }
241
+ }
242
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/ws.ts"],"names":[],"mappings":"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"}