@vex-chat/spire 2.3.4 → 2.5.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.
@@ -3,8 +3,12 @@
3
3
  * Licensed under AGPL-3.0. See LICENSE for details.
4
4
  * Commercial licenses available at vex.wtf
5
5
  */
6
+ import { readFileSync } from "node:fs";
7
+ import * as http2 from "node:http2";
8
+ import jwt from "jsonwebtoken";
6
9
  const EXPO_PUSH_ENDPOINT = "https://exp.host/--/api/v2/push/send";
7
10
  const EXPO_RECEIPT_ENDPOINT = "https://exp.host/--/api/v2/push/getReceipts";
11
+ const FCM_TOKEN_ENDPOINT = "https://oauth2.googleapis.com/token";
8
12
  const EXPO_BATCH_SIZE = 100;
9
13
  const EXPO_RECEIPT_DELAY_MS = 15 * 60 * 1000;
10
14
  const EXPO_REQUEST_TIMEOUT_MS = 10_000;
@@ -111,9 +115,13 @@ export class NotificationService {
111
115
  const subscriptions = await this.db.retrieveNotificationSubscriptions(dispatch.deviceID
112
116
  ? { ...query, deviceID: dispatch.deviceID }
113
117
  : query);
114
- const expoSubscriptions = subscriptions;
115
- if (expoSubscriptions.length === 0) {
116
- console.info("[spire-notify] no Expo push subscriptions", {
118
+ const expoSubscriptions = subscriptions.filter((sub) => sub.channel === "expo");
119
+ const apnsSubscriptions = subscriptions.filter((sub) => sub.channel === "apnsVoip");
120
+ const fcmSubscriptions = subscriptions.filter((sub) => sub.channel === "fcmCall");
121
+ if (expoSubscriptions.length === 0 &&
122
+ apnsSubscriptions.length === 0 &&
123
+ fcmSubscriptions.length === 0) {
124
+ console.info("[spire-notify] no push subscriptions", {
117
125
  deviceScoped: Boolean(dispatch.deviceID),
118
126
  event: dispatch.event,
119
127
  transmissionID: dispatch.transmissionID,
@@ -125,6 +133,14 @@ export class NotificationService {
125
133
  const batch = expoSubscriptions.slice(i, i + EXPO_BATCH_SIZE);
126
134
  await this.sendExpoBatch(batch, dispatch);
127
135
  }
136
+ if (dispatch.event === "callWake") {
137
+ if (apnsSubscriptions.length > 0) {
138
+ await this.sendApnsVoipBatch(apnsSubscriptions, dispatch);
139
+ }
140
+ if (fcmSubscriptions.length > 0) {
141
+ await this.sendFcmCallBatch(fcmSubscriptions, dispatch);
142
+ }
143
+ }
128
144
  }
129
145
  async notifyPushIfMailPending(dispatch) {
130
146
  const pending = await this.db.hasMail(dispatch.mailNonce, dispatch.deviceID);
@@ -203,6 +219,45 @@ export class NotificationService {
203
219
  }, this.receiptDelayMs);
204
220
  timer.unref?.();
205
221
  }
222
+ async sendApnsVoipBatch(subscriptions, dispatch) {
223
+ const config = readApnsConfig();
224
+ if (!config) {
225
+ console.warn("[spire-notify] APNs VoIP env is not configured", {
226
+ event: dispatch.event,
227
+ size: subscriptions.length,
228
+ transmissionID: dispatch.transmissionID,
229
+ });
230
+ return;
231
+ }
232
+ const providerToken = jwt.sign({}, config.privateKey, {
233
+ algorithm: "ES256",
234
+ expiresIn: "50m",
235
+ header: { alg: "ES256", kid: config.keyID },
236
+ issuer: config.teamID,
237
+ });
238
+ for (const subscription of subscriptions) {
239
+ const response = await sendApnsVoipNotification(config, providerToken, subscription, dispatch);
240
+ if (response.status >= 200 && response.status < 300) {
241
+ continue;
242
+ }
243
+ console.warn("[spire-notify] APNs VoIP delivery failed", {
244
+ body: response.body.slice(0, 500),
245
+ status: response.status,
246
+ subscriptionID: subscription.subscriptionID,
247
+ transmissionID: dispatch.transmissionID,
248
+ });
249
+ if (response.status === 400 ||
250
+ response.status === 410 ||
251
+ response.body.includes("BadDeviceToken") ||
252
+ response.body.includes("Unregistered")) {
253
+ await this.db.removeNotificationSubscription({
254
+ deviceID: subscription.deviceID,
255
+ subscriptionID: subscription.subscriptionID,
256
+ userID: subscription.userID,
257
+ });
258
+ }
259
+ }
260
+ }
206
261
  async sendExpoBatch(subscriptions, dispatch) {
207
262
  const headless = shouldSendHeadlessPush(dispatch);
208
263
  const messages = subscriptions.map((sub) => expoMessageForSubscription(sub, dispatch, headless));
@@ -267,10 +322,52 @@ export class NotificationService {
267
322
  this.scheduleReceiptCheck(receiptIDs);
268
323
  }
269
324
  }
325
+ async sendFcmCallBatch(subscriptions, dispatch) {
326
+ const config = readFcmConfig();
327
+ if (!config) {
328
+ console.warn("[spire-notify] FCM call env is not configured", {
329
+ event: dispatch.event,
330
+ size: subscriptions.length,
331
+ transmissionID: dispatch.transmissionID,
332
+ });
333
+ return;
334
+ }
335
+ const accessToken = await fetchFcmAccessToken(config);
336
+ for (const subscription of subscriptions) {
337
+ const res = await fetchWithTimeout(`https://fcm.googleapis.com/v1/projects/${encodeURIComponent(config.projectID)}/messages:send`, {
338
+ body: JSON.stringify(fcmCallMessageForSubscription(subscription, dispatch)),
339
+ headers: {
340
+ Authorization: `Bearer ${accessToken}`,
341
+ "Content-Type": "application/json",
342
+ },
343
+ method: "POST",
344
+ }, "FCM call push request");
345
+ if (res.ok) {
346
+ continue;
347
+ }
348
+ const body = await res.text().catch(() => "");
349
+ console.warn("[spire-notify] FCM call delivery failed", {
350
+ body: body.slice(0, 500),
351
+ status: res.status,
352
+ subscriptionID: subscription.subscriptionID,
353
+ transmissionID: dispatch.transmissionID,
354
+ });
355
+ if (res.status === 400 ||
356
+ res.status === 404 ||
357
+ body.includes("UNREGISTERED") ||
358
+ body.includes("registration-token-not-registered")) {
359
+ await this.db.removeNotificationSubscription({
360
+ deviceID: subscription.deviceID,
361
+ subscriptionID: subscription.subscriptionID,
362
+ userID: subscription.userID,
363
+ });
364
+ }
365
+ }
366
+ }
270
367
  startPush(dispatch) {
271
368
  void this.notifyPush(dispatch).catch((err) => {
272
369
  // Push is best-effort; websocket/inbox delivery remain authoritative.
273
- console.warn("[spire-notify] Expo push fanout failed", {
370
+ console.warn("[spire-notify] push fanout failed", {
274
371
  event: dispatch.event,
275
372
  message: err instanceof Error ? err.message : String(err),
276
373
  transmissionID: dispatch.transmissionID,
@@ -279,7 +376,21 @@ export class NotificationService {
279
376
  });
280
377
  }
281
378
  }
379
+ function apnsExpiration(dispatch) {
380
+ const expiresAt = notifyDataFields(dispatch.data)["expiresAt"];
381
+ if (typeof expiresAt === "string") {
382
+ const epochSeconds = Math.floor(Date.parse(expiresAt) / 1000);
383
+ if (Number.isFinite(epochSeconds) && epochSeconds > 0) {
384
+ return String(epochSeconds);
385
+ }
386
+ }
387
+ return String(Math.floor((Date.now() + 60_000) / 1000));
388
+ }
282
389
  function bodyForEvent(event) {
390
+ if (event === "callWake")
391
+ return "Incoming voice call.";
392
+ if (event === "callInvite")
393
+ return "Incoming voice call.";
283
394
  if (event === "mail")
284
395
  return undefined;
285
396
  if (event === "deviceRequest")
@@ -288,6 +399,17 @@ function bodyForEvent(event) {
288
399
  return "Your device list changed.";
289
400
  return "Open Vex for the latest update.";
290
401
  }
402
+ function callWakeTtl(dispatch) {
403
+ const expiresAt = notifyDataFields(dispatch.data)["expiresAt"];
404
+ if (typeof expiresAt !== "string") {
405
+ return "60s";
406
+ }
407
+ const ms = Date.parse(expiresAt) - Date.now();
408
+ if (!Number.isFinite(ms) || ms <= 0) {
409
+ return "1s";
410
+ }
411
+ return `${Math.max(1, Math.ceil(ms / 1000)).toString()}s`;
412
+ }
291
413
  function expoMessageForSubscription(subscription, dispatch, headless) {
292
414
  if (headless) {
293
415
  return {
@@ -305,6 +427,7 @@ function expoMessageForSubscription(subscription, dispatch, headless) {
305
427
  const title = titleForEvent(dispatch.event);
306
428
  const body = bodyForEvent(dispatch.event);
307
429
  const data = {
430
+ ...notifyDataFields(dispatch.data),
308
431
  deviceID: dispatch.deviceID ?? null,
309
432
  event: dispatch.event,
310
433
  title,
@@ -333,6 +456,54 @@ function expoMessageForSubscription(subscription, dispatch, headless) {
333
456
  }
334
457
  return message;
335
458
  }
459
+ function fcmCallMessageForSubscription(subscription, dispatch) {
460
+ return {
461
+ message: {
462
+ android: {
463
+ priority: "HIGH",
464
+ ttl: callWakeTtl(dispatch),
465
+ },
466
+ data: stringRecord({
467
+ ...notifyDataFields(dispatch.data),
468
+ deviceID: dispatch.deviceID ?? "",
469
+ event: dispatch.event,
470
+ transmissionID: dispatch.transmissionID,
471
+ }),
472
+ token: subscription.token,
473
+ },
474
+ };
475
+ }
476
+ async function fetchFcmAccessToken(config) {
477
+ const assertion = jwt.sign({
478
+ scope: "https://www.googleapis.com/auth/firebase.messaging",
479
+ }, config.privateKey, {
480
+ algorithm: "RS256",
481
+ audience: FCM_TOKEN_ENDPOINT,
482
+ expiresIn: "55m",
483
+ issuer: config.clientEmail,
484
+ subject: config.clientEmail,
485
+ });
486
+ const body = new URLSearchParams({
487
+ assertion,
488
+ grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
489
+ });
490
+ const res = await fetchWithTimeout(FCM_TOKEN_ENDPOINT, {
491
+ body,
492
+ headers: {
493
+ "Content-Type": "application/x-www-form-urlencoded",
494
+ },
495
+ method: "POST",
496
+ }, "FCM OAuth token request");
497
+ if (!res.ok) {
498
+ const responseBody = await res.text().catch(() => "");
499
+ throw new Error(`FCM OAuth token request failed with status ${res.status.toString()}${responseBody ? `: ${responseBody.slice(0, 500)}` : ""}`);
500
+ }
501
+ const raw = await res.json();
502
+ if (!isRecord(raw) || typeof raw["access_token"] !== "string") {
503
+ throw new Error("FCM OAuth token response did not include access_token");
504
+ }
505
+ return raw["access_token"];
506
+ }
336
507
  async function fetchWithTimeout(input, init, label) {
337
508
  const controller = new AbortController();
338
509
  const timer = setTimeout(() => {
@@ -378,6 +549,22 @@ function normalizeExpoTickets(data) {
378
549
  const tickets = Array.isArray(data) ? data : [data];
379
550
  return tickets.filter(isExpoPushTicket);
380
551
  }
552
+ function normalizePrivateKey(value) {
553
+ return value.replaceAll("\\n", "\n");
554
+ }
555
+ function notifyDataFields(data) {
556
+ if (!isRecord(data)) {
557
+ return {};
558
+ }
559
+ const out = {};
560
+ for (const key of ["callID", "expiresAt", "mailID", "mailNonce"]) {
561
+ const value = data[key];
562
+ if (typeof value === "string") {
563
+ out[key] = value;
564
+ }
565
+ }
566
+ return out;
567
+ }
381
568
  function parseExpoPushResponse(raw) {
382
569
  if (!isRecord(raw)) {
383
570
  return { errors: [], tickets: [] };
@@ -407,6 +594,127 @@ function parseExpoReceipts(data) {
407
594
  }
408
595
  return receipts;
409
596
  }
597
+ function readApnsConfig() {
598
+ const teamID = readEnv("SPIRE_APNS_TEAM_ID");
599
+ const keyID = readEnv("SPIRE_APNS_KEY_ID");
600
+ const bundleID = readEnv("SPIRE_APNS_BUNDLE_ID");
601
+ const topic = readEnv("SPIRE_APNS_TOPIC") ?? `${bundleID ?? ""}.voip`;
602
+ const privateKey = readPrivateKeyEnv("SPIRE_APNS_PRIVATE_KEY", "SPIRE_APNS_PRIVATE_KEY_FILE");
603
+ if (!teamID || !keyID || !bundleID || !topic || !privateKey) {
604
+ return null;
605
+ }
606
+ const environment = readEnv("SPIRE_APNS_ENV") === "sandbox" ? "sandbox" : "production";
607
+ return {
608
+ environment,
609
+ keyID,
610
+ privateKey,
611
+ teamID,
612
+ topic,
613
+ };
614
+ }
615
+ function readEnv(name) {
616
+ const value = process.env[name]?.trim();
617
+ return value && value.length > 0 ? value : null;
618
+ }
619
+ function readFcmConfig() {
620
+ const json = readEnv("SPIRE_FCM_SERVICE_ACCOUNT_JSON");
621
+ if (json) {
622
+ try {
623
+ const raw = JSON.parse(json);
624
+ if (isRecord(raw) &&
625
+ typeof raw["client_email"] === "string" &&
626
+ typeof raw["private_key"] === "string" &&
627
+ typeof raw["project_id"] === "string") {
628
+ return {
629
+ clientEmail: raw["client_email"],
630
+ privateKey: normalizePrivateKey(raw["private_key"]),
631
+ projectID: raw["project_id"],
632
+ };
633
+ }
634
+ }
635
+ catch {
636
+ return null;
637
+ }
638
+ }
639
+ const clientEmail = readEnv("SPIRE_FCM_CLIENT_EMAIL");
640
+ const projectID = readEnv("SPIRE_FCM_PROJECT_ID");
641
+ const privateKey = readPrivateKeyEnv("SPIRE_FCM_PRIVATE_KEY", "SPIRE_FCM_PRIVATE_KEY_FILE");
642
+ if (!clientEmail || !projectID || !privateKey) {
643
+ return null;
644
+ }
645
+ return { clientEmail, privateKey, projectID };
646
+ }
647
+ function readPrivateKeyEnv(valueName, fileName) {
648
+ const inline = readEnv(valueName);
649
+ if (inline) {
650
+ return normalizePrivateKey(inline);
651
+ }
652
+ const file = readEnv(fileName);
653
+ if (!file) {
654
+ return null;
655
+ }
656
+ try {
657
+ return normalizePrivateKey(readFileSync(file, "utf8"));
658
+ }
659
+ catch {
660
+ return null;
661
+ }
662
+ }
663
+ function sendApnsVoipNotification(config, providerToken, subscription, dispatch) {
664
+ const host = config.environment === "sandbox"
665
+ ? "api.sandbox.push.apple.com"
666
+ : "api.push.apple.com";
667
+ const payload = JSON.stringify({
668
+ aps: {
669
+ "content-available": 1,
670
+ },
671
+ ...notifyDataFields(dispatch.data),
672
+ event: dispatch.event,
673
+ transmissionID: dispatch.transmissionID,
674
+ });
675
+ return new Promise((resolve, reject) => {
676
+ const client = http2.connect(`https://${host}`);
677
+ const timer = setTimeout(() => {
678
+ client.close();
679
+ reject(new Error(`APNs VoIP request timed out after ${EXPO_REQUEST_TIMEOUT_MS.toString()}ms`));
680
+ }, EXPO_REQUEST_TIMEOUT_MS);
681
+ timer.unref?.();
682
+ client.once("error", (err) => {
683
+ clearTimeout(timer);
684
+ reject(err);
685
+ });
686
+ const req = client.request({
687
+ ":method": "POST",
688
+ ":path": `/3/device/${subscription.token}`,
689
+ "apns-expiration": apnsExpiration(dispatch),
690
+ "apns-priority": "10",
691
+ "apns-push-type": "voip",
692
+ "apns-topic": config.topic,
693
+ authorization: `bearer ${providerToken}`,
694
+ });
695
+ let status = 0;
696
+ let body = "";
697
+ req.setEncoding("utf8");
698
+ req.on("response", (headers) => {
699
+ const rawStatus = headers[":status"];
700
+ status = typeof rawStatus === "number" ? rawStatus : 0;
701
+ });
702
+ req.on("data", (chunk) => {
703
+ body += chunk;
704
+ });
705
+ req.on("error", (err) => {
706
+ clearTimeout(timer);
707
+ client.close();
708
+ reject(err);
709
+ });
710
+ req.on("end", () => {
711
+ clearTimeout(timer);
712
+ client.close();
713
+ resolve({ body, status });
714
+ });
715
+ req.end(payload);
716
+ });
717
+ }
410
718
  function shouldDeferMailPush(dispatch, websocketDeliveries) {
411
719
  return (dispatch.event === "mail" &&
412
720
  websocketDeliveries > 0 &&
@@ -417,7 +725,20 @@ function shouldSendHeadlessPush(dispatch) {
417
725
  return (dispatch.headlessPushUserID !== undefined &&
418
726
  dispatch.userID === dispatch.headlessPushUserID);
419
727
  }
728
+ function stringRecord(input) {
729
+ const out = {};
730
+ for (const [key, value] of Object.entries(input)) {
731
+ if (typeof value === "string") {
732
+ out[key] = value;
733
+ }
734
+ }
735
+ return out;
736
+ }
420
737
  function titleForEvent(event) {
738
+ if (event === "callWake")
739
+ return "Incoming Vex call";
740
+ if (event === "callInvite")
741
+ return "Incoming Vex call";
421
742
  if (event === "mail")
422
743
  return "New Message";
423
744
  if (event === "deviceRequest")
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationService.js","sourceRoot":"","sources":["../src/NotificationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotificationService.js","sourceRoot":"","sources":["../src/NotificationService.ts"],"names":[],"mappings":"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"}
package/dist/Spire.d.ts CHANGED
@@ -28,6 +28,7 @@ export interface SpireOptions {
28
28
  export declare class Spire extends EventEmitter {
29
29
  private actionTokens;
30
30
  private api;
31
+ private calls;
31
32
  private clients;
32
33
  private readonly commitSha;
33
34
  private readonly cryptoProfile;
package/dist/Spire.js CHANGED
@@ -18,9 +18,12 @@ import morgan from "morgan";
18
18
  import { stringify as uuidStringify } from "uuid";
19
19
  import { WebSocketServer } from "ws";
20
20
  import { z } from "zod/v4";
21
+ import { CallManager } from "./CallManager.js";
21
22
  import { ClientManager } from "./ClientManager.js";
22
23
  import { Database, hashPasswordArgon2, verifyPassword } from "./Database.js";
24
+ import { resolveIceServersFromEnv } from "./IceServers.js";
23
25
  import { NotificationService } from "./NotificationService.js";
26
+ import { callWakeDispatchData } from "./server/callWake.js";
24
27
  import { initApp, protect } from "./server/index.js";
25
28
  import { MailIngressValidationError, validateMailIngress, } from "./server/mailIngress.js";
26
29
  import { passkeySecondFactorError } from "./server/passkeySecondFactor.js";
@@ -77,8 +80,8 @@ const mailBatchPostPayload = z.object({
77
80
  mails: z.array(mailPostPayload).min(1).max(MAIL_BATCH_MAX_ITEMS),
78
81
  });
79
82
  const notificationSubscribePayload = z.object({
80
- channel: z.literal("expo"),
81
- events: z.array(z.string().min(1)).default(["mail"]),
83
+ channel: z.enum(["apnsVoip", "expo", "fcmCall"]),
84
+ events: z.array(z.string().min(1)).optional(),
82
85
  platform: z.enum(["android", "ios", "web"]).optional(),
83
86
  token: z.string().min(1),
84
87
  });
@@ -138,6 +141,7 @@ let pendingFipsKeyPair = null;
138
141
  export class Spire extends EventEmitter {
139
142
  actionTokens = [];
140
143
  api = express();
144
+ calls;
141
145
  clients = [];
142
146
  commitSha = getCommitSha();
143
147
  cryptoProfile;
@@ -177,7 +181,9 @@ export class Spire extends EventEmitter {
177
181
  // that lets attackers spoof the header and bypass rate limiting.
178
182
  // If spire is deployed without a proxy, set this to 0 instead.
179
183
  this.api.set("trust proxy", 1);
184
+ this.api.disable("etag");
180
185
  this.db = new Database(options);
186
+ this.calls = new CallManager(this.db, this.notify.bind(this));
181
187
  this.notifications = new NotificationService(this.db, this.clients, this.removeClient.bind(this));
182
188
  this.db.on("ready", () => {
183
189
  this.dbReady = true;
@@ -329,7 +335,7 @@ export class Spire extends EventEmitter {
329
335
  JSON.stringify(jwtResult.error.issues));
330
336
  }
331
337
  const userDetails = jwtResult.data.user;
332
- const client = new ClientManager(ws, this.db, this.notify.bind(this), userDetails);
338
+ const client = new ClientManager(ws, this.db, this.calls, this.notify.bind(this), userDetails);
333
339
  client.on("fail", () => {
334
340
  this.removeClient(client);
335
341
  });
@@ -655,7 +661,13 @@ export class Spire extends EventEmitter {
655
661
  }
656
662
  await this.db.saveMail(mail, header, senderDeviceDetails.deviceID, authorUserDetails.userID);
657
663
  res.sendStatus(200);
658
- this.notify(recipientDeviceDetails.owner, "mail", crypto.randomUUID(), null, mail.recipient, mail.authorID, mail.nonce);
664
+ const callWake = callWakeDispatchData(mail);
665
+ if (callWake) {
666
+ this.notify(recipientDeviceDetails.owner, "callWake", crypto.randomUUID(), callWake, mail.recipient, undefined, mail.nonce);
667
+ }
668
+ else {
669
+ this.notify(recipientDeviceDetails.owner, "mail", crypto.randomUUID(), null, mail.recipient, mail.authorID, mail.nonce);
670
+ }
659
671
  });
660
672
  this.api.post("/mail/batch", protect, async (req, res) => {
661
673
  const senderDeviceDetails = req.device;
@@ -748,9 +760,25 @@ export class Spire extends EventEmitter {
748
760
  }
749
761
  res.send(msgpack.encode({ results }));
750
762
  for (const entry of deliveredEntries) {
751
- this.notify(entry.recipientDevice.owner, "mail", crypto.randomUUID(), null, entry.mail.recipient, entry.mail.authorID, entry.mail.nonce);
763
+ const callWake = callWakeDispatchData(entry.mail);
764
+ if (callWake) {
765
+ this.notify(entry.recipientDevice.owner, "callWake", crypto.randomUUID(), callWake, entry.mail.recipient, undefined, entry.mail.nonce);
766
+ }
767
+ else {
768
+ this.notify(entry.recipientDevice.owner, "mail", crypto.randomUUID(), null, entry.mail.recipient, entry.mail.authorID, entry.mail.nonce);
769
+ }
752
770
  }
753
771
  });
772
+ this.api.get("/calls/active", protect, (req, res) => {
773
+ const user = getUser(req);
774
+ res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate");
775
+ res.setHeader("Pragma", "no-cache");
776
+ res.setHeader("Expires", "0");
777
+ res.json({ calls: this.calls.activeCallsForUser(user.userID) });
778
+ });
779
+ this.api.get("/calls/ice-servers", protect, async (_req, res) => {
780
+ res.json({ iceServers: await resolveIceServersFromEnv() });
781
+ });
754
782
  this.api.post("/device/:id/notifications/subscriptions", protect, async (req, res) => {
755
783
  const device = req.device;
756
784
  if (!device) {
@@ -772,7 +800,10 @@ export class Spire extends EventEmitter {
772
800
  const subscription = await this.db.saveNotificationSubscription({
773
801
  channel: parsed.data.channel,
774
802
  deviceID: device.deviceID,
775
- events: parsed.data.events,
803
+ events: parsed.data.events ??
804
+ (parsed.data.channel === "expo"
805
+ ? ["mail"]
806
+ : ["callWake"]),
776
807
  platform: parsed.data.platform ?? null,
777
808
  token: parsed.data.token,
778
809
  userID: getUser(req).userID,