@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.
- package/LICENSE +4 -0
- package/README.md +34 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/account-activate-commands.d.ts +30 -0
- package/dist/internal/account-activate-commands.d.ts.map +1 -0
- package/dist/internal/account-activate-commands.js +94 -0
- package/dist/internal/account-activate-commands.js.map +1 -0
- package/dist/internal/account-activate-wire.d.ts +16 -0
- package/dist/internal/account-activate-wire.d.ts.map +1 -0
- package/dist/internal/account-activate-wire.js +22 -0
- package/dist/internal/account-activate-wire.js.map +1 -0
- package/dist/internal/account-logout-commands.d.ts +23 -0
- package/dist/internal/account-logout-commands.d.ts.map +1 -0
- package/dist/internal/account-logout-commands.js +51 -0
- package/dist/internal/account-logout-commands.js.map +1 -0
- package/dist/internal/account-logout-wire.d.ts +15 -0
- package/dist/internal/account-logout-wire.d.ts.map +1 -0
- package/dist/internal/account-logout-wire.js +24 -0
- package/dist/internal/account-logout-wire.js.map +1 -0
- package/dist/internal/auth-grants.d.ts +6 -0
- package/dist/internal/auth-grants.d.ts.map +1 -0
- package/dist/internal/auth-grants.js +16 -0
- package/dist/internal/auth-grants.js.map +1 -0
- package/dist/internal/auth-inbound.d.ts +35 -0
- package/dist/internal/auth-inbound.d.ts.map +1 -0
- package/dist/internal/auth-inbound.js +86 -0
- package/dist/internal/auth-inbound.js.map +1 -0
- package/dist/internal/auth-orchestrator.d.ts +36 -0
- package/dist/internal/auth-orchestrator.d.ts.map +1 -0
- package/dist/internal/auth-orchestrator.js +217 -0
- package/dist/internal/auth-orchestrator.js.map +1 -0
- package/dist/internal/auth-pop-flow.d.ts +38 -0
- package/dist/internal/auth-pop-flow.d.ts.map +1 -0
- package/dist/internal/auth-pop-flow.js +80 -0
- package/dist/internal/auth-pop-flow.js.map +1 -0
- package/dist/internal/auth-wire.d.ts +37 -0
- package/dist/internal/auth-wire.d.ts.map +1 -0
- package/dist/internal/auth-wire.js +62 -0
- package/dist/internal/auth-wire.js.map +1 -0
- package/dist/internal/base64url.d.ts +7 -0
- package/dist/internal/base64url.d.ts.map +1 -0
- package/dist/internal/base64url.js +28 -0
- package/dist/internal/base64url.js.map +1 -0
- package/dist/internal/browser-websocket-transport.d.ts +36 -0
- package/dist/internal/browser-websocket-transport.d.ts.map +1 -0
- package/dist/internal/browser-websocket-transport.js +131 -0
- package/dist/internal/browser-websocket-transport.js.map +1 -0
- package/dist/internal/call-commands.d.ts +32 -0
- package/dist/internal/call-commands.d.ts.map +1 -0
- package/dist/internal/call-commands.js +60 -0
- package/dist/internal/call-commands.js.map +1 -0
- package/dist/internal/call-wire.d.ts +24 -0
- package/dist/internal/call-wire.d.ts.map +1 -0
- package/dist/internal/call-wire.js +37 -0
- package/dist/internal/call-wire.js.map +1 -0
- package/dist/internal/client-error-details.d.ts +60 -0
- package/dist/internal/client-error-details.d.ts.map +1 -0
- package/dist/internal/client-error-details.js +98 -0
- package/dist/internal/client-error-details.js.map +1 -0
- package/dist/internal/client-errors.d.ts +38 -0
- package/dist/internal/client-errors.d.ts.map +1 -0
- package/dist/internal/client-errors.js +37 -0
- package/dist/internal/client-errors.js.map +1 -0
- package/dist/internal/command-classification.d.ts +7 -0
- package/dist/internal/command-classification.d.ts.map +1 -0
- package/dist/internal/command-classification.js +14 -0
- package/dist/internal/command-classification.js.map +1 -0
- package/dist/internal/connection-session.d.ts +61 -0
- package/dist/internal/connection-session.d.ts.map +1 -0
- package/dist/internal/connection-session.js +333 -0
- package/dist/internal/connection-session.js.map +1 -0
- package/dist/internal/connection-state.d.ts +13 -0
- package/dist/internal/connection-state.d.ts.map +1 -0
- package/dist/internal/connection-state.js +75 -0
- package/dist/internal/connection-state.js.map +1 -0
- package/dist/internal/diagnostics.d.ts +36 -0
- package/dist/internal/diagnostics.d.ts.map +1 -0
- package/dist/internal/diagnostics.js +51 -0
- package/dist/internal/diagnostics.js.map +1 -0
- package/dist/internal/event-subscription.d.ts +23 -0
- package/dist/internal/event-subscription.d.ts.map +1 -0
- package/dist/internal/event-subscription.js +62 -0
- package/dist/internal/event-subscription.js.map +1 -0
- package/dist/internal/heartbeat-controller.d.ts +27 -0
- package/dist/internal/heartbeat-controller.d.ts.map +1 -0
- package/dist/internal/heartbeat-controller.js +58 -0
- package/dist/internal/heartbeat-controller.js.map +1 -0
- package/dist/internal/operator-commands.d.ts +46 -0
- package/dist/internal/operator-commands.d.ts.map +1 -0
- package/dist/internal/operator-commands.js +93 -0
- package/dist/internal/operator-commands.js.map +1 -0
- package/dist/internal/operator-wire.d.ts +20 -0
- package/dist/internal/operator-wire.d.ts.map +1 -0
- package/dist/internal/operator-wire.js +33 -0
- package/dist/internal/operator-wire.js.map +1 -0
- package/dist/internal/origin-policy-errors.d.ts +22 -0
- package/dist/internal/origin-policy-errors.d.ts.map +1 -0
- package/dist/internal/origin-policy-errors.js +67 -0
- package/dist/internal/origin-policy-errors.js.map +1 -0
- package/dist/internal/pop-crypto.d.ts +23 -0
- package/dist/internal/pop-crypto.d.ts.map +1 -0
- package/dist/internal/pop-crypto.js +48 -0
- package/dist/internal/pop-crypto.js.map +1 -0
- package/dist/internal/pop-key-store.d.ts +28 -0
- package/dist/internal/pop-key-store.d.ts.map +1 -0
- package/dist/internal/pop-key-store.js +153 -0
- package/dist/internal/pop-key-store.js.map +1 -0
- package/dist/internal/product-commands.d.ts +33 -0
- package/dist/internal/product-commands.d.ts.map +1 -0
- package/dist/internal/product-commands.js +70 -0
- package/dist/internal/product-commands.js.map +1 -0
- package/dist/internal/product-inbound.d.ts +15 -0
- package/dist/internal/product-inbound.d.ts.map +1 -0
- package/dist/internal/product-inbound.js +31 -0
- package/dist/internal/product-inbound.js.map +1 -0
- package/dist/internal/product-orchestrator.d.ts +46 -0
- package/dist/internal/product-orchestrator.d.ts.map +1 -0
- package/dist/internal/product-orchestrator.js +188 -0
- package/dist/internal/product-orchestrator.js.map +1 -0
- package/dist/internal/product-wire.d.ts +29 -0
- package/dist/internal/product-wire.d.ts.map +1 -0
- package/dist/internal/product-wire.js +54 -0
- package/dist/internal/product-wire.js.map +1 -0
- package/dist/internal/public-event-map.d.ts +27 -0
- package/dist/internal/public-event-map.d.ts.map +1 -0
- package/dist/internal/public-event-map.js +38 -0
- package/dist/internal/public-event-map.js.map +1 -0
- package/dist/internal/reconnect-policy.d.ts +16 -0
- package/dist/internal/reconnect-policy.d.ts.map +1 -0
- package/dist/internal/reconnect-policy.js +23 -0
- package/dist/internal/reconnect-policy.js.map +1 -0
- package/dist/internal/request-correlator.d.ts +41 -0
- package/dist/internal/request-correlator.d.ts.map +1 -0
- package/dist/internal/request-correlator.js +130 -0
- package/dist/internal/request-correlator.js.map +1 -0
- package/dist/internal/requested-capabilities.d.ts +10 -0
- package/dist/internal/requested-capabilities.d.ts.map +1 -0
- package/dist/internal/requested-capabilities.js +25 -0
- package/dist/internal/requested-capabilities.js.map +1 -0
- package/dist/internal/scheduler.d.ts +41 -0
- package/dist/internal/scheduler.d.ts.map +1 -0
- package/dist/internal/scheduler.js +104 -0
- package/dist/internal/scheduler.js.map +1 -0
- package/dist/internal/session-identity.d.ts +16 -0
- package/dist/internal/session-identity.d.ts.map +1 -0
- package/dist/internal/session-identity.js +13 -0
- package/dist/internal/session-identity.js.map +1 -0
- package/dist/internal/snapshot-acquisition.d.ts +21 -0
- package/dist/internal/snapshot-acquisition.d.ts.map +1 -0
- package/dist/internal/snapshot-acquisition.js +40 -0
- package/dist/internal/snapshot-acquisition.js.map +1 -0
- package/dist/internal/snapshot-cache.d.ts +13 -0
- package/dist/internal/snapshot-cache.d.ts.map +1 -0
- package/dist/internal/snapshot-cache.js +18 -0
- package/dist/internal/snapshot-cache.js.map +1 -0
- package/dist/internal/transport-port.d.ts +34 -0
- package/dist/internal/transport-port.d.ts.map +1 -0
- package/dist/internal/transport-port.js +7 -0
- package/dist/internal/transport-port.js.map +1 -0
- package/dist/internal/window-commands.d.ts +23 -0
- package/dist/internal/window-commands.d.ts.map +1 -0
- package/dist/internal/window-commands.js +76 -0
- package/dist/internal/window-commands.js.map +1 -0
- package/dist/public/auth-client.d.ts +87 -0
- package/dist/public/auth-client.d.ts.map +1 -0
- package/dist/public/auth-client.js +116 -0
- package/dist/public/auth-client.js.map +1 -0
- package/dist/public/omnicall-client-api.d.ts +159 -0
- package/dist/public/omnicall-client-api.d.ts.map +1 -0
- package/dist/public/omnicall-client-api.js +5 -0
- package/dist/public/omnicall-client-api.js.map +1 -0
- package/dist/public/omnicall-client.d.ts +22 -0
- package/dist/public/omnicall-client.d.ts.map +1 -0
- package/dist/public/omnicall-client.js +171 -0
- package/dist/public/omnicall-client.js.map +1 -0
- package/dist/public/protocol-reexports.d.ts +41 -0
- package/dist/public/protocol-reexports.d.ts.map +1 -0
- package/dist/public/protocol-reexports.js +7 -0
- package/dist/public/protocol-reexports.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing + PoP orchestration composed onto ConnectionSession.
|
|
3
|
+
*/
|
|
4
|
+
import { PROTOCOL_MAX, PROTOCOL_MIN } from '@softomnitel/omnicall-protocol';
|
|
5
|
+
import { parseGrantedCapabilities } from './auth-grants.js';
|
|
6
|
+
import { challengeFromHello, parseInboundAuthMessage } from './auth-inbound.js';
|
|
7
|
+
import { completePopAuth, sendPairingRequest } from './auth-pop-flow.js';
|
|
8
|
+
import { buildClientHelloBody, isoNow } from './auth-wire.js';
|
|
9
|
+
import { createOriginDeniedError } from './origin-policy-errors.js';
|
|
10
|
+
import { generatePopKeyPair } from './pop-crypto.js';
|
|
11
|
+
import { sanitizeRequestedCapabilities } from './requested-capabilities.js';
|
|
12
|
+
export function createAuthOrchestrator(deps) {
|
|
13
|
+
const usedChallengeIds = new Set();
|
|
14
|
+
let identity;
|
|
15
|
+
let session;
|
|
16
|
+
let lastServerInstanceId;
|
|
17
|
+
let identityReady = Promise.resolve();
|
|
18
|
+
let helloInFlight = false;
|
|
19
|
+
let authInFlight = false;
|
|
20
|
+
let droppedPreauthCount = 0;
|
|
21
|
+
const requestedCapabilities = sanitizeRequestedCapabilities({
|
|
22
|
+
profile: deps.requestedProfile,
|
|
23
|
+
requested: deps.requestedCapabilities
|
|
24
|
+
});
|
|
25
|
+
const prepareConnect = async () => {
|
|
26
|
+
identityReady = deps.keyStore.load().then((loaded) => {
|
|
27
|
+
identity = loaded;
|
|
28
|
+
});
|
|
29
|
+
await identityReady;
|
|
30
|
+
};
|
|
31
|
+
const sendClientHello = async () => {
|
|
32
|
+
if (helloInFlight || deps.connection.getState() !== 'handshaking') {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
helloInFlight = true;
|
|
36
|
+
try {
|
|
37
|
+
await identityReady;
|
|
38
|
+
deps.connection.sendRaw(buildClientHelloBody({
|
|
39
|
+
sdkVersion: deps.sdkVersion,
|
|
40
|
+
application: deps.application,
|
|
41
|
+
clientId: identity?.clientId,
|
|
42
|
+
requestedCapabilities,
|
|
43
|
+
occurredAt: isoNow(deps.scheduler.now())
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
helloInFlight = false;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const ensureIdentityKeys = async () => {
|
|
51
|
+
await identityReady;
|
|
52
|
+
if (identity !== undefined) {
|
|
53
|
+
return identity;
|
|
54
|
+
}
|
|
55
|
+
const loaded = await deps.keyStore.load();
|
|
56
|
+
if (loaded !== undefined) {
|
|
57
|
+
identity = loaded;
|
|
58
|
+
return loaded;
|
|
59
|
+
}
|
|
60
|
+
const keys = await generatePopKeyPair();
|
|
61
|
+
const created = {
|
|
62
|
+
clientId: crypto.randomUUID(),
|
|
63
|
+
publicKeySpkiBase64Url: keys.publicKeySpkiBase64Url,
|
|
64
|
+
privateKey: keys.privateKey,
|
|
65
|
+
profile: undefined,
|
|
66
|
+
grantedCapabilities: []
|
|
67
|
+
};
|
|
68
|
+
await deps.keyStore.save(created);
|
|
69
|
+
identity = created;
|
|
70
|
+
return created;
|
|
71
|
+
};
|
|
72
|
+
const completeAuth = async (hello) => {
|
|
73
|
+
const challenge = challengeFromHello(hello);
|
|
74
|
+
if (challenge === undefined || authInFlight) {
|
|
75
|
+
if (challenge === undefined) {
|
|
76
|
+
deps.connection.signalFailed();
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
authInFlight = true;
|
|
81
|
+
try {
|
|
82
|
+
const keys = await ensureIdentityKeys();
|
|
83
|
+
const result = await completePopAuth({
|
|
84
|
+
connection: deps.connection,
|
|
85
|
+
origin: deps.origin,
|
|
86
|
+
hello,
|
|
87
|
+
keys,
|
|
88
|
+
scheduler: deps.scheduler,
|
|
89
|
+
usedChallengeIds
|
|
90
|
+
});
|
|
91
|
+
if (!result.ok) {
|
|
92
|
+
deps.connection.signalFailed();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
session = result.session;
|
|
96
|
+
lastServerInstanceId = hello.serverInstanceId;
|
|
97
|
+
deps.connection.signalReady(hello.heartbeatSeconds);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
authInFlight = false;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const handleServerHello = async (hello) => {
|
|
104
|
+
if (hello.selectedProtocolVersion < PROTOCOL_MIN ||
|
|
105
|
+
hello.selectedProtocolVersion > PROTOCOL_MAX) {
|
|
106
|
+
deps.connection.signalIncompatible();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (lastServerInstanceId !== undefined &&
|
|
110
|
+
lastServerInstanceId !== hello.serverInstanceId) {
|
|
111
|
+
usedChallengeIds.clear();
|
|
112
|
+
session = undefined;
|
|
113
|
+
}
|
|
114
|
+
if (hello.pairingRequired) {
|
|
115
|
+
const keys = await ensureIdentityKeys();
|
|
116
|
+
sendPairingRequest({
|
|
117
|
+
connection: deps.connection,
|
|
118
|
+
origin: deps.origin,
|
|
119
|
+
application: deps.application,
|
|
120
|
+
requestedProfile: deps.requestedProfile,
|
|
121
|
+
requestedCapabilities,
|
|
122
|
+
keys,
|
|
123
|
+
scheduler: deps.scheduler,
|
|
124
|
+
onPairingRequired: deps.onPairingRequired
|
|
125
|
+
});
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
await completeAuth(hello);
|
|
129
|
+
};
|
|
130
|
+
const handleInbound = async (raw) => {
|
|
131
|
+
const message = parseInboundAuthMessage(raw);
|
|
132
|
+
const state = deps.connection.getState();
|
|
133
|
+
if (message.kind === 'preauth_product') {
|
|
134
|
+
if (state !== 'ready') {
|
|
135
|
+
droppedPreauthCount += 1;
|
|
136
|
+
deps.diagnostics?.emit({
|
|
137
|
+
level: 'warn',
|
|
138
|
+
code: 'auth.preauth_drop',
|
|
139
|
+
connectionState: state
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (message.kind === 'incompatible') {
|
|
145
|
+
deps.connection.signalIncompatible();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (message.kind === 'server_hello') {
|
|
149
|
+
await handleServerHello(message.message);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (message.kind === 'pairing_pending') {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (message.kind === 'pairing_approved') {
|
|
156
|
+
const keys = await ensureIdentityKeys();
|
|
157
|
+
const updated = {
|
|
158
|
+
clientId: message.message.clientId,
|
|
159
|
+
publicKeySpkiBase64Url: keys.publicKeySpkiBase64Url,
|
|
160
|
+
privateKey: keys.privateKey,
|
|
161
|
+
profile: message.message.profile,
|
|
162
|
+
grantedCapabilities: [...message.message.grantedCapabilities]
|
|
163
|
+
};
|
|
164
|
+
await deps.keyStore.save(updated);
|
|
165
|
+
identity = updated;
|
|
166
|
+
deps.connection.requestReauth();
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (message.kind === 'pairing_denied') {
|
|
170
|
+
deps.connection.signalFailed();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (message.kind === 'origin_denied') {
|
|
174
|
+
deps.connection.signalOriginPolicyFailure(createOriginDeniedError());
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (message.kind === 'permission_changed') {
|
|
178
|
+
if (state !== 'ready' || session === undefined || identity === undefined) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const granted = parseGrantedCapabilities(message.grantedCapabilities);
|
|
182
|
+
if (granted === undefined) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
identity = { ...identity, grantedCapabilities: granted };
|
|
186
|
+
session = Object.freeze({
|
|
187
|
+
...session,
|
|
188
|
+
grantedCapabilities: Object.freeze([...granted])
|
|
189
|
+
});
|
|
190
|
+
await deps.keyStore.save(identity);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (message.kind === 'revoked') {
|
|
194
|
+
await deps.keyStore.clear();
|
|
195
|
+
identity = undefined;
|
|
196
|
+
session = undefined;
|
|
197
|
+
usedChallengeIds.clear();
|
|
198
|
+
deps.connection.signalRevoked();
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
return {
|
|
202
|
+
getSession: () => session,
|
|
203
|
+
getGrantedCapabilities: () => session?.grantedCapabilities ?? [],
|
|
204
|
+
preauthDropCount: () => droppedPreauthCount,
|
|
205
|
+
prepareConnect,
|
|
206
|
+
onHandshaking: () => {
|
|
207
|
+
void sendClientHello();
|
|
208
|
+
},
|
|
209
|
+
onUnhandledMessage: (raw) => {
|
|
210
|
+
void handleInbound(raw);
|
|
211
|
+
},
|
|
212
|
+
clearSession: () => {
|
|
213
|
+
session = undefined;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=auth-orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-orchestrator.js","sourceRoot":"","sources":["../../src/internal/auth-orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing request + PoP challenge completion helpers for AuthOrchestrator.
|
|
3
|
+
*/
|
|
4
|
+
import type { ApplicationIdentity, CapabilityId, PairingProfile, ServerHello } from '@softomnitel/omnicall-protocol';
|
|
5
|
+
import type { ConnectionSession } from './connection-session.js';
|
|
6
|
+
import type { StoredPopIdentity } from './pop-key-store.js';
|
|
7
|
+
import type { SessionIdentity } from './session-identity.js';
|
|
8
|
+
import type { Scheduler } from './scheduler.js';
|
|
9
|
+
export declare function sendPairingRequest(input: {
|
|
10
|
+
readonly connection: ConnectionSession;
|
|
11
|
+
readonly origin: string;
|
|
12
|
+
readonly application: ApplicationIdentity;
|
|
13
|
+
readonly requestedProfile: PairingProfile;
|
|
14
|
+
readonly requestedCapabilities: readonly CapabilityId[];
|
|
15
|
+
readonly keys: StoredPopIdentity;
|
|
16
|
+
readonly scheduler: Scheduler;
|
|
17
|
+
readonly onPairingRequired: (info: {
|
|
18
|
+
readonly origin: string;
|
|
19
|
+
readonly requestedProfile: PairingProfile;
|
|
20
|
+
readonly clientId: string | undefined;
|
|
21
|
+
}) => void;
|
|
22
|
+
}): void;
|
|
23
|
+
export type CompletePopAuthResult = {
|
|
24
|
+
readonly ok: true;
|
|
25
|
+
readonly session: SessionIdentity;
|
|
26
|
+
} | {
|
|
27
|
+
readonly ok: false;
|
|
28
|
+
readonly reason: 'no_challenge' | 'replay' | 'ping_failed';
|
|
29
|
+
};
|
|
30
|
+
export declare function completePopAuth(input: {
|
|
31
|
+
readonly connection: ConnectionSession;
|
|
32
|
+
readonly origin: string;
|
|
33
|
+
readonly hello: ServerHello;
|
|
34
|
+
readonly keys: StoredPopIdentity;
|
|
35
|
+
readonly scheduler: Scheduler;
|
|
36
|
+
readonly usedChallengeIds: Set<string>;
|
|
37
|
+
}): Promise<CompletePopAuthResult>;
|
|
38
|
+
//# sourceMappingURL=auth-pop-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-pop-flow.d.ts","sourceRoot":"","sources":["../../src/internal/auth-pop-flow.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,WAAW,EACZ,MAAM,gCAAgC,CAAC;AASxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,SAAS,YAAY,EAAE,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE;QACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;QAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;KACvC,KAAK,IAAI,CAAC;CACZ,GAAG,IAAI,CAiBP;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAA;CAAE,CAAC;AAEvF,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACxC,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0DjC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing request + PoP challenge completion helpers for AuthOrchestrator.
|
|
3
|
+
*/
|
|
4
|
+
import { buildAuthProofBody, buildPairingRequestBody, buildPingBody, isoNow } from './auth-wire.js';
|
|
5
|
+
import { challengeFromHello } from './auth-inbound.js';
|
|
6
|
+
import { signPopChallenge } from './pop-crypto.js';
|
|
7
|
+
export function sendPairingRequest(input) {
|
|
8
|
+
input.connection.signalPairingRequired();
|
|
9
|
+
input.onPairingRequired({
|
|
10
|
+
origin: input.origin,
|
|
11
|
+
requestedProfile: input.requestedProfile,
|
|
12
|
+
clientId: input.keys.clientId
|
|
13
|
+
});
|
|
14
|
+
input.connection.sendRaw(buildPairingRequestBody({
|
|
15
|
+
clientId: input.keys.clientId,
|
|
16
|
+
publicKeySpkiBase64Url: input.keys.publicKeySpkiBase64Url,
|
|
17
|
+
application: input.application,
|
|
18
|
+
requestedProfile: input.requestedProfile,
|
|
19
|
+
requestedCapabilities: input.requestedCapabilities,
|
|
20
|
+
occurredAt: isoNow(input.scheduler.now())
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
export async function completePopAuth(input) {
|
|
24
|
+
const challenge = challengeFromHello(input.hello);
|
|
25
|
+
if (challenge === undefined) {
|
|
26
|
+
return { ok: false, reason: 'no_challenge' };
|
|
27
|
+
}
|
|
28
|
+
if (input.usedChallengeIds.has(challenge.challengeId)) {
|
|
29
|
+
return { ok: false, reason: 'replay' };
|
|
30
|
+
}
|
|
31
|
+
input.usedChallengeIds.add(challenge.challengeId);
|
|
32
|
+
input.connection.signalAuthenticating();
|
|
33
|
+
const signature = await signPopChallenge({
|
|
34
|
+
privateKey: input.keys.privateKey,
|
|
35
|
+
serverInstanceId: input.hello.serverInstanceId,
|
|
36
|
+
sessionEpoch: input.hello.sessionEpoch,
|
|
37
|
+
origin: input.origin,
|
|
38
|
+
clientId: input.keys.clientId,
|
|
39
|
+
challengeId: challenge.challengeId,
|
|
40
|
+
nonce: challenge.nonce
|
|
41
|
+
});
|
|
42
|
+
input.connection.sendRaw(buildAuthProofBody({
|
|
43
|
+
challengeId: challenge.challengeId,
|
|
44
|
+
clientId: input.keys.clientId,
|
|
45
|
+
signature,
|
|
46
|
+
occurredAt: isoNow(input.scheduler.now())
|
|
47
|
+
}));
|
|
48
|
+
input.connection.setWireIdentity({
|
|
49
|
+
serverInstanceId: input.hello.serverInstanceId,
|
|
50
|
+
sessionEpoch: input.hello.sessionEpoch
|
|
51
|
+
});
|
|
52
|
+
const requestId = `auth_ping_${input.scheduler.now()}`;
|
|
53
|
+
const pingResult = await input.connection.request({
|
|
54
|
+
requestId,
|
|
55
|
+
commandType: 'sdk:ping',
|
|
56
|
+
body: buildPingBody({
|
|
57
|
+
requestId,
|
|
58
|
+
serverInstanceId: input.hello.serverInstanceId,
|
|
59
|
+
sessionEpoch: input.hello.sessionEpoch,
|
|
60
|
+
occurredAt: isoNow(input.scheduler.now())
|
|
61
|
+
})
|
|
62
|
+
});
|
|
63
|
+
if (!pingResult.ok) {
|
|
64
|
+
return { ok: false, reason: 'ping_failed' };
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
ok: true,
|
|
68
|
+
session: Object.freeze({
|
|
69
|
+
serverInstanceId: input.hello.serverInstanceId,
|
|
70
|
+
sessionEpoch: input.hello.sessionEpoch,
|
|
71
|
+
selectedProtocolVersion: input.hello.selectedProtocolVersion,
|
|
72
|
+
clientId: input.keys.clientId,
|
|
73
|
+
profile: input.keys.profile,
|
|
74
|
+
grantedCapabilities: Object.freeze([...input.keys.grantedCapabilities]),
|
|
75
|
+
heartbeatSeconds: input.hello.heartbeatSeconds,
|
|
76
|
+
maxMessageBytes: input.hello.maxMessageBytes
|
|
77
|
+
})
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=auth-pop-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-pop-flow.js","sourceRoot":"","sources":["../../src/internal/auth-pop-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth/pairing/handshake wire builders. Schemas from @softomnitel/omnicall-protocol.
|
|
3
|
+
*/
|
|
4
|
+
import { type ApplicationIdentity, type AuthChallenge, type CapabilityId, type PairingProfile, type ServerHello } from '@softomnitel/omnicall-protocol';
|
|
5
|
+
export declare function buildClientHelloBody(input: {
|
|
6
|
+
readonly sdkVersion: string;
|
|
7
|
+
readonly application: ApplicationIdentity;
|
|
8
|
+
readonly clientId: string | undefined;
|
|
9
|
+
readonly requestedCapabilities: readonly CapabilityId[];
|
|
10
|
+
readonly occurredAt: string;
|
|
11
|
+
}): string;
|
|
12
|
+
export declare function buildPairingRequestBody(input: {
|
|
13
|
+
readonly clientId: string;
|
|
14
|
+
readonly publicKeySpkiBase64Url: string;
|
|
15
|
+
readonly application: ApplicationIdentity;
|
|
16
|
+
readonly requestedProfile: PairingProfile;
|
|
17
|
+
readonly requestedCapabilities: readonly CapabilityId[];
|
|
18
|
+
readonly occurredAt: string;
|
|
19
|
+
}): string;
|
|
20
|
+
export declare function buildAuthProofBody(input: {
|
|
21
|
+
readonly challengeId: string;
|
|
22
|
+
readonly clientId: string;
|
|
23
|
+
readonly signature: string;
|
|
24
|
+
readonly occurredAt: string;
|
|
25
|
+
}): string;
|
|
26
|
+
export declare function buildPingBody(input: {
|
|
27
|
+
readonly requestId: string;
|
|
28
|
+
readonly serverInstanceId: string;
|
|
29
|
+
readonly sessionEpoch: string;
|
|
30
|
+
readonly occurredAt: string;
|
|
31
|
+
}): string;
|
|
32
|
+
export declare function isoNow(epochMs: number): string;
|
|
33
|
+
export type NegotiatedServerHello = {
|
|
34
|
+
readonly hello: ServerHello;
|
|
35
|
+
readonly challenge: AuthChallenge | undefined;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=auth-wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-wire.d.ts","sourceRoot":"","sources":["../../src/internal/auth-wire.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,gCAAgC,CAAC;AAKxC,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,YAAY,EAAE,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAcT;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,SAAS,YAAY,EAAE,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAaT;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAUT;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAWT;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,aAAa,GAAG,SAAS,CAAC;CAC/C,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth/pairing/handshake wire builders. Schemas from @softomnitel/omnicall-protocol.
|
|
3
|
+
*/
|
|
4
|
+
import { PROTOCOL_MAJOR, PROTOCOL_MAX, PROTOCOL_MIN } from '@softomnitel/omnicall-protocol';
|
|
5
|
+
import { randomBase64Url } from './base64url.js';
|
|
6
|
+
import { popKeyAlgorithmId } from './pop-crypto.js';
|
|
7
|
+
export function buildClientHelloBody(input) {
|
|
8
|
+
return JSON.stringify({
|
|
9
|
+
protocolVersion: PROTOCOL_MAJOR,
|
|
10
|
+
kind: 'handshake',
|
|
11
|
+
type: 'sdk:client-hello',
|
|
12
|
+
protocolMin: PROTOCOL_MIN,
|
|
13
|
+
protocolMax: PROTOCOL_MAX,
|
|
14
|
+
sdkVersion: input.sdkVersion,
|
|
15
|
+
application: input.application,
|
|
16
|
+
...(input.clientId !== undefined ? { clientId: input.clientId } : {}),
|
|
17
|
+
requestedCapabilities: [...input.requestedCapabilities],
|
|
18
|
+
clientNonce: randomBase64Url(16),
|
|
19
|
+
occurredAt: input.occurredAt
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function buildPairingRequestBody(input) {
|
|
23
|
+
return JSON.stringify({
|
|
24
|
+
protocolVersion: PROTOCOL_MAJOR,
|
|
25
|
+
kind: 'pairing',
|
|
26
|
+
type: 'pairing:request',
|
|
27
|
+
clientId: input.clientId,
|
|
28
|
+
clientPublicKey: input.publicKeySpkiBase64Url,
|
|
29
|
+
keyAlgorithm: popKeyAlgorithmId(),
|
|
30
|
+
application: input.application,
|
|
31
|
+
requestedProfile: input.requestedProfile,
|
|
32
|
+
requestedCapabilities: [...input.requestedCapabilities],
|
|
33
|
+
occurredAt: input.occurredAt
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function buildAuthProofBody(input) {
|
|
37
|
+
return JSON.stringify({
|
|
38
|
+
protocolVersion: PROTOCOL_MAJOR,
|
|
39
|
+
kind: 'auth',
|
|
40
|
+
type: 'sdk:auth-proof',
|
|
41
|
+
challengeId: input.challengeId,
|
|
42
|
+
clientId: input.clientId,
|
|
43
|
+
signature: input.signature,
|
|
44
|
+
occurredAt: input.occurredAt
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export function buildPingBody(input) {
|
|
48
|
+
return JSON.stringify({
|
|
49
|
+
protocolVersion: PROTOCOL_MAJOR,
|
|
50
|
+
kind: 'command',
|
|
51
|
+
type: 'sdk:ping',
|
|
52
|
+
requestId: input.requestId,
|
|
53
|
+
serverInstanceId: input.serverInstanceId,
|
|
54
|
+
sessionEpoch: input.sessionEpoch,
|
|
55
|
+
occurredAt: input.occurredAt,
|
|
56
|
+
payload: {}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function isoNow(epochMs) {
|
|
60
|
+
return new Date(epochMs).toISOString();
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=auth-wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-wire.js","sourceRoot":"","sources":["../../src/internal/auth-wire.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,YAAY,EAMb,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,KAMpC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,qBAAqB,EAAE,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC;QACvD,WAAW,EAAE,eAAe,CAAC,EAAE,CAAC;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAOvC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,iBAAiB;QACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,sBAAsB;QAC7C,YAAY,EAAE,iBAAiB,EAAE;QACjC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,qBAAqB,EAAE,CAAC,GAAG,KAAK,CAAC,qBAAqB,CAAC;QACvD,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAKlC;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAK7B;IACC,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,eAAe,EAAE,cAAc;QAC/B,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,EAAE;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base64url helpers for PoP wire fields (ADR-0016).
|
|
3
|
+
*/
|
|
4
|
+
export declare function bytesToBase64Url(bytes: ArrayBuffer | Uint8Array): string;
|
|
5
|
+
export declare function base64UrlToBytes(value: string): Uint8Array;
|
|
6
|
+
export declare function randomBase64Url(byteLength: number): string;
|
|
7
|
+
//# sourceMappingURL=base64url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64url.d.ts","sourceRoot":"","sources":["../../src/internal/base64url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,MAAM,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAU1D;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI1D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base64url helpers for PoP wire fields (ADR-0016).
|
|
3
|
+
*/
|
|
4
|
+
export function bytesToBase64Url(bytes) {
|
|
5
|
+
const view = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
6
|
+
let binary = '';
|
|
7
|
+
for (let index = 0; index < view.length; index += 1) {
|
|
8
|
+
binary += String.fromCharCode(view[index]);
|
|
9
|
+
}
|
|
10
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/u, '');
|
|
11
|
+
}
|
|
12
|
+
export function base64UrlToBytes(value) {
|
|
13
|
+
const padded = value.replace(/-/g, '+').replace(/_/g, '/');
|
|
14
|
+
const padLength = (4 - (padded.length % 4)) % 4;
|
|
15
|
+
const withPad = padded + '='.repeat(padLength);
|
|
16
|
+
const binary = atob(withPad);
|
|
17
|
+
const out = new Uint8Array(binary.length);
|
|
18
|
+
for (let index = 0; index < binary.length; index += 1) {
|
|
19
|
+
out[index] = binary.charCodeAt(index);
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
export function randomBase64Url(byteLength) {
|
|
24
|
+
const bytes = new Uint8Array(byteLength);
|
|
25
|
+
crypto.getRandomValues(bytes);
|
|
26
|
+
return bytesToBase64Url(bytes);
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=base64url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64url.js","sourceRoot":"","sources":["../../src/internal/base64url.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,gBAAgB,CAAC,KAA+B;IAC9D,MAAM,IAAI,GAAG,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACzE,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Official browser WebSocket adapter for {@link TransportPort}.
|
|
3
|
+
* Protocol / reconnect / auth stay in the connection session — this is bytes only.
|
|
4
|
+
*/
|
|
5
|
+
import type { TransportPort } from './transport-port.js';
|
|
6
|
+
/** Minimal WebSocket surface used by the adapter (browser or injectable test double). @public */
|
|
7
|
+
export type BrowserWebSocketLike = {
|
|
8
|
+
readonly readyState: number;
|
|
9
|
+
binaryType: string;
|
|
10
|
+
onopen: ((ev: Event) => void) | null;
|
|
11
|
+
onmessage: ((ev: MessageEvent) => void) | null;
|
|
12
|
+
onerror: ((ev: Event) => void) | null;
|
|
13
|
+
onclose: ((ev: CloseEvent) => void) | null;
|
|
14
|
+
send: (data: string) => void;
|
|
15
|
+
close: (code?: number, reason?: string) => void;
|
|
16
|
+
};
|
|
17
|
+
/** Constructor shape compatible with `globalThis.WebSocket`. @public */
|
|
18
|
+
export type BrowserWebSocketConstructor = {
|
|
19
|
+
new (url: string): BrowserWebSocketLike;
|
|
20
|
+
readonly OPEN: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Options for {@link createBrowserWebSocketTransport}.
|
|
24
|
+
* @public
|
|
25
|
+
*/
|
|
26
|
+
export type CreateBrowserWebSocketTransportOptions = {
|
|
27
|
+
/** Inject a WebSocket constructor (tests). Defaults to `globalThis.WebSocket`. */
|
|
28
|
+
readonly webSocket?: BrowserWebSocketConstructor;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Create one browser WebSocket transport instance.
|
|
32
|
+
* Call once per connect/reconnect attempt (via `transportFactory`).
|
|
33
|
+
* @public
|
|
34
|
+
*/
|
|
35
|
+
export declare function createBrowserWebSocketTransport(options?: CreateBrowserWebSocketTransportOptions): TransportPort;
|
|
36
|
+
//# sourceMappingURL=browser-websocket-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-websocket-transport.d.ts","sourceRoot":"","sources":["../../src/internal/browser-websocket-transport.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAGV,aAAa,EACd,MAAM,qBAAqB,CAAC;AAI7B,iGAAiG;AACjG,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,wEAAwE;AACxE,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,sCAAsC,GAAG;IACnD,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,2BAA2B,CAAC;CAClD,CAAC;AAyDF;;;;GAIG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,CAAC,EAAE,sCAAsC,GAC/C,aAAa,CA4Ff"}
|