@softomnitel/omnicall-kit 0.1.0-rc.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 (183) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +34 -0
  3. package/dist/index.d.ts +21 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +16 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/internal/account-activate-commands.d.ts +30 -0
  8. package/dist/internal/account-activate-commands.d.ts.map +1 -0
  9. package/dist/internal/account-activate-commands.js +94 -0
  10. package/dist/internal/account-activate-commands.js.map +1 -0
  11. package/dist/internal/account-activate-wire.d.ts +16 -0
  12. package/dist/internal/account-activate-wire.d.ts.map +1 -0
  13. package/dist/internal/account-activate-wire.js +22 -0
  14. package/dist/internal/account-activate-wire.js.map +1 -0
  15. package/dist/internal/account-logout-commands.d.ts +23 -0
  16. package/dist/internal/account-logout-commands.d.ts.map +1 -0
  17. package/dist/internal/account-logout-commands.js +51 -0
  18. package/dist/internal/account-logout-commands.js.map +1 -0
  19. package/dist/internal/account-logout-wire.d.ts +15 -0
  20. package/dist/internal/account-logout-wire.d.ts.map +1 -0
  21. package/dist/internal/account-logout-wire.js +24 -0
  22. package/dist/internal/account-logout-wire.js.map +1 -0
  23. package/dist/internal/auth-grants.d.ts +6 -0
  24. package/dist/internal/auth-grants.d.ts.map +1 -0
  25. package/dist/internal/auth-grants.js +16 -0
  26. package/dist/internal/auth-grants.js.map +1 -0
  27. package/dist/internal/auth-inbound.d.ts +35 -0
  28. package/dist/internal/auth-inbound.d.ts.map +1 -0
  29. package/dist/internal/auth-inbound.js +86 -0
  30. package/dist/internal/auth-inbound.js.map +1 -0
  31. package/dist/internal/auth-orchestrator.d.ts +36 -0
  32. package/dist/internal/auth-orchestrator.d.ts.map +1 -0
  33. package/dist/internal/auth-orchestrator.js +217 -0
  34. package/dist/internal/auth-orchestrator.js.map +1 -0
  35. package/dist/internal/auth-pop-flow.d.ts +38 -0
  36. package/dist/internal/auth-pop-flow.d.ts.map +1 -0
  37. package/dist/internal/auth-pop-flow.js +80 -0
  38. package/dist/internal/auth-pop-flow.js.map +1 -0
  39. package/dist/internal/auth-wire.d.ts +37 -0
  40. package/dist/internal/auth-wire.d.ts.map +1 -0
  41. package/dist/internal/auth-wire.js +62 -0
  42. package/dist/internal/auth-wire.js.map +1 -0
  43. package/dist/internal/base64url.d.ts +7 -0
  44. package/dist/internal/base64url.d.ts.map +1 -0
  45. package/dist/internal/base64url.js +28 -0
  46. package/dist/internal/base64url.js.map +1 -0
  47. package/dist/internal/browser-websocket-transport.d.ts +36 -0
  48. package/dist/internal/browser-websocket-transport.d.ts.map +1 -0
  49. package/dist/internal/browser-websocket-transport.js +131 -0
  50. package/dist/internal/browser-websocket-transport.js.map +1 -0
  51. package/dist/internal/call-commands.d.ts +32 -0
  52. package/dist/internal/call-commands.d.ts.map +1 -0
  53. package/dist/internal/call-commands.js +60 -0
  54. package/dist/internal/call-commands.js.map +1 -0
  55. package/dist/internal/call-wire.d.ts +24 -0
  56. package/dist/internal/call-wire.d.ts.map +1 -0
  57. package/dist/internal/call-wire.js +37 -0
  58. package/dist/internal/call-wire.js.map +1 -0
  59. package/dist/internal/client-error-details.d.ts +60 -0
  60. package/dist/internal/client-error-details.d.ts.map +1 -0
  61. package/dist/internal/client-error-details.js +98 -0
  62. package/dist/internal/client-error-details.js.map +1 -0
  63. package/dist/internal/client-errors.d.ts +38 -0
  64. package/dist/internal/client-errors.d.ts.map +1 -0
  65. package/dist/internal/client-errors.js +37 -0
  66. package/dist/internal/client-errors.js.map +1 -0
  67. package/dist/internal/command-classification.d.ts +7 -0
  68. package/dist/internal/command-classification.d.ts.map +1 -0
  69. package/dist/internal/command-classification.js +14 -0
  70. package/dist/internal/command-classification.js.map +1 -0
  71. package/dist/internal/connection-session.d.ts +61 -0
  72. package/dist/internal/connection-session.d.ts.map +1 -0
  73. package/dist/internal/connection-session.js +333 -0
  74. package/dist/internal/connection-session.js.map +1 -0
  75. package/dist/internal/connection-state.d.ts +13 -0
  76. package/dist/internal/connection-state.d.ts.map +1 -0
  77. package/dist/internal/connection-state.js +75 -0
  78. package/dist/internal/connection-state.js.map +1 -0
  79. package/dist/internal/diagnostics.d.ts +36 -0
  80. package/dist/internal/diagnostics.d.ts.map +1 -0
  81. package/dist/internal/diagnostics.js +51 -0
  82. package/dist/internal/diagnostics.js.map +1 -0
  83. package/dist/internal/event-subscription.d.ts +23 -0
  84. package/dist/internal/event-subscription.d.ts.map +1 -0
  85. package/dist/internal/event-subscription.js +62 -0
  86. package/dist/internal/event-subscription.js.map +1 -0
  87. package/dist/internal/heartbeat-controller.d.ts +27 -0
  88. package/dist/internal/heartbeat-controller.d.ts.map +1 -0
  89. package/dist/internal/heartbeat-controller.js +58 -0
  90. package/dist/internal/heartbeat-controller.js.map +1 -0
  91. package/dist/internal/operator-commands.d.ts +46 -0
  92. package/dist/internal/operator-commands.d.ts.map +1 -0
  93. package/dist/internal/operator-commands.js +93 -0
  94. package/dist/internal/operator-commands.js.map +1 -0
  95. package/dist/internal/operator-wire.d.ts +20 -0
  96. package/dist/internal/operator-wire.d.ts.map +1 -0
  97. package/dist/internal/operator-wire.js +33 -0
  98. package/dist/internal/operator-wire.js.map +1 -0
  99. package/dist/internal/origin-policy-errors.d.ts +22 -0
  100. package/dist/internal/origin-policy-errors.d.ts.map +1 -0
  101. package/dist/internal/origin-policy-errors.js +67 -0
  102. package/dist/internal/origin-policy-errors.js.map +1 -0
  103. package/dist/internal/pop-crypto.d.ts +23 -0
  104. package/dist/internal/pop-crypto.d.ts.map +1 -0
  105. package/dist/internal/pop-crypto.js +48 -0
  106. package/dist/internal/pop-crypto.js.map +1 -0
  107. package/dist/internal/pop-key-store.d.ts +28 -0
  108. package/dist/internal/pop-key-store.d.ts.map +1 -0
  109. package/dist/internal/pop-key-store.js +153 -0
  110. package/dist/internal/pop-key-store.js.map +1 -0
  111. package/dist/internal/product-commands.d.ts +33 -0
  112. package/dist/internal/product-commands.d.ts.map +1 -0
  113. package/dist/internal/product-commands.js +70 -0
  114. package/dist/internal/product-commands.js.map +1 -0
  115. package/dist/internal/product-inbound.d.ts +15 -0
  116. package/dist/internal/product-inbound.d.ts.map +1 -0
  117. package/dist/internal/product-inbound.js +31 -0
  118. package/dist/internal/product-inbound.js.map +1 -0
  119. package/dist/internal/product-orchestrator.d.ts +46 -0
  120. package/dist/internal/product-orchestrator.d.ts.map +1 -0
  121. package/dist/internal/product-orchestrator.js +188 -0
  122. package/dist/internal/product-orchestrator.js.map +1 -0
  123. package/dist/internal/product-wire.d.ts +29 -0
  124. package/dist/internal/product-wire.d.ts.map +1 -0
  125. package/dist/internal/product-wire.js +54 -0
  126. package/dist/internal/product-wire.js.map +1 -0
  127. package/dist/internal/public-event-map.d.ts +27 -0
  128. package/dist/internal/public-event-map.d.ts.map +1 -0
  129. package/dist/internal/public-event-map.js +38 -0
  130. package/dist/internal/public-event-map.js.map +1 -0
  131. package/dist/internal/reconnect-policy.d.ts +16 -0
  132. package/dist/internal/reconnect-policy.d.ts.map +1 -0
  133. package/dist/internal/reconnect-policy.js +23 -0
  134. package/dist/internal/reconnect-policy.js.map +1 -0
  135. package/dist/internal/request-correlator.d.ts +41 -0
  136. package/dist/internal/request-correlator.d.ts.map +1 -0
  137. package/dist/internal/request-correlator.js +130 -0
  138. package/dist/internal/request-correlator.js.map +1 -0
  139. package/dist/internal/requested-capabilities.d.ts +10 -0
  140. package/dist/internal/requested-capabilities.d.ts.map +1 -0
  141. package/dist/internal/requested-capabilities.js +25 -0
  142. package/dist/internal/requested-capabilities.js.map +1 -0
  143. package/dist/internal/scheduler.d.ts +41 -0
  144. package/dist/internal/scheduler.d.ts.map +1 -0
  145. package/dist/internal/scheduler.js +104 -0
  146. package/dist/internal/scheduler.js.map +1 -0
  147. package/dist/internal/session-identity.d.ts +16 -0
  148. package/dist/internal/session-identity.d.ts.map +1 -0
  149. package/dist/internal/session-identity.js +13 -0
  150. package/dist/internal/session-identity.js.map +1 -0
  151. package/dist/internal/snapshot-acquisition.d.ts +21 -0
  152. package/dist/internal/snapshot-acquisition.d.ts.map +1 -0
  153. package/dist/internal/snapshot-acquisition.js +40 -0
  154. package/dist/internal/snapshot-acquisition.js.map +1 -0
  155. package/dist/internal/snapshot-cache.d.ts +13 -0
  156. package/dist/internal/snapshot-cache.d.ts.map +1 -0
  157. package/dist/internal/snapshot-cache.js +18 -0
  158. package/dist/internal/snapshot-cache.js.map +1 -0
  159. package/dist/internal/transport-port.d.ts +34 -0
  160. package/dist/internal/transport-port.d.ts.map +1 -0
  161. package/dist/internal/transport-port.js +7 -0
  162. package/dist/internal/transport-port.js.map +1 -0
  163. package/dist/internal/window-commands.d.ts +23 -0
  164. package/dist/internal/window-commands.d.ts.map +1 -0
  165. package/dist/internal/window-commands.js +76 -0
  166. package/dist/internal/window-commands.js.map +1 -0
  167. package/dist/public/auth-client.d.ts +87 -0
  168. package/dist/public/auth-client.d.ts.map +1 -0
  169. package/dist/public/auth-client.js +116 -0
  170. package/dist/public/auth-client.js.map +1 -0
  171. package/dist/public/omnicall-client-api.d.ts +159 -0
  172. package/dist/public/omnicall-client-api.d.ts.map +1 -0
  173. package/dist/public/omnicall-client-api.js +5 -0
  174. package/dist/public/omnicall-client-api.js.map +1 -0
  175. package/dist/public/omnicall-client.d.ts +22 -0
  176. package/dist/public/omnicall-client.d.ts.map +1 -0
  177. package/dist/public/omnicall-client.js +171 -0
  178. package/dist/public/omnicall-client.js.map +1 -0
  179. package/dist/public/protocol-reexports.d.ts +41 -0
  180. package/dist/public/protocol-reexports.d.ts.map +1 -0
  181. package/dist/public/protocol-reexports.js +7 -0
  182. package/dist/public/protocol-reexports.js.map +1 -0
  183. package/package.json +46 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Typed public event subscriptions with sequence-gap detection.
3
+ */
4
+ import { toPublicEvent } from './public-event-map.js';
5
+ export function createEventSubscriptionHub(deps) {
6
+ const listeners = new Map();
7
+ let lastSequence;
8
+ const subscribe = (type, listener) => {
9
+ const set = listeners.get(type) ?? new Set();
10
+ const wrapped = (event) => {
11
+ if (event.type === type) {
12
+ listener(event);
13
+ }
14
+ };
15
+ set.add(wrapped);
16
+ listeners.set(type, set);
17
+ return () => {
18
+ set.delete(wrapped);
19
+ if (set.size === 0) {
20
+ listeners.delete(type);
21
+ }
22
+ };
23
+ };
24
+ const handleEvent = (message, connectionState) => {
25
+ let gap = false;
26
+ if (lastSequence !== undefined && message.sequence > lastSequence + 1) {
27
+ gap = true;
28
+ deps.diagnostics?.emit({
29
+ level: 'warn',
30
+ code: 'event.sequence_gap',
31
+ connectionState,
32
+ result: 'error'
33
+ });
34
+ deps.onSequenceGap();
35
+ }
36
+ lastSequence = message.sequence;
37
+ const publicEvent = toPublicEvent(message);
38
+ if (publicEvent === undefined) {
39
+ return { gap };
40
+ }
41
+ const set = listeners.get(publicEvent.type);
42
+ if (set === undefined) {
43
+ return { gap };
44
+ }
45
+ for (const listener of set) {
46
+ listener(publicEvent);
47
+ }
48
+ return { gap };
49
+ };
50
+ return {
51
+ subscribe,
52
+ handleEvent,
53
+ clearSequence: () => {
54
+ lastSequence = undefined;
55
+ },
56
+ lastSequence: () => lastSequence,
57
+ clearListeners: () => {
58
+ listeners.clear();
59
+ }
60
+ };
61
+ }
62
+ //# sourceMappingURL=event-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-subscription.js","sourceRoot":"","sources":["../../src/internal/event-subscription.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,aAAa,EAGd,MAAM,uBAAuB,CAAC;AAmB/B,MAAM,UAAU,0BAA0B,CAAC,IAG1C;IACC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC/D,IAAI,YAAgC,CAAC;IAErC,MAAM,SAAS,GAAG,CAChB,IAAO,EACP,QAA8D,EAChD,EAAE;QAChB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAe,CAAC;QAC1D,MAAM,OAAO,GAAgB,CAAC,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACxB,QAAQ,CAAC,KAA4C,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjB,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpB,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACnB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAClB,OAAqB,EACrB,eAAgC,EACL,EAAE;QAC7B,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC;YACtE,GAAG,GAAG,IAAI,CAAC;YACX,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;gBACrB,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,oBAAoB;gBAC1B,eAAe;gBACf,MAAM,EAAE,OAAO;aAChB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;QACD,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;QAChC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC;QACD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;YAC3B,QAAQ,CAAC,WAAW,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,SAAS;QACT,WAAW;QACX,aAAa,EAAE,GAAG,EAAE;YAClB,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QACD,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY;QAChC,cAAc,EAAE,GAAG,EAAE;YACnB,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Ready-state heartbeat using sdk:ping correlation. Failures drive reconnect.
3
+ */
4
+ import type { ConnectionState } from './connection-state.js';
5
+ import type { DiagnosticsSink } from './diagnostics.js';
6
+ import type { Scheduler } from './scheduler.js';
7
+ /** Ready-state heartbeat policy. @public */
8
+ export type HeartbeatPolicy = {
9
+ readonly enabled: boolean;
10
+ readonly intervalMs: number;
11
+ readonly timeoutMs: number;
12
+ };
13
+ export declare const DEFAULT_HEARTBEAT_POLICY: HeartbeatPolicy;
14
+ export type HeartbeatController = {
15
+ readonly start: (intervalMs: number) => void;
16
+ readonly stop: () => void;
17
+ readonly isRunning: () => boolean;
18
+ };
19
+ export declare function createHeartbeatController(deps: {
20
+ readonly scheduler: Scheduler;
21
+ readonly diagnostics?: DiagnosticsSink;
22
+ readonly timeoutMs: number;
23
+ readonly sendPing: (timeoutMs: number) => Promise<boolean>;
24
+ readonly onMissed: () => void;
25
+ readonly connectionState: () => ConnectionState;
26
+ }): HeartbeatController;
27
+ //# sourceMappingURL=heartbeat-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-controller.d.ts","sourceRoot":"","sources":["../../src/internal/heartbeat-controller.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,gBAAgB,CAAC;AAE7D,4CAA4C;AAC5C,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,eAItC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC;CACnC,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,eAAe,CAAC;CACjD,GAAG,mBAAmB,CAmDtB"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Ready-state heartbeat using sdk:ping correlation. Failures drive reconnect.
3
+ */
4
+ export const DEFAULT_HEARTBEAT_POLICY = {
5
+ enabled: true,
6
+ intervalMs: 15_000,
7
+ timeoutMs: 5_000
8
+ };
9
+ export function createHeartbeatController(deps) {
10
+ let intervalHandle;
11
+ let inFlight = false;
12
+ const stop = () => {
13
+ intervalHandle?.clear();
14
+ intervalHandle = undefined;
15
+ inFlight = false;
16
+ };
17
+ const tick = () => {
18
+ if (inFlight) {
19
+ return;
20
+ }
21
+ inFlight = true;
22
+ void deps.sendPing(deps.timeoutMs).then((ok) => {
23
+ inFlight = false;
24
+ if (intervalHandle === undefined) {
25
+ return;
26
+ }
27
+ deps.diagnostics?.emit({
28
+ level: ok ? 'debug' : 'warn',
29
+ code: ok ? 'heartbeat.ok' : 'heartbeat.missed',
30
+ connectionState: deps.connectionState(),
31
+ commandType: 'sdk:ping',
32
+ result: ok ? 'ok' : 'timeout'
33
+ });
34
+ if (!ok) {
35
+ stop();
36
+ deps.onMissed();
37
+ }
38
+ });
39
+ };
40
+ return {
41
+ start: (intervalMs) => {
42
+ stop();
43
+ const scheduleNext = () => {
44
+ intervalHandle = deps.scheduler.setTimeout(() => {
45
+ tick();
46
+ if (intervalHandle === undefined) {
47
+ return;
48
+ }
49
+ scheduleNext();
50
+ }, intervalMs);
51
+ };
52
+ scheduleNext();
53
+ },
54
+ stop,
55
+ isRunning: () => intervalHandle !== undefined
56
+ };
57
+ }
58
+ //# sourceMappingURL=heartbeat-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat-controller.js","sourceRoot":"","sources":["../../src/internal/heartbeat-controller.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,MAAM,CAAC,MAAM,wBAAwB,GAAoB;IACvD,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,KAAK;CACjB,CAAC;AAQF,MAAM,UAAU,yBAAyB,CAAC,IAOzC;IACC,IAAI,cAAuC,CAAC;IAC5C,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,cAAc,EAAE,KAAK,EAAE,CAAC;QACxB,cAAc,GAAG,SAAS,CAAC;QAC3B,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAS,EAAE;QACtB,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;QAChB,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE;YAC7C,QAAQ,GAAG,KAAK,CAAC;YACjB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;gBACrB,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBAC5B,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,kBAAkB;gBAC9C,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;gBACvC,WAAW,EAAE,UAAU;gBACvB,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;aAC9B,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;YACpB,IAAI,EAAE,CAAC;YACP,MAAM,YAAY,GAAG,GAAS,EAAE;gBAC9B,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE;oBAC9C,IAAI,EAAE,CAAC;oBACP,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;wBACjC,OAAO;oBACT,CAAC;oBACD,YAAY,EAAE,CAAC;gBACjB,CAAC,EAAE,UAAU,CAAC,CAAC;YACjB,CAAC,CAAC;YACF,YAAY,EAAE,CAAC;QACjB,CAAC;QACD,IAAI;QACJ,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,KAAK,SAAS;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Capability-gated operator command runner (SDK-07 + finish-appeal).
3
+ */
4
+ import type { CapabilityId, PublicOperatorStatus } from '@softomnitel/omnicall-protocol';
5
+ import type { ConnectionSession } from './connection-session.js';
6
+ import type { Scheduler } from './scheduler.js';
7
+ /** Public operator reason DTO (protocol-safe; no OCP wire). @public */
8
+ export type OperatorReason = {
9
+ readonly id: number;
10
+ readonly label: string;
11
+ readonly kind: 'ready' | 'break' | 'logout';
12
+ };
13
+ /** @public */
14
+ export type OperatorReasonsResult = {
15
+ readonly reasons: readonly OperatorReason[];
16
+ readonly revision: number;
17
+ };
18
+ /** Outcome of `operator:change-status` / finish-appeal success. @public */
19
+ export type OperatorStatusChangeKind = 'applied' | 'reserved';
20
+ /** @public */
21
+ export type OperatorStatusChangeResult = {
22
+ readonly accepted: true;
23
+ readonly kind: OperatorStatusChangeKind;
24
+ readonly targetStatus: PublicOperatorStatus;
25
+ readonly reasonId: number;
26
+ readonly revision: number;
27
+ };
28
+ /** Finish-appeal success reuses the same public shape as applied change-status. @public */
29
+ export type OperatorFinishAppealResult = OperatorStatusChangeResult;
30
+ export type OperatorCommandApi = {
31
+ readonly getReasons: () => Promise<OperatorReasonsResult>;
32
+ readonly changeStatus: (input: {
33
+ readonly target: 'ready' | 'break';
34
+ readonly reasonId?: number;
35
+ readonly expectedRevision: number;
36
+ }) => Promise<OperatorStatusChangeResult>;
37
+ readonly finishAppeal: (input: {
38
+ readonly expectedRevision: number;
39
+ }) => Promise<OperatorFinishAppealResult>;
40
+ };
41
+ export declare function createOperatorCommandApi(deps: {
42
+ readonly connection: ConnectionSession;
43
+ readonly scheduler: Scheduler;
44
+ readonly getGrantedCapabilities: () => readonly CapabilityId[];
45
+ }): OperatorCommandApi;
46
+ //# sourceMappingURL=operator-commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-commands.d.ts","sourceRoot":"","sources":["../../src/internal/operator-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,YAAY,EAEZ,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AAIxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAYjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;CAC7C,CAAC;AAEF,cAAc;AACd,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,2EAA2E;AAC3E,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9D,cAAc;AACd,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,2FAA2F;AAC3F,MAAM,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAEpE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1D,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE;QAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;QACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;KACnC,KAAK,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC1C,QAAQ,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE;QAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;KACnC,KAAK,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC3C,CAAC;AA8DF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,SAAS,YAAY,EAAE,CAAC;CAChE,GAAG,kBAAkB,CAmErB"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Capability-gated operator command runner (SDK-07 + finish-appeal).
3
+ */
4
+ import { PublicOperatorStatusSchema } from '@softomnitel/omnicall-protocol';
5
+ import { createClientError } from './client-errors.js';
6
+ import { buildOperatorChangeStatusBody, buildOperatorFinishAppealBody, buildOperatorGetReasonsBody } from './operator-wire.js';
7
+ import { guardCapability, guardReady, mapReplyFailure, requireWireIdentity } from './product-commands.js';
8
+ function readOperatorReasons(reply) {
9
+ const raw = reply.result['reasons'];
10
+ if (!Array.isArray(raw)) {
11
+ throw createClientError({ code: 'invalid_payload', retryable: false });
12
+ }
13
+ const reasons = [];
14
+ for (const item of raw) {
15
+ if (typeof item !== 'object' || item === null) {
16
+ throw createClientError({ code: 'invalid_payload', retryable: false });
17
+ }
18
+ const record = item;
19
+ const id = record['id'];
20
+ const label = record['label'];
21
+ const kind = record['kind'];
22
+ if (typeof id !== 'number' ||
23
+ !Number.isInteger(id) ||
24
+ id < 0 ||
25
+ typeof label !== 'string' ||
26
+ label.length === 0 ||
27
+ (kind !== 'ready' && kind !== 'break' && kind !== 'logout')) {
28
+ throw createClientError({ code: 'invalid_payload', retryable: false });
29
+ }
30
+ reasons.push({ id, label, kind });
31
+ }
32
+ return { reasons, revision: reply.revision };
33
+ }
34
+ function readStatusChangeResult(reply) {
35
+ const accepted = reply.result['accepted'];
36
+ const kind = reply.result['kind'];
37
+ const targetStatusRaw = reply.result['targetStatus'];
38
+ const reasonId = reply.result['reasonId'];
39
+ const statusParsed = PublicOperatorStatusSchema.safeParse(targetStatusRaw);
40
+ if (accepted !== true ||
41
+ (kind !== 'applied' && kind !== 'reserved') ||
42
+ !statusParsed.success ||
43
+ typeof reasonId !== 'number' ||
44
+ !Number.isInteger(reasonId) ||
45
+ reasonId < 0) {
46
+ throw createClientError({ code: 'invalid_payload', retryable: false });
47
+ }
48
+ return {
49
+ accepted: true,
50
+ kind,
51
+ targetStatus: statusParsed.data,
52
+ reasonId,
53
+ revision: reply.revision
54
+ };
55
+ }
56
+ export function createOperatorCommandApi(deps) {
57
+ const runOperatorCommand = async (commandType, buildBody, readResult) => {
58
+ const notReady = guardReady(deps.connection);
59
+ if (notReady !== undefined) {
60
+ return Promise.reject(notReady);
61
+ }
62
+ const missingCap = guardCapability(deps.getGrantedCapabilities(), 'operator.status.write');
63
+ if (missingCap !== undefined) {
64
+ return Promise.reject(missingCap);
65
+ }
66
+ const identity = requireWireIdentity(deps.connection);
67
+ if ('code' in identity) {
68
+ return Promise.reject(identity);
69
+ }
70
+ const requestId = crypto.randomUUID();
71
+ const fields = {
72
+ requestId,
73
+ serverInstanceId: identity.serverInstanceId,
74
+ sessionEpoch: identity.sessionEpoch,
75
+ occurredAtMs: deps.scheduler.now()
76
+ };
77
+ const result = await deps.connection.request({
78
+ requestId,
79
+ commandType,
80
+ body: buildBody(fields)
81
+ });
82
+ if (!result.ok || !result.reply.ok) {
83
+ return Promise.reject(mapReplyFailure(result));
84
+ }
85
+ return readResult(result.reply);
86
+ };
87
+ return {
88
+ getReasons: () => runOperatorCommand('operator:get-reasons', (fields) => buildOperatorGetReasonsBody(fields), readOperatorReasons),
89
+ changeStatus: (input) => runOperatorCommand('operator:change-status', (fields) => buildOperatorChangeStatusBody(fields, input), readStatusChangeResult),
90
+ finishAppeal: (input) => runOperatorCommand('operator:finish-appeal', (fields) => buildOperatorFinishAppealBody(fields, input), readStatusChangeResult)
91
+ };
92
+ }
93
+ //# sourceMappingURL=operator-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-commands.js","sourceRoot":"","sources":["../../src/internal/operator-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Operator command wire builders (SDK-07). Schema-aligned outbound frames.
3
+ */
4
+ type WireIdentity = {
5
+ readonly requestId: string;
6
+ readonly serverInstanceId: string;
7
+ readonly sessionEpoch: string;
8
+ readonly occurredAtMs: number;
9
+ };
10
+ export declare function buildOperatorGetReasonsBody(identity: WireIdentity): string;
11
+ export declare function buildOperatorChangeStatusBody(identity: WireIdentity, input: {
12
+ readonly target: 'ready' | 'break';
13
+ readonly reasonId?: number;
14
+ readonly expectedRevision: number;
15
+ }): string;
16
+ export declare function buildOperatorFinishAppealBody(identity: WireIdentity, input: {
17
+ readonly expectedRevision: number;
18
+ }): string;
19
+ export {};
20
+ //# sourceMappingURL=operator-wire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-wire.d.ts","sourceRoot":"","sources":["../../src/internal/operator-wire.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAmBF,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAE1E;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE;IACL,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,GACA,MAAM,CAMR;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE;IACL,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC,GACA,MAAM,CAIR"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Operator command wire builders (SDK-07). Schema-aligned outbound frames.
3
+ */
4
+ import { PROTOCOL_MAJOR } from '@softomnitel/omnicall-protocol';
5
+ import { isoNow } from './auth-wire.js';
6
+ function envelope(type, identity, payload) {
7
+ return JSON.stringify({
8
+ protocolVersion: PROTOCOL_MAJOR,
9
+ kind: 'command',
10
+ type,
11
+ requestId: identity.requestId,
12
+ serverInstanceId: identity.serverInstanceId,
13
+ sessionEpoch: identity.sessionEpoch,
14
+ occurredAt: isoNow(identity.occurredAtMs),
15
+ payload
16
+ });
17
+ }
18
+ export function buildOperatorGetReasonsBody(identity) {
19
+ return envelope('operator:get-reasons', identity, {});
20
+ }
21
+ export function buildOperatorChangeStatusBody(identity, input) {
22
+ return envelope('operator:change-status', identity, {
23
+ target: input.target,
24
+ expectedRevision: input.expectedRevision,
25
+ ...(input.reasonId !== undefined ? { reasonId: input.reasonId } : {})
26
+ });
27
+ }
28
+ export function buildOperatorFinishAppealBody(identity, input) {
29
+ return envelope('operator:finish-appeal', identity, {
30
+ expectedRevision: input.expectedRevision
31
+ });
32
+ }
33
+ //# sourceMappingURL=operator-wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-wire.js","sourceRoot":"","sources":["../../src/internal/operator-wire.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AASxC,SAAS,QAAQ,CACf,IAAY,EACZ,QAAsB,EACtB,OAA0C;IAE1C,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,SAAS;QACf,IAAI;QACJ,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;QAC3C,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;QACzC,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAsB;IAChE,OAAO,QAAQ,CAAC,sBAAsB,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAsB,EACtB,KAIC;IAED,OAAO,QAAQ,CAAC,wBAAwB,EAAE,QAAQ,EAAE;QAClD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAsB,EACtB,KAEC;IAED,OAAO,QAAQ,CAAC,wBAAwB,EAAE,QAAQ,EAAE;QAClD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;KACzC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Origin trust / blacklist client error mapping (ADR-0018).
3
+ */
4
+ import type { WireJsonObject } from '@softomnitel/omnicall-protocol';
5
+ import type { OmniCallClientError } from './client-errors.js';
6
+ import type { ConnectionState } from './connection-state.js';
7
+ import type { TransportCloseInfo } from './transport-port.js';
8
+ /** Wire / details key for first-contact Origin Deny. @public */
9
+ export declare const ORIGIN_DENIED_DETAIL_KEY: "origin_denied";
10
+ /** @public */
11
+ export declare function createOriginBlockedError(): OmniCallClientError;
12
+ export declare function createOriginDeniedError(): OmniCallClientError;
13
+ export declare function isOriginDeniedWireDetails(details: WireJsonObject | undefined): boolean;
14
+ /**
15
+ * True for blacklisted upgrade reject (`origin_blocked`) and first-contact
16
+ * wire deny (`forbidden` + `origin_denied` details).
17
+ * @public
18
+ */
19
+ export declare function isOriginBlockedError(value: unknown): value is OmniCallClientError;
20
+ export declare function isOriginPolicyTransportReject(closeInfo: TransportCloseInfo): boolean;
21
+ export declare function mapTransportCloseToOriginPolicyError(closeInfo: TransportCloseInfo, connectionState: ConnectionState): OmniCallClientError | undefined;
22
+ //# sourceMappingURL=origin-policy-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-policy-errors.d.ts","sourceRoot":"","sources":["../../src/internal/origin-policy-errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,gEAAgE;AAChE,eAAO,MAAM,wBAAwB,EAAG,eAAwB,CAAC;AAIjE,cAAc;AACd,wBAAgB,wBAAwB,IAAI,mBAAmB,CAE9D;AAED,wBAAgB,uBAAuB,IAAI,mBAAmB,CAM7D;AAED,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,cAAc,GAAG,SAAS,GAClC,OAAO,CAQT;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAQjF;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,kBAAkB,GAC5B,OAAO,CAUT;AAED,wBAAgB,oCAAoC,CAClD,SAAS,EAAE,kBAAkB,EAC7B,eAAe,EAAE,eAAe,GAC/B,mBAAmB,GAAG,SAAS,CAiBjC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Origin trust / blacklist client error mapping (ADR-0018).
3
+ */
4
+ import { createClientError, isOmniCallClientError } from './client-errors.js';
5
+ /** Wire / details key for first-contact Origin Deny. @public */
6
+ export const ORIGIN_DENIED_DETAIL_KEY = 'origin_denied';
7
+ const ORIGIN_POLICY_TRANSPORT_CLOSE_CODES = new Set([4003, 4403]);
8
+ /** @public */
9
+ export function createOriginBlockedError() {
10
+ return createClientError({ code: 'origin_blocked', retryable: false });
11
+ }
12
+ export function createOriginDeniedError() {
13
+ return createClientError({
14
+ code: 'forbidden',
15
+ retryable: false,
16
+ details: { [ORIGIN_DENIED_DETAIL_KEY]: true }
17
+ });
18
+ }
19
+ export function isOriginDeniedWireDetails(details) {
20
+ if (details === undefined) {
21
+ return false;
22
+ }
23
+ if (details[ORIGIN_DENIED_DETAIL_KEY] === true) {
24
+ return true;
25
+ }
26
+ return details['reason'] === ORIGIN_DENIED_DETAIL_KEY;
27
+ }
28
+ /**
29
+ * True for blacklisted upgrade reject (`origin_blocked`) and first-contact
30
+ * wire deny (`forbidden` + `origin_denied` details).
31
+ * @public
32
+ */
33
+ export function isOriginBlockedError(value) {
34
+ if (!isOmniCallClientError(value)) {
35
+ return false;
36
+ }
37
+ if (value.code === 'origin_blocked') {
38
+ return true;
39
+ }
40
+ return value.code === 'forbidden' && isOriginDeniedWireDetails(value.details);
41
+ }
42
+ export function isOriginPolicyTransportReject(closeInfo) {
43
+ const reason = closeInfo.reason.trim().toLowerCase();
44
+ if (reason.length === 0) {
45
+ return ORIGIN_POLICY_TRANSPORT_CLOSE_CODES.has(closeInfo.code);
46
+ }
47
+ return (reason.includes(ORIGIN_DENIED_DETAIL_KEY) ||
48
+ reason.includes('origin_blocked') ||
49
+ reason.includes('origin_policy'));
50
+ }
51
+ export function mapTransportCloseToOriginPolicyError(closeInfo, connectionState) {
52
+ if (connectionState === 'connecting') {
53
+ if (isOriginPolicyTransportReject(closeInfo)) {
54
+ return createOriginBlockedError();
55
+ }
56
+ return undefined;
57
+ }
58
+ if (connectionState === 'handshaking' ||
59
+ connectionState === 'pairing_required' ||
60
+ connectionState === 'authenticating') {
61
+ if (isOriginPolicyTransportReject(closeInfo)) {
62
+ return createOriginDeniedError();
63
+ }
64
+ }
65
+ return undefined;
66
+ }
67
+ //# sourceMappingURL=origin-policy-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-policy-errors.js","sourceRoot":"","sources":["../../src/internal/origin-policy-errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAK5B,gEAAgE;AAChE,MAAM,CAAC,MAAM,wBAAwB,GAAG,eAAwB,CAAC;AAEjE,MAAM,mCAAmC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAElE,cAAc;AACd,MAAM,UAAU,wBAAwB;IACtC,OAAO,iBAAiB,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,iBAAiB,CAAC;QACvB,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,IAAI,EAAE;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,OAAmC;IAEnC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,wBAAwB,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,yBAAyB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAA6B;IAE7B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,mCAAmC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CACL,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACzC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QACjC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oCAAoC,CAClD,SAA6B,EAC7B,eAAgC;IAEhC,IAAI,eAAe,KAAK,YAAY,EAAE,CAAC;QACrC,IAAI,6BAA6B,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,OAAO,wBAAwB,EAAE,CAAC;QACpC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IACE,eAAe,KAAK,aAAa;QACjC,eAAe,KAAK,kBAAkB;QACtC,eAAe,KAAK,gBAAgB,EACpC,CAAC;QACD,IAAI,6BAA6B,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7C,OAAO,uBAAuB,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Browser PoP crypto (ADR-0016): ECDSA P-256, non-extractable private key,
3
+ * IEEE-P1363 signatures (Web Crypto default; matches desktop sdkGatewayPopCrypto).
4
+ */
5
+ import { POP_KEY_ALGORITHM } from '@softomnitel/omnicall-protocol';
6
+ export type PopKeyPair = {
7
+ readonly privateKey: CryptoKey;
8
+ readonly publicKey: CryptoKey;
9
+ readonly publicKeySpkiBase64Url: string;
10
+ };
11
+ export declare function assertWebCryptoAvailable(): SubtleCrypto;
12
+ export declare function generatePopKeyPair(): Promise<PopKeyPair>;
13
+ export declare function signPopChallenge(input: {
14
+ readonly privateKey: CryptoKey;
15
+ readonly serverInstanceId: string;
16
+ readonly sessionEpoch: string;
17
+ readonly origin: string;
18
+ readonly clientId: string;
19
+ readonly challengeId: string;
20
+ readonly nonce: string;
21
+ }): Promise<string>;
22
+ export declare function popKeyAlgorithmId(): typeof POP_KEY_ALGORITHM;
23
+ //# sourceMappingURL=pop-crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pop-crypto.d.ts","sourceRoot":"","sources":["../../src/internal/pop-crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAA0B,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAc3F,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACzC,CAAC;AAEF,wBAAgB,wBAAwB,IAAI,YAAY,CAMvD;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC,CAS9D;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBlB;AAED,wBAAgB,iBAAiB,IAAI,OAAO,iBAAiB,CAE5D"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Browser PoP crypto (ADR-0016): ECDSA P-256, non-extractable private key,
3
+ * IEEE-P1363 signatures (Web Crypto default; matches desktop sdkGatewayPopCrypto).
4
+ */
5
+ import { buildPopSigningPayload, POP_KEY_ALGORITHM } from '@softomnitel/omnicall-protocol';
6
+ import { bytesToBase64Url } from './base64url.js';
7
+ const EC_PARAMS = {
8
+ name: 'ECDSA',
9
+ namedCurve: 'P-256'
10
+ };
11
+ const SIGN_PARAMS = {
12
+ name: 'ECDSA',
13
+ hash: 'SHA-256'
14
+ };
15
+ export function assertWebCryptoAvailable() {
16
+ const subtle = globalThis.crypto?.subtle;
17
+ if (subtle === undefined) {
18
+ throw new Error('Web Crypto SubtleCrypto is unavailable');
19
+ }
20
+ return subtle;
21
+ }
22
+ export async function generatePopKeyPair() {
23
+ const subtle = assertWebCryptoAvailable();
24
+ const pair = await subtle.generateKey(EC_PARAMS, false, ['sign', 'verify']);
25
+ const spki = await subtle.exportKey('spki', pair.publicKey);
26
+ return {
27
+ privateKey: pair.privateKey,
28
+ publicKey: pair.publicKey,
29
+ publicKeySpkiBase64Url: bytesToBase64Url(spki)
30
+ };
31
+ }
32
+ export async function signPopChallenge(input) {
33
+ const subtle = assertWebCryptoAvailable();
34
+ const payload = buildPopSigningPayload({
35
+ serverInstanceId: input.serverInstanceId,
36
+ sessionEpoch: input.sessionEpoch,
37
+ origin: input.origin,
38
+ clientId: input.clientId,
39
+ challengeId: input.challengeId,
40
+ nonce: input.nonce
41
+ });
42
+ const signature = await subtle.sign(SIGN_PARAMS, input.privateKey, new TextEncoder().encode(payload));
43
+ return bytesToBase64Url(signature);
44
+ }
45
+ export function popKeyAlgorithmId() {
46
+ return POP_KEY_ALGORITHM;
47
+ }
48
+ //# sourceMappingURL=pop-crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pop-crypto.js","sourceRoot":"","sources":["../../src/internal/pop-crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,SAAS,GAAmB;IAChC,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,OAAO;CACpB,CAAC;AAEF,MAAM,WAAW,GAAgB;IAC/B,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,SAAS;CAChB,CAAC;AAQF,MAAM,UAAU,wBAAwB;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IACzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5D,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,sBAAsB,EAAE,gBAAgB,CAAC,IAAI,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAQtC;IACC,MAAM,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC1C,MAAM,OAAO,GAAG,sBAAsB,CAAC;QACrC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CACjC,WAAW,EACX,KAAK,CAAC,UAAU,EAChB,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAClC,CAAC;IACF,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * PoP private-key persistence (ADR-0016): IndexedDB only in browsers.
3
+ * Never localStorage / sessionStorage. Tests use an in-memory store.
4
+ */
5
+ import type { CapabilityId, PairingProfile } from '@softomnitel/omnicall-protocol';
6
+ /** Persisted PoP identity (private key non-extractable). @public */
7
+ export type StoredPopIdentity = {
8
+ readonly clientId: string;
9
+ readonly publicKeySpkiBase64Url: string;
10
+ readonly privateKey: CryptoKey;
11
+ readonly profile: PairingProfile | undefined;
12
+ readonly grantedCapabilities: readonly CapabilityId[];
13
+ };
14
+ /** PoP key persistence port (IndexedDB in browsers). @public */
15
+ export type PopKeyStore = {
16
+ readonly load: () => Promise<StoredPopIdentity | undefined>;
17
+ readonly save: (identity: StoredPopIdentity) => Promise<void>;
18
+ readonly clear: () => Promise<void>;
19
+ };
20
+ /** In-memory key store for tests and non-browser runners. @public */
21
+ export declare function createMemoryPopKeyStore(initial?: StoredPopIdentity): PopKeyStore & {
22
+ readonly peek: () => StoredPopIdentity | undefined;
23
+ };
24
+ /** IndexedDB-backed PoP store (never localStorage/sessionStorage). @public */
25
+ export declare function createIndexedDbPopKeyStore(input: {
26
+ readonly installId: string;
27
+ }): PopKeyStore;
28
+ //# sourceMappingURL=pop-key-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pop-key-store.d.ts","sourceRoot":"","sources":["../../src/internal/pop-key-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEnF,oEAAoE;AACpE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,mBAAmB,EAAE,SAAS,YAAY,EAAE,CAAC;CACvD,CAAC;AAEF,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;IAC5D,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC,CAAC;AAcF,qEAAqE;AACrE,wBAAgB,uBAAuB,CACrC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,iBAAiB,GAAG,SAAS,CAAA;CAAE,CActE;AAED,8EAA8E;AAC9E,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GAAG,WAAW,CA+Dd"}