@vex-chat/spire 2.3.3 → 2.4.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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/CallManager.d.ts +38 -0
  3. package/dist/CallManager.js +243 -0
  4. package/dist/CallManager.js.map +1 -0
  5. package/dist/ClientManager.d.ts +3 -1
  6. package/dist/ClientManager.js +23 -2
  7. package/dist/ClientManager.js.map +1 -1
  8. package/dist/IceServers.d.ts +7 -0
  9. package/dist/IceServers.js +143 -0
  10. package/dist/IceServers.js.map +1 -0
  11. package/dist/NotificationService.js +4 -0
  12. package/dist/NotificationService.js.map +1 -1
  13. package/dist/Spire.d.ts +1 -0
  14. package/dist/Spire.js +16 -1
  15. package/dist/Spire.js.map +1 -1
  16. package/dist/server/cliPasskeyPage.d.ts +7 -0
  17. package/dist/server/cliPasskeyPage.js +504 -0
  18. package/dist/server/cliPasskeyPage.js.map +1 -0
  19. package/dist/server/index.js +5 -0
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/passkey.js +9 -9
  22. package/dist/server/passkey.js.map +1 -1
  23. package/dist/server/passkeyDevices.js +3 -3
  24. package/dist/server/passkeyDevices.js.map +1 -1
  25. package/dist/server/wireResponse.d.ts +12 -0
  26. package/dist/server/wireResponse.js +19 -0
  27. package/dist/server/wireResponse.js.map +1 -0
  28. package/package.json +5 -4
  29. package/src/CallManager.ts +370 -0
  30. package/src/ClientManager.ts +26 -1
  31. package/src/IceServers.ts +185 -0
  32. package/src/NotificationService.ts +2 -0
  33. package/src/Spire.ts +21 -0
  34. package/src/__tests__/CallManager.spec.ts +208 -0
  35. package/src/__tests__/IceServers.spec.ts +151 -0
  36. package/src/__tests__/cliPasskeyPage.spec.ts +53 -0
  37. package/src/__tests__/wireResponse.spec.ts +46 -0
  38. package/src/server/cliPasskeyPage.ts +510 -0
  39. package/src/server/index.ts +7 -0
  40. package/src/server/passkey.ts +16 -22
  41. package/src/server/passkeyDevices.ts +3 -4
  42. package/src/server/wireResponse.ts +26 -0
package/README.md CHANGED
@@ -83,7 +83,7 @@ Spire reads configuration from environment variables. **Docker Compose:** put th
83
83
 
84
84
  ### Passkeys / WebAuthn
85
85
 
86
- The `/auth/passkey/*`, `/user/:id/passkeys/*`, and `/passkey/*` routes are gated on `SPIRE_PASSKEY_RP_ID` and `SPIRE_PASSKEY_ORIGINS`; without them those endpoints return `500 Passkeys are not configured`. See [`.env.example`](./.env.example) for the full set, including the optional `SPIRE_PASSKEY_IOS_APP_IDS`, `SPIRE_PASSKEY_ANDROID_PACKAGE`, and `SPIRE_PASSKEY_ANDROID_FINGERPRINTS` triple that makes spire serve the WebAuthn well-known association files (`/.well-known/apple-app-site-association`, `/.well-known/assetlinks.json`) directly. Those endpoints 404 when their env vars aren't set, so a non-passkey deployment is indistinguishable from one that hasn't enrolled an app.
86
+ The `/auth/passkey/*`, `/user/:id/passkeys/*`, and `/passkey/*` routes are gated on `SPIRE_PASSKEY_RP_ID` and `SPIRE_PASSKEY_ORIGINS`; without them those endpoints return `500 Passkeys are not configured`. Spire also serves the CLI WebAuthn bridge at `/cli/passkey`, which should be loaded from an origin listed in `SPIRE_PASSKEY_ORIGINS` so browser passkey ceremonies verify against the same RP config as native clients. See [`.env.example`](./.env.example) for the full set, including the optional `SPIRE_PASSKEY_IOS_APP_IDS`, `SPIRE_PASSKEY_ANDROID_PACKAGE`, and `SPIRE_PASSKEY_ANDROID_FINGERPRINTS` triple that makes spire serve the WebAuthn well-known association files (`/.well-known/apple-app-site-association`, `/.well-known/assetlinks.json`) directly. Those endpoints 404 when their env vars aren't set, so a non-passkey deployment is indistinguishable from one that hasn't enrolled an app.
87
87
 
88
88
  The same `SPIRE_PASSKEY_ANDROID_FINGERPRINTS` value is reused by `getRpConfig()` to derive `android:apk-key-hash:<base64url>` entries, which it merges into the WebAuthn `expectedOrigin` allowlist. Native Android Credential Manager sets `clientDataJSON.origin` to that string instead of the RP host, so without those entries simplewebauthn rejects every native-Android assertion at the origin check (the mobile UI surfaces this as a generic "RP failed" error). Operators only have to publish the cert fingerprints; the base64url math is handled server-side.
89
89
 
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) 2020-2026 Vex Heavy Industries LLC
3
+ * Licensed under AGPL-3.0. See LICENSE for details.
4
+ * Commercial licenses available at vex.wtf
5
+ */
6
+ import type { Database } from "./Database.ts";
7
+ import type { CallEvent, CallSession, Device, User } from "@vex-chat/types";
8
+ interface Actor {
9
+ device: Device;
10
+ user: User;
11
+ }
12
+ type NotifyFn = (userID: string, event: string, transmissionID: string, data?: unknown, deviceID?: string, headlessPushUserID?: string) => void;
13
+ export declare class CallManager {
14
+ private readonly calls;
15
+ private readonly db;
16
+ private readonly notify;
17
+ constructor(db: Database, notify: NotifyFn);
18
+ activeCallsForUser(userID: string): CallSession[];
19
+ handleResource(args: {
20
+ action: string;
21
+ actor: Actor;
22
+ data: unknown;
23
+ transmissionID: string;
24
+ }): Promise<CallEvent>;
25
+ private accept;
26
+ private clearExpiry;
27
+ private endCall;
28
+ private event;
29
+ private invite;
30
+ private notifyParticipants;
31
+ private pruneExpired;
32
+ private requireExistingCall;
33
+ private requireParticipant;
34
+ private scheduleExpiry;
35
+ private signal;
36
+ private timeout;
37
+ }
38
+ export {};
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Copyright (c) 2020-2026 Vex Heavy Industries LLC
3
+ * Licensed under AGPL-3.0. See LICENSE for details.
4
+ * Commercial licenses available at vex.wtf
5
+ */
6
+ import { CallResourceDataSchema } from "@vex-chat/types";
7
+ const CALL_INVITE_TTL_MS = 60_000;
8
+ const CALL_MAX_TTL_MS = 2 * 60 * 60 * 1000;
9
+ export class CallManager {
10
+ calls = new Map();
11
+ db;
12
+ notify;
13
+ constructor(db, notify) {
14
+ this.db = db;
15
+ this.notify = notify;
16
+ }
17
+ activeCallsForUser(userID) {
18
+ this.pruneExpired();
19
+ const calls = [];
20
+ for (const call of this.calls.values()) {
21
+ if (call.session.status !== "ended" &&
22
+ call.session.participants.some((p) => p.userID === userID)) {
23
+ calls.push(cloneCallSession(call.session));
24
+ }
25
+ }
26
+ return calls;
27
+ }
28
+ async handleResource(args) {
29
+ this.pruneExpired();
30
+ const action = normalizeAction(args.action);
31
+ const parsed = CallResourceDataSchema.safeParse(args.data);
32
+ if (!parsed.success) {
33
+ throw new Error("Invalid call payload: " + JSON.stringify(parsed.error.issues));
34
+ }
35
+ switch (action) {
36
+ case "accept":
37
+ return this.accept(args.actor, parsed.data, args.transmissionID);
38
+ case "cancel":
39
+ case "hangup":
40
+ case "reject":
41
+ return this.endCall(action, args.actor, parsed.data, args.transmissionID);
42
+ case "ice":
43
+ case "signal":
44
+ return this.signal(action, args.actor, parsed.data, args.transmissionID);
45
+ case "invite":
46
+ return this.invite(args.actor, parsed.data, args.transmissionID);
47
+ case "end":
48
+ case "timeout":
49
+ throw new Error("Call action is server-owned: " + action);
50
+ default:
51
+ action;
52
+ throw new Error("Unsupported call action.");
53
+ }
54
+ }
55
+ accept(actor, data, transmissionID) {
56
+ const call = this.requireExistingCall(data);
57
+ this.requireParticipant(call.session, actor.user.userID);
58
+ if (call.session.status === "ended") {
59
+ throw new Error("Call has already ended.");
60
+ }
61
+ const now = new Date().toISOString();
62
+ call.session.status = "active";
63
+ call.session.expiresAt = new Date(Date.now() + CALL_MAX_TTL_MS).toISOString();
64
+ call.session.participants = call.session.participants.map((p) => p.userID === actor.user.userID
65
+ ? {
66
+ ...p,
67
+ acceptedAt: p.acceptedAt ?? now,
68
+ deviceID: actor.device.deviceID,
69
+ joinedAt: p.joinedAt ?? now,
70
+ state: "accepted",
71
+ }
72
+ : p);
73
+ this.scheduleExpiry(call, CALL_MAX_TTL_MS);
74
+ const event = this.event("accept", call.session, actor, data.signal);
75
+ this.notifyParticipants(call.session, "call", transmissionID, event);
76
+ return event;
77
+ }
78
+ clearExpiry(call) {
79
+ if (call.timeout) {
80
+ clearTimeout(call.timeout);
81
+ delete call.timeout;
82
+ }
83
+ }
84
+ endCall(action, actor, data, transmissionID) {
85
+ const call = this.requireExistingCall(data);
86
+ this.requireParticipant(call.session, actor.user.userID);
87
+ const now = new Date().toISOString();
88
+ call.session.status = "ended";
89
+ call.session.endedAt = now;
90
+ call.session.participants = call.session.participants.map((p) => p.userID === actor.user.userID
91
+ ? {
92
+ ...p,
93
+ leftAt: p.leftAt ?? now,
94
+ state: action === "reject" ? "rejected" : "left",
95
+ }
96
+ : p);
97
+ this.clearExpiry(call);
98
+ this.calls.delete(call.session.callID);
99
+ const event = this.event(action, call.session, actor, data.signal);
100
+ this.notifyParticipants(call.session, "call", transmissionID, event);
101
+ return event;
102
+ }
103
+ event(action, session, actor, signal) {
104
+ return {
105
+ action,
106
+ call: cloneCallSession(session),
107
+ fromDeviceID: actor.device.deviceID,
108
+ fromUserID: actor.user.userID,
109
+ ...(signal ? { signal } : {}),
110
+ };
111
+ }
112
+ async invite(actor, data, transmissionID) {
113
+ if (!("conversationType" in data)) {
114
+ throw new Error("Only one-to-one voice calls are supported.");
115
+ }
116
+ const recipient = await this.db.retrieveUser(data.recipientUserID);
117
+ if (!recipient) {
118
+ throw new Error("Call recipient not found.");
119
+ }
120
+ const now = new Date();
121
+ const call = {
122
+ session: {
123
+ callID: crypto.randomUUID(),
124
+ conversationID: recipient.userID,
125
+ conversationType: "dm",
126
+ createdAt: now.toISOString(),
127
+ createdBy: actor.user.userID,
128
+ createdByDeviceID: actor.device.deviceID,
129
+ expiresAt: new Date(now.getTime() + CALL_INVITE_TTL_MS).toISOString(),
130
+ media: "audio",
131
+ participants: [
132
+ {
133
+ acceptedAt: now.toISOString(),
134
+ deviceID: actor.device.deviceID,
135
+ joinedAt: now.toISOString(),
136
+ state: "accepted",
137
+ userID: actor.user.userID,
138
+ },
139
+ {
140
+ state: "ringing",
141
+ userID: recipient.userID,
142
+ },
143
+ ],
144
+ status: "ringing",
145
+ },
146
+ };
147
+ this.calls.set(call.session.callID, call);
148
+ this.scheduleExpiry(call, CALL_INVITE_TTL_MS);
149
+ const event = this.event("invite", call.session, actor, data.signal);
150
+ this.notify(recipient.userID, "callInvite", transmissionID, event);
151
+ return event;
152
+ }
153
+ notifyParticipants(session, event, transmissionID, data) {
154
+ for (const userID of new Set(session.participants.map((p) => p.userID))) {
155
+ this.notify(userID, event, transmissionID, data);
156
+ }
157
+ }
158
+ pruneExpired() {
159
+ const now = Date.now();
160
+ for (const call of [...this.calls.values()]) {
161
+ if (Date.parse(call.session.expiresAt) <= now) {
162
+ this.timeout(call);
163
+ }
164
+ }
165
+ }
166
+ requireExistingCall(data) {
167
+ if (!("callID" in data)) {
168
+ throw new Error("callID is required for this action.");
169
+ }
170
+ const call = this.calls.get(data.callID);
171
+ if (!call) {
172
+ throw new Error("Call not found.");
173
+ }
174
+ return call;
175
+ }
176
+ requireParticipant(session, userID) {
177
+ if (!session.participants.some((p) => p.userID === userID)) {
178
+ throw new Error("You are not a participant in this call.");
179
+ }
180
+ }
181
+ scheduleExpiry(call, ttlMs) {
182
+ this.clearExpiry(call);
183
+ call.timeout = setTimeout(() => {
184
+ this.timeout(call);
185
+ }, ttlMs);
186
+ call.timeout.unref();
187
+ }
188
+ signal(action, actor, data, transmissionID) {
189
+ const call = this.requireExistingCall(data);
190
+ this.requireParticipant(call.session, actor.user.userID);
191
+ if (!("signal" in data) || !data.signal) {
192
+ throw new Error("signal is required.");
193
+ }
194
+ const event = this.event(action, call.session, actor, data.signal);
195
+ this.notifyParticipants(call.session, "call", transmissionID, event);
196
+ return event;
197
+ }
198
+ timeout(call) {
199
+ if (!this.calls.has(call.session.callID)) {
200
+ return;
201
+ }
202
+ const now = new Date().toISOString();
203
+ call.session.status = "ended";
204
+ call.session.endedAt = now;
205
+ call.session.participants = call.session.participants.map((p) => p.state === "ringing" ? { ...p, leftAt: now, state: "left" } : p);
206
+ this.calls.delete(call.session.callID);
207
+ this.clearExpiry(call);
208
+ const event = {
209
+ action: "timeout",
210
+ call: cloneCallSession(call.session),
211
+ fromDeviceID: call.session.createdByDeviceID,
212
+ fromUserID: call.session.createdBy,
213
+ };
214
+ this.notifyParticipants(call.session, "call", crypto.randomUUID(), event);
215
+ }
216
+ }
217
+ function cloneCallSession(session) {
218
+ return {
219
+ ...session,
220
+ participants: session.participants.map((p) => ({ ...p })),
221
+ };
222
+ }
223
+ function normalizeAction(action) {
224
+ switch (action.toLowerCase()) {
225
+ case "accept":
226
+ return "accept";
227
+ case "cancel":
228
+ return "cancel";
229
+ case "hangup":
230
+ return "hangup";
231
+ case "ice":
232
+ return "ice";
233
+ case "invite":
234
+ return "invite";
235
+ case "reject":
236
+ return "reject";
237
+ case "signal":
238
+ return "signal";
239
+ default:
240
+ throw new Error("Unsupported call action: " + action);
241
+ }
242
+ }
243
+ //# sourceMappingURL=CallManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallManager.js","sourceRoot":"","sources":["../src/CallManager.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  * Licensed under AGPL-3.0. See LICENSE for details.
4
4
  * Commercial licenses available at vex.wtf
5
5
  */
6
+ import type { CallManager } from "./CallManager.ts";
6
7
  import type { Database } from "./Database.ts";
7
8
  import type { BaseMsg, Device, User, UserRecord } from "@vex-chat/types";
8
9
  import type WebSocket from "ws";
@@ -16,6 +17,7 @@ export declare const POWER_LEVELS: {
16
17
  export declare class ClientManager extends EventEmitter {
17
18
  private alive;
18
19
  private authed;
20
+ private callManager;
19
21
  private challengeID;
20
22
  private conn;
21
23
  private db;
@@ -25,7 +27,7 @@ export declare class ClientManager extends EventEmitter {
25
27
  private notify;
26
28
  private user;
27
29
  private userDetails;
28
- constructor(ws: WebSocket, db: Database, notify: (userID: string, event: string, transmissionID: string, data?: unknown, deviceID?: string, headlessPushUserID?: string, mailNonce?: Uint8Array) => void, userDetails: User);
30
+ constructor(ws: WebSocket, db: Database, callManager: CallManager, notify: (userID: string, event: string, transmissionID: string, data?: unknown, deviceID?: string, headlessPushUserID?: string, mailNonce?: Uint8Array) => void, userDetails: User);
29
31
  disconnect(): void;
30
32
  getDevice(): Device;
31
33
  getDeviceID(): null | string;
@@ -22,7 +22,9 @@ export const POWER_LEVELS = {
22
22
  function emptyHeader() {
23
23
  return new Uint8Array(32);
24
24
  }
25
- const MAX_MSG_SIZE = 2048;
25
+ // WebRTC SDP offers/answers are commonly several KB before encryption/packing.
26
+ // Keep this well below HTTP body limits while allowing first-party call signals.
27
+ const MAX_MSG_SIZE = 64 * 1024;
26
28
  // How many ping cycles in a row are allowed to go without a pong
27
29
  // before we declare the connection dead. With a 5s ping interval
28
30
  // this gives ~15s of grace, which is enough to absorb a normal
@@ -44,6 +46,7 @@ const PING_INTERVAL_MS = 5000;
44
46
  export class ClientManager extends EventEmitter {
45
47
  alive = true;
46
48
  authed = false;
49
+ callManager;
47
50
  challengeID = createUint8UUID();
48
51
  conn;
49
52
  db;
@@ -53,10 +56,11 @@ export class ClientManager extends EventEmitter {
53
56
  notify;
54
57
  user;
55
58
  userDetails;
56
- constructor(ws, db, notify, userDetails) {
59
+ constructor(ws, db, callManager, notify, userDetails) {
57
60
  super();
58
61
  this.conn = ws;
59
62
  this.db = db;
63
+ this.callManager = callManager;
60
64
  this.user = null;
61
65
  this.userDetails = userDetails;
62
66
  this.device = null;
@@ -207,6 +211,23 @@ export class ClientManager extends EventEmitter {
207
211
  }
208
212
  async parseResourceMsg(msg, header) {
209
213
  switch (msg.resourceType) {
214
+ case "call":
215
+ try {
216
+ const event = await this.callManager.handleResource({
217
+ action: msg.action,
218
+ actor: {
219
+ device: this.getDevice(),
220
+ user: this.getUser(),
221
+ },
222
+ data: msg.data,
223
+ transmissionID: msg.transmissionID,
224
+ });
225
+ this.sendSuccess(msg.transmissionID, event);
226
+ }
227
+ catch (err) {
228
+ this.sendErr(msg.transmissionID, err instanceof Error ? err.message : String(err));
229
+ }
230
+ break;
210
231
  case "mail":
211
232
  if (msg.action === "CREATE") {
212
233
  const mailResult = MailWSSchema.safeParse(msg.data);
@@ -1 +1 @@
1
- {"version":3,"file":"ClientManager.js","sourceRoot":"","sources":["../src/ClientManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ClientManager.js","sourceRoot":"","sources":["../src/ClientManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copyright (c) 2020-2026 Vex Heavy Industries LLC
3
+ * Licensed under AGPL-3.0. See LICENSE for details.
4
+ * Commercial licenses available at vex.wtf
5
+ */
6
+ import type { IceServerConfig } from "@vex-chat/types";
7
+ export declare function resolveIceServersFromEnv(): Promise<IceServerConfig[]>;
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Copyright (c) 2020-2026 Vex Heavy Industries LLC
3
+ * Licensed under AGPL-3.0. See LICENSE for details.
4
+ * Commercial licenses available at vex.wtf
5
+ */
6
+ import { IceServerConfigSchema } from "@vex-chat/types";
7
+ import { z } from "zod/v4";
8
+ const CLOUDFLARE_TURN_ENDPOINT = "https://rtc.live.cloudflare.com/v1/turn/keys";
9
+ const DEFAULT_CLOUDFLARE_TURN_TIMEOUT_MS = 5_000;
10
+ const DEFAULT_CLOUDFLARE_TURN_TTL_SECONDS = 86_400;
11
+ const cloudflareIceServersResponseSchema = z.object({
12
+ iceServers: z.array(IceServerConfigSchema),
13
+ });
14
+ export async function resolveIceServersFromEnv() {
15
+ const jsonOverride = readJsonIceServersFromEnv();
16
+ if (jsonOverride) {
17
+ return jsonOverride;
18
+ }
19
+ const staticServers = readStaticIceServersFromEnv();
20
+ const cloudflareServers = await readCloudflareIceServersFromEnv();
21
+ return [...staticServers, ...cloudflareServers];
22
+ }
23
+ async function readCloudflareIceServersFromEnv() {
24
+ const keyID = readEnv([
25
+ "SPIRE_CLOUDFLARE_TURN_KEY_ID",
26
+ "CLOUDFLARE_TURN_KEY_ID",
27
+ "TURN_KEY_ID",
28
+ ]);
29
+ const apiToken = readEnv([
30
+ "SPIRE_CLOUDFLARE_TURN_API_TOKEN",
31
+ "CLOUDFLARE_TURN_API_TOKEN",
32
+ "TURN_KEY_API_TOKEN",
33
+ ]);
34
+ const endpointOverride = readEnv(["SPIRE_CLOUDFLARE_TURN_ENDPOINT"]);
35
+ if (!keyID && !apiToken && !endpointOverride) {
36
+ return [];
37
+ }
38
+ if (!apiToken || (!keyID && !endpointOverride)) {
39
+ console.warn("[spire-calls] Cloudflare TURN is partially configured; set SPIRE_CLOUDFLARE_TURN_KEY_ID and SPIRE_CLOUDFLARE_TURN_API_TOKEN");
40
+ return [];
41
+ }
42
+ let endpoint = endpointOverride;
43
+ if (!endpoint) {
44
+ if (!keyID) {
45
+ console.warn("[spire-calls] Cloudflare TURN is partially configured; set SPIRE_CLOUDFLARE_TURN_KEY_ID and SPIRE_CLOUDFLARE_TURN_API_TOKEN");
46
+ return [];
47
+ }
48
+ endpoint = `${CLOUDFLARE_TURN_ENDPOINT}/${encodeURIComponent(keyID)}/credentials/generate-ice-servers`;
49
+ }
50
+ const ttl = readPositiveIntegerEnv("SPIRE_CLOUDFLARE_TURN_TTL_SECONDS", DEFAULT_CLOUDFLARE_TURN_TTL_SECONDS);
51
+ const timeoutMs = readPositiveIntegerEnv("SPIRE_CLOUDFLARE_TURN_TIMEOUT_MS", DEFAULT_CLOUDFLARE_TURN_TIMEOUT_MS);
52
+ const controller = new AbortController();
53
+ const timeout = setTimeout(() => {
54
+ controller.abort();
55
+ }, timeoutMs);
56
+ try {
57
+ const response = await fetch(endpoint, {
58
+ body: JSON.stringify({ ttl }),
59
+ headers: {
60
+ Authorization: `Bearer ${apiToken}`,
61
+ "Content-Type": "application/json",
62
+ },
63
+ method: "POST",
64
+ signal: controller.signal,
65
+ });
66
+ if (!response.ok) {
67
+ throw new Error(`Cloudflare TURN credential request failed with ${response.status}`);
68
+ }
69
+ const payload = await response.json();
70
+ return cloudflareIceServersResponseSchema.parse(payload).iceServers;
71
+ }
72
+ catch (err) {
73
+ console.warn("[spire-calls] failed to fetch Cloudflare TURN credentials", err instanceof Error ? err.message : String(err));
74
+ return [];
75
+ }
76
+ finally {
77
+ clearTimeout(timeout);
78
+ }
79
+ }
80
+ function readEnv(names) {
81
+ for (const name of names) {
82
+ const value = process.env[name]?.trim();
83
+ if (value) {
84
+ return value;
85
+ }
86
+ }
87
+ return undefined;
88
+ }
89
+ function readJsonIceServersFromEnv() {
90
+ const json = process.env["SPIRE_ICE_SERVERS"]?.trim();
91
+ if (!json) {
92
+ return null;
93
+ }
94
+ try {
95
+ const parsed = JSON.parse(json);
96
+ return z.array(IceServerConfigSchema).parse(parsed);
97
+ }
98
+ catch (err) {
99
+ console.warn("[spire-calls] ignoring invalid SPIRE_ICE_SERVERS", err instanceof Error ? err.message : String(err));
100
+ return null;
101
+ }
102
+ }
103
+ function readPositiveIntegerEnv(name, fallback) {
104
+ const raw = process.env[name]?.trim();
105
+ if (!raw) {
106
+ return fallback;
107
+ }
108
+ const parsed = Number.parseInt(raw, 10);
109
+ if (Number.isInteger(parsed) && parsed > 0) {
110
+ return parsed;
111
+ }
112
+ console.warn(`[spire-calls] ignoring invalid ${name}; expected a positive integer`);
113
+ return fallback;
114
+ }
115
+ function readStaticIceServersFromEnv() {
116
+ const servers = [];
117
+ for (const url of splitCsvEnv("SPIRE_STUN_URLS")) {
118
+ servers.push({ urls: url });
119
+ }
120
+ const turnUrls = splitCsvEnv("SPIRE_TURN_URLS");
121
+ if (turnUrls.length > 0) {
122
+ const username = process.env["SPIRE_TURN_USERNAME"]?.trim();
123
+ const credential = process.env["SPIRE_TURN_CREDENTIAL"]?.trim();
124
+ const [firstTurnUrl] = turnUrls;
125
+ if (!firstTurnUrl) {
126
+ return servers;
127
+ }
128
+ const urls = turnUrls.length === 1 ? firstTurnUrl : turnUrls;
129
+ servers.push({
130
+ ...(credential ? { credential } : {}),
131
+ urls,
132
+ ...(username ? { username } : {}),
133
+ });
134
+ }
135
+ return servers;
136
+ }
137
+ function splitCsvEnv(name) {
138
+ return (process.env[name] ?? "")
139
+ .split(",")
140
+ .map((value) => value.trim())
141
+ .filter((value) => value.length > 0);
142
+ }
143
+ //# sourceMappingURL=IceServers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IceServers.js","sourceRoot":"","sources":["../src/IceServers.ts"],"names":[],"mappings":"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"}
@@ -280,6 +280,8 @@ export class NotificationService {
280
280
  }
281
281
  }
282
282
  function bodyForEvent(event) {
283
+ if (event === "callInvite")
284
+ return "Incoming voice call.";
283
285
  if (event === "mail")
284
286
  return undefined;
285
287
  if (event === "deviceRequest")
@@ -418,6 +420,8 @@ function shouldSendHeadlessPush(dispatch) {
418
420
  dispatch.userID === dispatch.headlessPushUserID);
419
421
  }
420
422
  function titleForEvent(event) {
423
+ if (event === "callInvite")
424
+ return "Incoming Vex call";
421
425
  if (event === "mail")
422
426
  return "New Message";
423
427
  if (event === "deviceRequest")