@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
@@ -32,12 +32,12 @@ import jwt from "jsonwebtoken";
32
32
 
33
33
  import { JWT_EXPIRY_PASSKEY } from "../Spire.ts";
34
34
  import { getJwtSecret } from "../utils/jwtSecret.ts";
35
- import { msgpack } from "../utils/msgpack.ts";
36
35
 
37
36
  import { AppError } from "./errors.ts";
38
37
  import { authLimiter } from "./rateLimit.ts";
39
38
  import { censorUser, getParam, getUser } from "./utils.ts";
40
39
  import { buildAndroidApkKeyHashOrigins } from "./wellKnown.ts";
40
+ import { sendWireResponse } from "./wireResponse.ts";
41
41
 
42
42
  import { protect } from "./index.ts";
43
43
 
@@ -257,12 +257,10 @@ export const getPasskeyRouter = (db: Database) => {
257
257
  // shared types package doesn't take a runtime dep on
258
258
  // SimpleWebAuthn). The wire shape is identical — both
259
259
  // sides hand the JSON straight to navigator.credentials.
260
- res.send(
261
- msgpack.encode({
262
- options,
263
- requestID,
264
- }),
265
- );
260
+ sendWireResponse(req, res, {
261
+ options,
262
+ requestID,
263
+ });
266
264
  },
267
265
  );
268
266
 
@@ -379,7 +377,7 @@ export const getPasskeyRouter = (db: Database) => {
379
377
  transports,
380
378
  );
381
379
 
382
- res.send(msgpack.encode(created));
380
+ sendWireResponse(req, res, created);
383
381
  },
384
382
  );
385
383
 
@@ -391,7 +389,7 @@ export const getPasskeyRouter = (db: Database) => {
391
389
  return;
392
390
  }
393
391
  const list: Passkey[] = await db.retrievePasskeysByUser(userID);
394
- res.send(msgpack.encode(list));
392
+ sendWireResponse(req, res, list);
395
393
  });
396
394
 
397
395
  router.delete(
@@ -477,12 +475,10 @@ export const getPasskeyRouter = (db: Database) => {
477
475
  userID: user.userID,
478
476
  });
479
477
 
480
- res.send(
481
- msgpack.encode({
482
- options,
483
- requestID,
484
- }),
485
- );
478
+ sendWireResponse(req, res, {
479
+ options,
480
+ requestID,
481
+ });
486
482
  });
487
483
 
488
484
  router.post("/auth/passkey/finish", authLimiter, async (req, res) => {
@@ -596,13 +592,11 @@ export const getPasskeyRouter = (db: Database) => {
596
592
  passkeyID: passkeyRow.passkeyID,
597
593
  user: censored,
598
594
  });
599
- res.send(
600
- msgpack.encode({
601
- passkeyID: passkeyRow.passkeyID,
602
- token,
603
- user: censored,
604
- }),
605
- );
595
+ sendWireResponse(req, res, {
596
+ passkeyID: passkeyRow.passkeyID,
597
+ token,
598
+ user: censored,
599
+ });
606
600
  });
607
601
 
608
602
  return router;
@@ -8,13 +8,12 @@ import type { Database } from "../Database.ts";
8
8
 
9
9
  import express from "express";
10
10
 
11
- import { msgpack } from "../utils/msgpack.ts";
12
-
13
11
  import {
14
12
  recoverDeviceEnrollmentRequest,
15
13
  resolveDeviceEnrollmentRequest,
16
14
  } from "./user.ts";
17
15
  import { getParam, getUser } from "./utils.ts";
16
+ import { sendWireResponse } from "./wireResponse.ts";
18
17
 
19
18
  import { protectPasskey } from "./index.ts";
20
19
 
@@ -60,7 +59,7 @@ export const getPasskeyDeviceRouter = (
60
59
  return;
61
60
  }
62
61
  const list = await db.retrieveUserDeviceList([userID]);
63
- res.send(msgpack.encode(list));
62
+ sendWireResponse(req, res, list);
64
63
  },
65
64
  );
66
65
 
@@ -126,7 +125,7 @@ export const getPasskeyDeviceRouter = (
126
125
  if (result.kind === "ok") {
127
126
  notify(userID, "deviceListChanged", crypto.randomUUID());
128
127
  disconnectDevices?.(result.revokedDeviceIDs);
129
- res.send(msgpack.encode(result.device));
128
+ sendWireResponse(req, res, result.device);
130
129
  return;
131
130
  }
132
131
  res.status(result.status).send({ error: result.error });
@@ -0,0 +1,26 @@
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
+
7
+ import type express from "express";
8
+
9
+ import { msgpack } from "../utils/msgpack.ts";
10
+
11
+ /**
12
+ * Normal SDK clients expect msgpack from Spire. Browser-only helpers
13
+ * can opt into JSON with `?format=json` so they do not need to ship a
14
+ * msgpack codec just to complete a short WebAuthn bridge ceremony.
15
+ */
16
+ export function sendWireResponse(
17
+ req: express.Request,
18
+ res: express.Response,
19
+ payload: unknown,
20
+ ): void {
21
+ if (req.query["format"] === "json") {
22
+ res.json(payload);
23
+ return;
24
+ }
25
+ res.send(msgpack.encode(payload));
26
+ }