@openlv/core 0.0.1-beta.8 → 0.0.1

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 (48) hide show
  1. package/dist/encryption/asymmetric.d.ts +2 -2
  2. package/dist/encryption/asymmetric.js +33 -41
  3. package/dist/encryption/asymmetric.js.map +1 -1
  4. package/dist/encryption/asymmetric.test.js +2 -4
  5. package/dist/encryption/asymmetric.test.js.map +1 -1
  6. package/dist/encryption/base64.js +3 -3
  7. package/dist/encryption/base64.js.map +1 -1
  8. package/dist/encryption/base64.test.js.map +1 -1
  9. package/dist/encryption/handshake.js +4 -3
  10. package/dist/encryption/handshake.js.map +1 -1
  11. package/dist/encryption/handshake.test.js +7 -1
  12. package/dist/encryption/handshake.test.js.map +1 -1
  13. package/dist/encryption/hash.js +1 -1
  14. package/dist/encryption/hash.js.map +1 -1
  15. package/dist/encryption/index.js.map +1 -1
  16. package/dist/encryption/random.js +2 -4
  17. package/dist/encryption/random.js.map +1 -1
  18. package/dist/{errors/base.d.ts → errors.d.ts} +4 -1
  19. package/dist/{errors/base.js → errors.js} +15 -9
  20. package/dist/errors.js.map +1 -0
  21. package/dist/icons/index.js +1 -1
  22. package/dist/icons/index.js.map +1 -1
  23. package/dist/index.d.ts +1 -2
  24. package/dist/index.js +1 -2
  25. package/dist/index.js.map +1 -1
  26. package/dist/make.d.ts +2 -2
  27. package/dist/make.js +4 -7
  28. package/dist/make.js.map +1 -1
  29. package/dist/messages.js +2 -0
  30. package/dist/messages.js.map +1 -0
  31. package/dist/session.js.map +1 -1
  32. package/dist/url/index.js +5 -3
  33. package/dist/url/index.js.map +1 -1
  34. package/dist/url/index.test.js.map +1 -1
  35. package/package.json +6 -5
  36. package/dist/errors/base.js.map +0 -1
  37. package/dist/errors/index.d.ts +0 -4
  38. package/dist/errors/index.js +0 -5
  39. package/dist/errors/index.js.map +0 -1
  40. package/dist/errors/signal.d.ts +0 -4
  41. package/dist/errors/signal.js +0 -7
  42. package/dist/errors/signal.js.map +0 -1
  43. package/dist/messages/index.js +0 -2
  44. package/dist/messages/index.js.map +0 -1
  45. package/dist/settings.d.ts +0 -2
  46. package/dist/settings.js +0 -2
  47. package/dist/settings.js.map +0 -1
  48. /package/dist/{messages/index.d.ts → messages.d.ts} +0 -0
@@ -7,9 +7,9 @@ export type DecryptionKey = {
7
7
  toString: () => string;
8
8
  decrypt: (message: string) => Promise<string>;
9
9
  };
10
- export declare const createEncryptionKey: (key: Uint8Array) => Promise<EncryptionKey>;
10
+ export declare const createEncryptionKey: (publicKey: Uint8Array) => Promise<EncryptionKey>;
11
11
  export declare const parseEncryptionKey: (serializedKey: string) => Promise<EncryptionKey>;
12
- export declare const createDecryptionKey: (key: Uint8Array) => Promise<DecryptionKey>;
12
+ export declare const createDecryptionKey: (secretKey: Uint8Array) => Promise<DecryptionKey>;
13
13
  export type EncKeypair = {
14
14
  encryptionKey: EncryptionKey;
15
15
  decryptionKey: DecryptionKey;
@@ -1,7 +1,8 @@
1
- import nacl from "tweetnacl";
1
+ import { secretbox } from "@noble/ciphers/salsa.js";
2
+ import { x25519 } from "@noble/curves/ed25519.js";
2
3
  import { fromBase64, toBase64 } from "./base64.js";
3
- const PUBLIC_KEY_BYTE_LENGTH = nacl.box.publicKeyLength;
4
- const NONCE_BYTE_LENGTH = nacl.box.nonceLength;
4
+ const PUBLIC_KEY_BYTES = 32;
5
+ const NONCE_BYTES = 24;
5
6
  const composePayload = (ephemeralPublicKey, nonce, ciphertext) => {
6
7
  const payload = new Uint8Array(ephemeralPublicKey.length + nonce.length + ciphertext.length);
7
8
  payload.set(ephemeralPublicKey, 0);
@@ -10,70 +11,61 @@ const composePayload = (ephemeralPublicKey, nonce, ciphertext) => {
10
11
  return toBase64(payload);
11
12
  };
12
13
  const decomposePayload = (payload) => {
13
- const bytes = new Uint8Array(atob(payload)
14
- .split("")
15
- .map((char) => char.charCodeAt(0)));
16
- if (bytes.length <= PUBLIC_KEY_BYTE_LENGTH + NONCE_BYTE_LENGTH) {
14
+ const bytes = fromBase64(payload);
15
+ if (bytes.length <= PUBLIC_KEY_BYTES + NONCE_BYTES) {
17
16
  throw new Error("Encrypted payload is malformed.");
18
17
  }
19
- const ephemeralPublicKey = bytes.slice(0, PUBLIC_KEY_BYTE_LENGTH);
20
- const nonce = bytes.slice(PUBLIC_KEY_BYTE_LENGTH, PUBLIC_KEY_BYTE_LENGTH + NONCE_BYTE_LENGTH);
21
- const ciphertext = bytes.slice(PUBLIC_KEY_BYTE_LENGTH + NONCE_BYTE_LENGTH);
18
+ const ephemeralPublicKey = bytes.slice(0, PUBLIC_KEY_BYTES);
19
+ const nonce = bytes.slice(PUBLIC_KEY_BYTES, PUBLIC_KEY_BYTES + NONCE_BYTES);
20
+ const ciphertext = bytes.slice(PUBLIC_KEY_BYTES + NONCE_BYTES);
22
21
  return {
23
22
  ephemeralPublicKey,
24
23
  nonce,
25
24
  ciphertext,
26
25
  };
27
26
  };
28
- export const createEncryptionKey = async (key) => {
29
- const serializedPublicKey = toBase64(key);
27
+ export const createEncryptionKey = async (publicKey) => {
28
+ const serializedPublicKey = toBase64(publicKey);
30
29
  return {
31
30
  toString: () => serializedPublicKey,
32
31
  encrypt: async (message) => {
33
- const messageBytes = new TextEncoder().encode(message);
34
- const ephemeralKeyPair = nacl.box.keyPair();
35
- const nonce = nacl.randomBytes(NONCE_BYTE_LENGTH);
36
- const ciphertext = nacl.box(messageBytes, nonce, key, ephemeralKeyPair.secretKey);
37
- if (!ciphertext) {
38
- throw new Error("Failed to encrypt message.");
39
- }
40
- return composePayload(ephemeralKeyPair.publicKey, nonce, ciphertext);
32
+ const ephemeralSecret = x25519.utils.randomSecretKey();
33
+ const ephemeralPublic = x25519.getPublicKey(ephemeralSecret);
34
+ const nonce = crypto.getRandomValues(new Uint8Array(NONCE_BYTES));
35
+ const { seal } = secretbox(x25519.getSharedSecret(ephemeralSecret, publicKey), nonce);
36
+ const ciphertext = seal(new TextEncoder().encode(message));
37
+ return composePayload(ephemeralPublic, nonce, ciphertext);
41
38
  },
42
39
  };
43
40
  };
44
- export const parseEncryptionKey = async (serializedKey) => {
45
- const decodedPublicKey = fromBase64(serializedKey);
46
- return createEncryptionKey(decodedPublicKey);
47
- };
48
- export const createDecryptionKey = async (key) => {
49
- const serializedSecretKey = toBase64(key);
41
+ export const parseEncryptionKey = async (serializedKey) => createEncryptionKey(fromBase64(serializedKey));
42
+ export const createDecryptionKey = async (secretKey) => {
43
+ const serializedSecretKey = toBase64(secretKey);
50
44
  return {
51
45
  toString: () => serializedSecretKey,
52
46
  decrypt: async (message) => {
53
47
  if (!message) {
54
- return "";
48
+ throw new Error("Cannot decrypt an empty payload");
55
49
  }
56
50
  const { ephemeralPublicKey, nonce, ciphertext } = decomposePayload(message);
57
- const decrypted = nacl.box.open(ciphertext, nonce, ephemeralPublicKey, key);
58
- if (!decrypted) {
59
- throw new Error("Failed to decrypt message.");
60
- }
61
- return new TextDecoder().decode(decrypted);
51
+ const { open } = secretbox(x25519.getSharedSecret(secretKey, ephemeralPublicKey), nonce);
52
+ return new TextDecoder().decode(open(ciphertext));
62
53
  },
63
54
  };
64
55
  };
65
56
  export const generateKeyPair = async () => {
66
- const { publicKey, secretKey } = nacl.box.keyPair();
67
- const encryptionKey = await createEncryptionKey(publicKey);
68
- const decryptionKey = await createDecryptionKey(secretKey);
69
- return { encryptionKey, decryptionKey };
57
+ const secretKey = x25519.utils.randomSecretKey();
58
+ const publicKey = x25519.getPublicKey(secretKey);
59
+ return {
60
+ encryptionKey: await createEncryptionKey(publicKey),
61
+ decryptionKey: await createDecryptionKey(secretKey),
62
+ };
70
63
  };
71
64
  export const initEncryptionKeys = async (initParameters) => {
72
- const keyPair = nacl.box.keyPair();
73
65
  const { encryptionKey, decryptionKey } = await generateKeyPair();
74
- if (initParameters &&
75
- "publicKey" in initParameters &&
76
- initParameters.publicKey) {
66
+ if (initParameters
67
+ && "publicKey" in initParameters
68
+ && initParameters.publicKey) {
77
69
  const relyingEncryptionKey = await parseEncryptionKey(initParameters.publicKey);
78
70
  return {
79
71
  encryptionKey,
@@ -84,7 +76,7 @@ export const initEncryptionKeys = async (initParameters) => {
84
76
  return {
85
77
  encryptionKey,
86
78
  decryptionKey,
87
- relyingEncryptionKey: await createEncryptionKey(keyPair.publicKey),
79
+ relyingEncryptionKey: encryptionKey,
88
80
  };
89
81
  };
90
82
  //# sourceMappingURL=asymmetric.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"asymmetric.js","sourceRoot":"","sources":["../../src/encryption/asymmetric.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"asymmetric.js","sourceRoot":"","sources":["../../src/encryption/asymmetric.ts"],"names":[],"mappings":"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","sourcesContent":["import { secretbox } from \"@noble/ciphers/salsa.js\";\nimport { x25519 } from \"@noble/curves/ed25519.js\";\n\nimport type { SessionLinkParameters } from \"../session.js\";\nimport { fromBase64, toBase64 } from \"./base64.js\";\n\nconst PUBLIC_KEY_BYTES = 32;\nconst NONCE_BYTES = 24;\n\nconst composePayload = (\n ephemeralPublicKey: Uint8Array,\n nonce: Uint8Array,\n ciphertext: Uint8Array,\n): string => {\n const payload = new Uint8Array(\n ephemeralPublicKey.length + nonce.length + ciphertext.length,\n );\n\n payload.set(ephemeralPublicKey, 0);\n payload.set(nonce, ephemeralPublicKey.length);\n payload.set(ciphertext, ephemeralPublicKey.length + nonce.length);\n\n return toBase64(payload);\n};\n\nconst decomposePayload = (\n payload: string,\n): {\n ephemeralPublicKey: Uint8Array;\n nonce: Uint8Array;\n ciphertext: Uint8Array;\n} => {\n const bytes = fromBase64(payload);\n\n if (bytes.length <= PUBLIC_KEY_BYTES + NONCE_BYTES) {\n throw new Error(\"Encrypted payload is malformed.\");\n }\n\n const ephemeralPublicKey = bytes.slice(0, PUBLIC_KEY_BYTES);\n const nonce = bytes.slice(PUBLIC_KEY_BYTES, PUBLIC_KEY_BYTES + NONCE_BYTES);\n const ciphertext = bytes.slice(PUBLIC_KEY_BYTES + NONCE_BYTES);\n\n return {\n ephemeralPublicKey,\n nonce,\n ciphertext,\n };\n};\n\nexport type EncryptionKey = {\n toString: () => string;\n encrypt: (message: string) => Promise<string>;\n};\n\nexport type DecryptionKey = {\n toString: () => string;\n decrypt: (message: string) => Promise<string>;\n};\n\nexport const createEncryptionKey = async (\n publicKey: Uint8Array,\n): Promise<EncryptionKey> => {\n const serializedPublicKey = toBase64(publicKey);\n\n return {\n toString: () => serializedPublicKey,\n encrypt: async (message: string) => {\n const ephemeralSecret = x25519.utils.randomSecretKey();\n const ephemeralPublic = x25519.getPublicKey(ephemeralSecret);\n const nonce = crypto.getRandomValues(new Uint8Array(NONCE_BYTES));\n const { seal } = secretbox(\n x25519.getSharedSecret(ephemeralSecret, publicKey),\n nonce,\n );\n const ciphertext = seal(new TextEncoder().encode(message));\n\n return composePayload(ephemeralPublic, nonce, ciphertext);\n },\n };\n};\n\nexport const parseEncryptionKey = async (\n serializedKey: string,\n): Promise<EncryptionKey> => createEncryptionKey(fromBase64(serializedKey));\n\nexport const createDecryptionKey = async (\n secretKey: Uint8Array,\n): Promise<DecryptionKey> => {\n const serializedSecretKey = toBase64(secretKey);\n\n return {\n toString: () => serializedSecretKey,\n decrypt: async (message: string) => {\n if (!message) {\n throw new Error(\"Cannot decrypt an empty payload\");\n }\n\n const { ephemeralPublicKey, nonce, ciphertext }\n = decomposePayload(message);\n const { open } = secretbox(\n x25519.getSharedSecret(secretKey, ephemeralPublicKey),\n nonce,\n );\n\n return new TextDecoder().decode(open(ciphertext));\n },\n };\n};\n\nexport type EncKeypair = {\n encryptionKey: EncryptionKey;\n decryptionKey: DecryptionKey;\n};\n\nexport const generateKeyPair = async (): Promise<EncKeypair> => {\n const secretKey = x25519.utils.randomSecretKey();\n const publicKey = x25519.getPublicKey(secretKey);\n\n return {\n encryptionKey: await createEncryptionKey(publicKey),\n decryptionKey: await createDecryptionKey(secretKey),\n };\n};\n\nexport const initEncryptionKeys = async (\n initParameters?: SessionLinkParameters,\n) => {\n const { encryptionKey, decryptionKey } = await generateKeyPair();\n\n if (\n initParameters\n && \"publicKey\" in initParameters\n && initParameters.publicKey\n ) {\n const relyingEncryptionKey = await parseEncryptionKey(\n initParameters.publicKey as string,\n );\n\n return {\n encryptionKey,\n decryptionKey,\n relyingEncryptionKey,\n };\n }\n\n return {\n encryptionKey,\n decryptionKey,\n relyingEncryptionKey: encryptionKey,\n };\n};\n"]}
@@ -21,15 +21,13 @@ describe("Asymmetric encryption", () => {
21
21
  const key = encryptionKey.toString();
22
22
  const parsedKey = await parseEncryptionKey(key);
23
23
  const parsedEncrypted = await parsedKey.encrypt(message);
24
- console.log("parsedEncrypted", parsedEncrypted);
25
24
  const decodedParsedEncrypted = await decryptionKey.decrypt(parsedEncrypted);
26
- console.log("decodedParsedEncrypted", decodedParsedEncrypted);
27
25
  expect(decodedParsedEncrypted).toBe(message);
28
26
  });
29
27
  test("should be able to encrypt large blob", async () => {
30
28
  const { encryptionKey, decryptionKey } = await generateKeyPair();
31
- const message = new Array(1024 * 1024).fill("a").join("");
32
- console.log("message", message.length);
29
+ const message = Array.from({ length: 1024 * 1024 }).fill("a")
30
+ .join("");
33
31
  const encrypted = await encryptionKey.encrypt(message);
34
32
  const decrypted = await decryptionKey.decrypt(encrypted);
35
33
  expect(decrypted).toBe(message);
@@ -1 +1 @@
1
- {"version":3,"file":"asymmetric.test.js","sourceRoot":"","sources":["../../src/encryption/asymmetric.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;QAExC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC;QAEvB,gCAAgC;QAChC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC;QAEvB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAChD,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE5E,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,sBAAsB,CAAC,CAAC;QAE9D,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"asymmetric.test.js","sourceRoot":"","sources":["../../src/encryption/asymmetric.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;QAExC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC;QAEvB,gCAAgC;QAChC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC;QAEvB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAEzD,MAAM,sBAAsB,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE5E,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;aAC1D,IAAI,CAAC,EAAE,CAAC,CAAC;QAEZ,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from \"vitest\";\n\nimport { generateKeyPair, parseEncryptionKey } from \"./asymmetric.js\";\n\ndescribe(\"Asymmetric encryption\", () => {\n test(\"should generate a key pair\", async () => {\n const keyPair = await generateKeyPair();\n\n expect(keyPair).toBeDefined();\n expect(keyPair.encryptionKey).toBeDefined();\n expect(keyPair.decryptionKey).toBeDefined();\n });\n\n test(\"should encrypt and decrypt a message\", async () => {\n const { encryptionKey, decryptionKey } = await generateKeyPair();\n const message = \"test\";\n\n // regular encryption decryption\n const encrypted = await encryptionKey.encrypt(message);\n const decrypted = await decryptionKey.decrypt(encrypted);\n\n expect(decrypted).toBe(message);\n });\n\n test(\"should encrypt and decrypt a message with a parsed key\", async () => {\n const { encryptionKey, decryptionKey } = await generateKeyPair();\n const message = \"test\";\n\n const key = encryptionKey.toString();\n const parsedKey = await parseEncryptionKey(key);\n const parsedEncrypted = await parsedKey.encrypt(message);\n\n const decodedParsedEncrypted = await decryptionKey.decrypt(parsedEncrypted);\n\n expect(decodedParsedEncrypted).toBe(message);\n });\n\n test(\"should be able to encrypt large blob\", async () => {\n const { encryptionKey, decryptionKey } = await generateKeyPair();\n const message = Array.from({ length: 1024 * 1024 }).fill(\"a\")\n .join(\"\");\n\n const encrypted = await encryptionKey.encrypt(message);\n const decrypted = await decryptionKey.decrypt(encrypted);\n\n expect(decrypted).toBe(message);\n });\n});\n"]}
@@ -1,7 +1,7 @@
1
1
  export const toBase64 = (data) => {
2
2
  let binary = "";
3
- for (let index = 0; index < data.length; index += 1) {
4
- binary += String.fromCharCode(data[index]);
3
+ for (const datum of data) {
4
+ binary += String.fromCodePoint(datum);
5
5
  }
6
6
  return btoa(binary);
7
7
  };
@@ -9,7 +9,7 @@ export const fromBase64 = (value) => {
9
9
  const binary = atob(value);
10
10
  const bytes = new Uint8Array(binary.length);
11
11
  for (let index = 0; index < binary.length; index += 1) {
12
- bytes[index] = binary.charCodeAt(index);
12
+ bytes[index] = binary.codePointAt(index);
13
13
  }
14
14
  return bytes;
15
15
  };
@@ -1 +1 @@
1
- {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/encryption/base64.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAU,EAAE;IACnD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,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,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAc,EAAE;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/encryption/base64.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAgB,EAAU,EAAE;IACnD,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAc,EAAE;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAE,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC","sourcesContent":["export const toBase64 = (data: Uint8Array): string => {\n let binary = \"\";\n\n for (const datum of data) {\n binary += String.fromCodePoint(datum);\n }\n\n return btoa(binary);\n};\n\nexport const fromBase64 = (value: string): Uint8Array => {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.codePointAt(index)!;\n }\n\n return bytes;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"base64.test.js","sourceRoot":"","sources":["../../src/encryption/base64.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEnD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"base64.test.js","sourceRoot":"","sources":["../../src/encryption/base64.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEnD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE9B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from \"vitest\";\n\nimport { fromBase64, toBase64 } from \"./base64.js\";\n\ndescribe(\"Base64\", () => {\n test(\"should convert Uint8Array to base64\", () => {\n const data = new Uint8Array([0x00, 0x01, 0x02, 0x03]);\n const base64 = toBase64(data);\n\n expect(base64).toBe(\"AAECAw==\");\n });\n\n test(\"should convert base64 to Uint8Array\", () => {\n const base64 = \"AAECAw==\";\n const data = fromBase64(base64);\n\n expect(data).toEqual(new Uint8Array([0x00, 0x01, 0x02, 0x03]));\n });\n\n test(\"should be transparent\", () => {\n const input = [1, 2, 3, 4];\n const base64 = toBase64(new Uint8Array(input));\n const data = fromBase64(base64);\n\n expect(data).toEqual(new Uint8Array(input));\n });\n});\n"]}
@@ -1,5 +1,6 @@
1
+ const decodeHex = (value) => new Uint8Array(value.match(/.{2}/g).map(byte => Number.parseInt(byte, 16)));
1
2
  export const deriveSymmetricKey = async (k) => {
2
- const baseKey = new TextEncoder().encode(k);
3
+ const baseKey = decodeHex(k);
3
4
  const sharedSecret = await crypto.subtle.importKey("raw", baseKey, { name: "AES-GCM" }, false, ["encrypt", "decrypt"]);
4
5
  return {
5
6
  toString: () => k,
@@ -14,7 +15,7 @@ export const deriveSymmetricKey = async (k) => {
14
15
  decrypt: async (message) => {
15
16
  const combined = new Uint8Array(atob(message)
16
17
  .split("")
17
- .map((char) => char.charCodeAt(0)));
18
+ .map(char => char.codePointAt(0)));
18
19
  const iv = combined.slice(0, 12);
19
20
  const encrypted = combined.slice(12);
20
21
  const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, sharedSecret, encrypted);
@@ -30,7 +31,7 @@ export const generateHandshakeKey = async () => {
30
31
  const array = new Uint8Array(16);
31
32
  crypto.getRandomValues(array);
32
33
  const keyHex = Array.from(array)
33
- .map((b) => b.toString(16).padStart(2, "0"))
34
+ .map(b => b.toString(16).padStart(2, "0"))
34
35
  .join("");
35
36
  return await deriveSymmetricKey(keyHex);
36
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../src/encryption/handshake.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,CAAS,EAAyB,EAAE;IAC3E,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAChD,KAAK,EACL,OAAO,EACP,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,KAAK,EACL,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;YACjC,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,YAAY,EACZ,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAClC,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YAElE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YAEnD,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAC7B,IAAI,CAAC,OAAO,CAAC;iBACV,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CACrC,CAAC;YACF,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,YAAY,EACZ,SAAS,CACV,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAElC,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAA2B,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC"}
1
+ {"version":3,"file":"handshake.js","sourceRoot":"","sources":["../../src/encryption/handshake.ts"],"names":[],"mappings":"AAMA,MAAM,SAAS,GAAG,CAAC,KAAa,EAA2B,EAAE,CAAC,IAAI,UAAU,CAC1E,KAAK,CAAC,KAAK,CAAC,OAAO,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAC7D,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,CAAS,EAAyB,EAAE;IAC3E,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAE7B,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAChD,KAAK,EACL,OAAO,EACP,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,KAAK,EACL,CAAC,SAAS,EAAE,SAAS,CAAC,CACvB,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;YACjC,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,YAAY,EACZ,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAClC,CAAC;YACF,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YAElE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,QAAQ,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;YAEnD,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;YACjC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAC7B,IAAI,CAAC,OAAO,CAAC;iBACV,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CACrC,CAAC;YACF,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAC3C,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EACvB,YAAY,EACZ,SAAS,CACV,CAAC;YACF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAElC,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAA2B,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAEjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SAC7B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC,CAAC","sourcesContent":["export type SymmetricKey = {\n toString: () => string;\n encrypt: (message: string) => Promise<string>;\n decrypt: (message: string) => Promise<string>;\n};\n\nconst decodeHex = (value: string): Uint8Array<ArrayBuffer> => new Uint8Array(\n value.match(/.{2}/g)!.map(byte => Number.parseInt(byte, 16)),\n);\n\nexport const deriveSymmetricKey = async (k: string): Promise<SymmetricKey> => {\n const baseKey = decodeHex(k);\n\n const sharedSecret = await crypto.subtle.importKey(\n \"raw\",\n baseKey,\n { name: \"AES-GCM\" },\n false,\n [\"encrypt\", \"decrypt\"],\n );\n\n return {\n toString: () => k,\n encrypt: async (message: string) => {\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encrypted = await crypto.subtle.encrypt(\n { name: \"AES-GCM\", iv },\n sharedSecret,\n new TextEncoder().encode(message),\n );\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode.apply(null, Array.from(combined)));\n },\n decrypt: async (message: string) => {\n const combined = new Uint8Array(\n atob(message)\n .split(\"\")\n .map(char => char.codePointAt(0)!),\n );\n const iv = combined.slice(0, 12);\n const encrypted = combined.slice(12);\n const decrypted = await crypto.subtle.decrypt(\n { name: \"AES-GCM\", iv },\n sharedSecret,\n encrypted,\n );\n const decoder = new TextDecoder();\n\n return decoder.decode(decrypted);\n },\n };\n};\n\n/**\n * Generate a 16-byte random shared key and return as hex\n */\nexport const generateHandshakeKey = async (): Promise<SymmetricKey> => {\n const array = new Uint8Array(16);\n\n crypto.getRandomValues(array);\n\n const keyHex = Array.from(array)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return await deriveSymmetricKey(keyHex);\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, test } from "vitest";
2
- import { generateHandshakeKey } from "./handshake.js";
2
+ import { deriveSymmetricKey, generateHandshakeKey } from "./handshake.js";
3
3
  describe("Handshake", async () => {
4
4
  const key = await generateHandshakeKey();
5
5
  test("should generate a 16-byte random shared key", () => {
@@ -12,5 +12,11 @@ describe("Handshake", async () => {
12
12
  const decrypted = await key.decrypt(encrypted);
13
13
  expect(decrypted).toBe(message);
14
14
  });
15
+ test("should derive symmetric key from decoded hex bytes", async () => {
16
+ const key = await deriveSymmetricKey("000102030405060708090a0b0c0d0e0f");
17
+ const encrypted = await key.encrypt("hello");
18
+ const rederived = await deriveSymmetricKey("000102030405060708090a0b0c0d0e0f");
19
+ await expect(rederived.decrypt(encrypted)).resolves.toBe("hello");
20
+ });
15
21
  });
16
22
  //# sourceMappingURL=handshake.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handshake.test.js","sourceRoot":"","sources":["../../src/encryption/handshake.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC/B,MAAM,GAAG,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAEzC,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"handshake.test.js","sourceRoot":"","sources":["../../src/encryption/handshake.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC/B,MAAM,GAAG,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAEzC,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,kCAAkC,CAAC,CAAC;QAE/E,MAAM,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from \"vitest\";\n\nimport { deriveSymmetricKey, generateHandshakeKey } from \"./handshake.js\";\n\ndescribe(\"Handshake\", async () => {\n const key = await generateHandshakeKey();\n\n test(\"should generate a 16-byte random shared key\", () => {\n expect(key).toBeDefined();\n expect(key.toString()).toHaveLength(32);\n });\n\n test(\"should encrypt and decrypt a message\", async () => {\n const message = \"test\";\n const encrypted = await key.encrypt(message);\n const decrypted = await key.decrypt(encrypted);\n\n expect(decrypted).toBe(message);\n });\n\n test(\"should derive symmetric key from decoded hex bytes\", async () => {\n const key = await deriveSymmetricKey(\"000102030405060708090a0b0c0d0e0f\");\n const encrypted = await key.encrypt(\"hello\");\n const rederived = await deriveSymmetricKey(\"000102030405060708090a0b0c0d0e0f\");\n\n await expect(rederived.decrypt(encrypted)).resolves.toBe(\"hello\");\n });\n});\n"]}
@@ -7,7 +7,7 @@ export const hashPublicKey = async (publicKey) => {
7
7
  const hash = await crypto.subtle.digest("SHA-256", buffer);
8
8
  const hashArray = new Uint8Array(hash);
9
9
  const hashHex = Array.from(hashArray)
10
- .map((b) => b.toString(16).padStart(2, "0"))
10
+ .map(b => b.toString(16).padStart(2, "0"))
11
11
  .join("");
12
12
  return hashHex.slice(0, HASH_LENGTH);
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/encryption/hash.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,SAAwB,EACP,EAAE;IACnB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,SAAwB,EACxB,IAAY,EACM,EAAE;IACpB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,WAA+B,EAC/B,aAA4B,EAC5B,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;IAEhC,OAAO;QACL,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/encryption/hash.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,SAAwB,EACP,EAAE;IACnB,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,SAAwB,EACxB,IAAY,EACM,EAAE;IACpB,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAEpD,OAAO,YAAY,KAAK,IAAI,CAAC;AAC/B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,WAA+B,EAC/B,aAA4B,EAC5B,EAAE;IACF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,WAAW,IAAI,OAAO,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC;IAEhC,OAAO;QACL,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { EncryptionKey } from \"./asymmetric.js\";\n\nconst HASH_LENGTH = 16;\n\n/**\n * Hashes a public key using SHA-256 and returns the first 16 bytes as a hex string\n */\nexport const hashPublicKey = async (\n publicKey: EncryptionKey,\n): Promise<string> => {\n const buffer = new TextEncoder().encode(publicKey.toString());\n const hash = await crypto.subtle.digest(\"SHA-256\", buffer);\n const hashArray = new Uint8Array(hash);\n const hashHex = Array.from(hashArray)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return hashHex.slice(0, HASH_LENGTH);\n};\n\nexport const validatePublicKeyHash = async (\n publicKey: EncryptionKey,\n hash: string,\n): Promise<boolean> => {\n const computedHash = await hashPublicKey(publicKey);\n\n return computedHash === hash;\n};\n\n/**\n * determines/or generates the hash and dictates wether is host or not\n */\nexport const initHash = async (\n initialHash: string | undefined,\n encryptionKey: EncryptionKey,\n) => {\n const ourHash = await hashPublicKey(encryptionKey);\n const hash = initialHash || ourHash;\n const isHost = hash === ourHash;\n\n return {\n hash,\n isHost,\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/encryption/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/encryption/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC","sourcesContent":["/** biome-ignore-all lint/performance/noReExportAll: package entrypoint */\n/** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */\n\nexport * from \"./asymmetric.js\";\nexport * from \"./handshake.js\";\nexport * from \"./hash.js\";\nexport * from \"./random.js\";\n"]}
@@ -9,13 +9,11 @@ export const generateUrlSafeRandomString = (length) => {
9
9
  const array = new Uint8Array(length);
10
10
  crypto.getRandomValues(array);
11
11
  return Array.from(array)
12
- .map((byte) => URL_SAFE_ALPHABET[byte % URL_SAFE_ALPHABET.length])
12
+ .map(byte => URL_SAFE_ALPHABET[byte % URL_SAFE_ALPHABET.length])
13
13
  .join("");
14
14
  };
15
15
  /**
16
16
  * Generate a 16-character URL-safe session ID
17
17
  */
18
- export const generateSessionId = () => {
19
- return generateUrlSafeRandomString(16);
20
- };
18
+ export const generateSessionId = () => generateUrlSafeRandomString(16);
21
19
  //# sourceMappingURL=random.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/encryption/random.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,iBAAiB,GACrB,kEAAkE,CAAC;AAErE;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAc,EAAU,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;SACjE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAW,EAAE;IAC5C,OAAO,2BAA2B,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC,CAAC"}
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../../src/encryption/random.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,iBAAiB,GACnB,kEAAkE,CAAC;AAEvE;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,MAAc,EAAU,EAAE;IACpE,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAErC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;SAC/D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAW,EAAE,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC","sourcesContent":["/**\n * URL-safe alphabet for session ID generation\n */\nconst URL_SAFE_ALPHABET\n = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n/**\n * Generate a cryptographically secure URL-safe random string\n */\nexport const generateUrlSafeRandomString = (length: number): string => {\n const array = new Uint8Array(length);\n\n crypto.getRandomValues(array);\n\n return Array.from(array)\n .map(byte => URL_SAFE_ALPHABET[byte % URL_SAFE_ALPHABET.length])\n .join(\"\");\n};\n\n/**\n * Generate a 16-character URL-safe session ID\n */\nexport const generateSessionId = (): string => generateUrlSafeRandomString(16);\n"]}
@@ -2,7 +2,7 @@ type ErrorConfig = {
2
2
  getDocsUrl?: ((args: BaseErrorParameters) => string | undefined) | undefined;
3
3
  version?: string | undefined;
4
4
  };
5
- export declare function setErrorConfig(config: ErrorConfig): void;
5
+ export declare const setErrorConfig: (config: ErrorConfig) => void;
6
6
  type BaseErrorParameters = {
7
7
  cause?: BaseError | Error | undefined;
8
8
  details?: string | undefined;
@@ -26,4 +26,7 @@ export declare class BaseError extends Error {
26
26
  walk(): Error;
27
27
  walk(fn: (err: unknown) => boolean): Error | null;
28
28
  }
29
+ export declare class SignalNoConnectionError extends BaseError {
30
+ constructor();
31
+ }
29
32
  export {};
@@ -1,4 +1,5 @@
1
- const version = `openlv@0.0.1-beta.1`;
1
+ import packageJson from "../package.json" with { type: "json" };
2
+ const version = `openlv@${packageJson.version}`;
2
3
  let errorConfig = {
3
4
  // getDocsUrl: ({
4
5
  // docsBaseUrl,
@@ -11,9 +12,9 @@ let errorConfig = {
11
12
  // : undefined,
12
13
  version,
13
14
  };
14
- export function setErrorConfig(config) {
15
+ export const setErrorConfig = (config) => {
15
16
  errorConfig = config;
16
- }
17
+ };
17
18
  export class BaseError extends Error {
18
19
  constructor(shortMessage, args = {}) {
19
20
  const details = (() => {
@@ -85,14 +86,19 @@ export class BaseError extends Error {
85
86
  return walk(this, fn);
86
87
  }
87
88
  }
88
- function walk(err, fn) {
89
+ const walk = (err, fn) => {
89
90
  if (fn?.(err))
90
91
  return err;
91
- if (err &&
92
- typeof err === "object" &&
93
- "cause" in err &&
94
- err.cause !== undefined)
92
+ if (err
93
+ && typeof err === "object"
94
+ && "cause" in err
95
+ && err.cause !== undefined)
95
96
  return walk(err.cause, fn);
96
97
  return fn ? null : err;
98
+ };
99
+ export class SignalNoConnectionError extends BaseError {
100
+ constructor() {
101
+ super(["Hello", "World"].join("\n"), { name: "SignalConnectionError" });
102
+ }
97
103
  }
98
- //# sourceMappingURL=base.js.map
104
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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","sourcesContent":["import packageJson from \"../package.json\" with { type: \"json\" };\n\nconst version = `openlv@${packageJson.version}`;\n\ntype ErrorConfig = {\n getDocsUrl?:\n | ((args: BaseErrorParameters) => string | undefined)\n | undefined;\n version?: string | undefined;\n};\n\nlet errorConfig: ErrorConfig = {\n // getDocsUrl: ({\n // docsBaseUrl,\n // docsPath = '',\n // docsSlug,\n // }: BaseErrorParameters) =>\n // docsPath\n // ? `${docsBaseUrl ?? 'https://viem.sh'}${docsPath}${docsSlug ? `#${docsSlug}` : ''\n // }`\n // : undefined,\n version,\n};\n\nexport const setErrorConfig = (config: ErrorConfig) => {\n errorConfig = config;\n};\n\ntype BaseErrorParameters = {\n cause?: BaseError | Error | undefined;\n details?: string | undefined;\n docsBaseUrl?: string | undefined;\n docsPath?: string | undefined;\n docsSlug?: string | undefined;\n metaMessages?: string[] | undefined;\n name?: string | undefined;\n};\n\nexport type BaseErrorType = BaseError & { name: \"BaseError\"; };\nexport class BaseError extends Error {\n details: string;\n docsPath?: string | undefined;\n metaMessages?: string[] | undefined;\n shortMessage: string;\n version: string;\n\n override name = \"BaseError\";\n\n constructor(shortMessage: string, args: BaseErrorParameters = {}) {\n const details = (() => {\n if (args.cause instanceof BaseError) return args.cause.details;\n\n if (args.cause?.message) return args.cause.message;\n\n return args.details!;\n })();\n const docsPath = (() => {\n if (args.cause instanceof BaseError)\n return args.cause.docsPath || args.docsPath;\n\n return args.docsPath;\n })();\n const docsUrl = errorConfig.getDocsUrl?.({ ...args, docsPath });\n\n const message = [\n shortMessage || \"An error occurred.\",\n \"\",\n ...(args.metaMessages ? [...args.metaMessages, \"\"] : []),\n ...(docsUrl ? [`Docs: ${docsUrl}`] : []),\n ...(details ? [`Details: ${details}`] : []),\n ...(errorConfig.version ? [`Version: ${errorConfig.version}`] : []),\n ].join(\"\\n\");\n\n super(message, args.cause ? { cause: args.cause } : undefined);\n\n this.details = details;\n this.docsPath = docsPath;\n this.metaMessages = args.metaMessages;\n this.name = args.name ?? this.name;\n this.shortMessage = shortMessage;\n this.version = version;\n }\n\n walk(): Error;\n walk(fn: (err: unknown) => boolean): Error | null;\n walk(fn?: (err: unknown) => boolean): Error | null {\n return walk(this, fn) as Error | null;\n }\n}\n\nconst walk = (\n err: unknown,\n fn?: ((err: unknown) => boolean) | undefined,\n): unknown => {\n if (fn?.(err)) return err;\n\n if (\n err\n && typeof err === \"object\"\n && \"cause\" in err\n && err.cause !== undefined\n )\n return walk(err.cause, fn);\n\n return fn ? null : err;\n};\n\nexport class SignalNoConnectionError extends BaseError {\n constructor() {\n super([\"Hello\", \"World\"].join(\"\\n\"), { name: \"SignalConnectionError\" });\n }\n}\n"]}
@@ -1,3 +1,3 @@
1
- const openLvIcon = '<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg" style="color: #fe7d37;"><path d="M318.354 141.355C333.64 141.355 346.952 152.55 356.358 170.152C365.791 187.805 371.5 212.223 371.5 239.509V338.41C371.5 342.98 369.686 347.365 366.457 350.597C363.228 353.829 358.849 355.644 354.282 355.645H228.536C223.969 355.644 219.589 353.829 216.36 350.597C213.131 347.365 211.318 342.98 211.318 338.41V311.256C202 327.486 189.221 337.662 174.646 337.662C159.36 337.662 146.048 326.468 136.642 308.865C127.209 291.213 121.5 266.794 121.5 239.509C121.5 212.223 127.209 187.805 136.642 170.152C146.048 152.55 159.36 141.355 174.646 141.355H318.354ZM204.572 157.842C217.61 173.942 226.28 200.459 227.599 231.266H246.5C248.685 231.266 250.78 232.135 252.324 233.681C253.869 235.227 254.736 237.323 254.736 239.509C254.736 241.695 253.869 243.791 252.324 245.337C250.78 246.883 248.685 247.752 246.5 247.752H227.791V338.41C227.791 338.609 227.87 338.799 228.01 338.939C228.15 339.079 228.339 339.158 228.536 339.158H354.282C354.479 339.158 354.669 339.079 354.809 338.939C354.948 338.799 355.027 338.609 355.027 338.41V247.752H336.318C334.133 247.752 332.038 246.883 330.493 245.337C328.949 243.791 328.082 241.694 328.082 239.509C328.082 237.323 328.949 235.227 330.493 233.681C332.038 232.135 334.133 231.266 336.318 231.266H354.827C353.818 209.144 348.822 190.829 342.011 178.012C334.979 164.781 326.28 157.842 318.354 157.842H204.572ZM174.646 157.842C170.506 157.842 166.154 159.719 161.895 163.468C157.636 167.216 153.548 172.774 149.989 179.939C142.873 194.267 137.973 214.821 137.973 239.509C137.973 264.197 142.873 284.752 149.989 299.079C153.548 306.244 157.636 311.803 161.895 315.551C166.154 319.3 170.506 321.176 174.646 321.176C178.785 321.176 183.137 319.3 187.396 315.552C191.655 311.804 195.743 306.248 199.302 299.083C206.418 284.757 211.318 264.203 211.318 239.509C211.318 214.821 206.418 194.267 199.302 179.939C195.743 172.774 191.655 167.216 187.396 163.468C183.137 159.719 178.785 157.842 174.646 157.842ZM174.646 226.771C178.021 226.771 181.259 228.113 183.646 230.502C186.032 232.891 187.373 236.131 187.373 239.509C187.373 242.028 186.627 244.491 185.229 246.586C183.83 248.681 181.842 250.314 179.517 251.278C177.191 252.243 174.631 252.495 172.162 252.003C169.693 251.511 167.425 250.298 165.646 248.517C163.866 246.735 162.654 244.465 162.163 241.994C161.672 239.523 161.924 236.962 162.887 234.635C163.85 232.307 165.481 230.318 167.574 228.918C169.667 227.518 172.128 226.771 174.646 226.771ZM300.391 231.266C302.576 231.266 304.671 232.135 306.216 233.681C307.76 235.227 308.627 237.323 308.627 239.509C308.627 241.694 307.76 243.791 306.216 245.337C304.671 246.883 302.576 247.752 300.391 247.752H282.428C280.243 247.752 278.147 246.883 276.603 245.337C275.058 243.791 274.19 241.694 274.19 239.509C274.19 237.323 275.058 235.227 276.603 233.681C278.147 232.135 280.243 231.266 282.428 231.266H300.391Z" fill="currentColor" stroke="currentColor" stroke-width="3"/><path d="M361.576 433C367.651 433.042 372.542 438 372.501 444.074C372.46 450.149 367.501 455.04 361.426 454.999L287.926 454.499C281.851 454.457 276.96 449.5 277.001 443.425C277.042 437.35 282.001 432.459 288.076 432.5L361.576 433ZM65.8721 418.682C68.8091 413.364 75.5006 411.434 80.8184 414.37C91.4364 420.234 118.045 431.791 139.861 432.506C159.077 433.136 187.16 432.832 196.622 432.506C202.693 432.297 207.784 437.049 207.994 443.12C208.203 449.191 203.451 454.284 197.38 454.493C187.508 454.834 158.925 455.142 139.141 454.493C112.158 453.608 81.8993 440.099 70.1836 433.629C64.8655 430.692 62.9352 424 65.8721 418.682ZM450.445 304.61C456.459 303.752 462.031 307.93 462.891 313.943C466.733 340.838 467.437 337.258 469.466 362.622C470.429 374.662 467.727 387.312 464.389 397.731C461.013 408.267 456.677 417.463 453.562 422.939C450.557 428.219 443.842 430.064 438.562 427.061C433.281 424.056 431.436 417.34 434.44 412.06C436.825 407.869 440.539 400.065 443.438 391.018C446.375 381.854 448.173 372.337 447.536 364.377C445.565 339.742 445.269 346.16 441.111 317.055C440.253 311.041 444.432 305.47 450.445 304.61ZM50.9824 264.547C57.031 263.985 62.3912 268.432 62.9541 274.48C64.4004 290.028 62.5774 325.126 56.6836 349.123C55.2346 355.023 49.2766 358.63 43.377 357.182C37.4775 355.732 33.8695 349.776 35.3184 343.876C40.6243 322.273 42.2682 289.638 41.0479 276.519C40.4853 270.47 44.9335 265.11 50.9824 264.547ZM456.157 143.032C462.214 142.567 467.503 147.099 467.969 153.156C470.807 190.052 468.426 217.548 465.649 228.26C464.125 234.14 458.121 237.672 452.24 236.147C446.36 234.623 442.828 228.62 444.353 222.739C446.242 215.45 448.795 190.745 446.033 154.843C445.568 148.786 450.1 143.498 456.157 143.032ZM56.5391 78.1777C60.3071 73.4125 67.2249 72.6033 71.9902 76.3711C76.7553 80.1391 77.5637 87.057 73.7959 91.8223C71.2797 95.0046 67.2903 100.648 63.8408 106.811C60.2144 113.289 57.9762 118.966 57.6133 122.595C56.1782 136.946 57.668 156.507 57.668 164.5V183.5C57.6679 189.575 52.7427 194.5 46.668 194.5C40.5929 194.5 35.668 189.575 35.668 183.5V164.5C35.668 159.493 34.1578 136.054 35.7227 120.405C36.5598 112.035 40.7378 103.044 44.6445 96.0645C48.7283 88.7689 53.3887 82.162 56.5391 78.1777ZM299.442 44.5137C309.489 44.0029 334.979 43.287 357.111 44.5166C370.073 45.2368 385.732 50.9517 399.119 56.9824C412.843 63.1653 425.631 70.3596 433.331 75.1719C438.482 78.3916 440.048 85.1776 436.829 90.3291C433.609 95.4808 426.823 97.0468 421.671 93.8271C414.704 89.4729 402.792 82.7664 390.083 77.041C377.037 71.1636 364.529 66.9624 355.891 66.4824C334.824 65.3121 310.181 65.9962 300.56 66.4854C294.492 66.7939 289.324 62.1249 289.016 56.0576C288.708 49.9907 293.375 44.8222 299.442 44.5137ZM171.858 44.0498C187.6 43.8642 205.309 44.1678 216.822 44.5039C222.894 44.6816 227.673 49.7482 227.496 55.8203C227.319 61.8927 222.252 66.6722 216.18 66.4951C204.86 66.1646 187.468 65.8678 172.118 66.0488C164.427 66.1395 157.389 66.3484 151.934 66.7178C149.195 66.9032 147.009 67.1197 145.413 67.3525C144.301 67.5148 143.806 67.6393 143.724 67.6543C138.326 69.9036 132.063 67.5277 129.548 62.1836C126.961 56.6867 129.321 50.1336 134.817 47.5469L135.286 47.3359C137.655 46.3203 140.36 45.8569 142.237 45.583C144.622 45.2352 147.433 44.9727 150.447 44.7686C156.499 44.3588 164.005 44.1424 171.858 44.0498Z" fill="currentColor"/></svg>';
1
+ const openLvIcon = "<svg width=\"500\" height=\"500\" viewBox=\"0 0 500 500\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" style=\"color: #fe7d37;\"><path d=\"M318.354 141.355C333.64 141.355 346.952 152.55 356.358 170.152C365.791 187.805 371.5 212.223 371.5 239.509V338.41C371.5 342.98 369.686 347.365 366.457 350.597C363.228 353.829 358.849 355.644 354.282 355.645H228.536C223.969 355.644 219.589 353.829 216.36 350.597C213.131 347.365 211.318 342.98 211.318 338.41V311.256C202 327.486 189.221 337.662 174.646 337.662C159.36 337.662 146.048 326.468 136.642 308.865C127.209 291.213 121.5 266.794 121.5 239.509C121.5 212.223 127.209 187.805 136.642 170.152C146.048 152.55 159.36 141.355 174.646 141.355H318.354ZM204.572 157.842C217.61 173.942 226.28 200.459 227.599 231.266H246.5C248.685 231.266 250.78 232.135 252.324 233.681C253.869 235.227 254.736 237.323 254.736 239.509C254.736 241.695 253.869 243.791 252.324 245.337C250.78 246.883 248.685 247.752 246.5 247.752H227.791V338.41C227.791 338.609 227.87 338.799 228.01 338.939C228.15 339.079 228.339 339.158 228.536 339.158H354.282C354.479 339.158 354.669 339.079 354.809 338.939C354.948 338.799 355.027 338.609 355.027 338.41V247.752H336.318C334.133 247.752 332.038 246.883 330.493 245.337C328.949 243.791 328.082 241.694 328.082 239.509C328.082 237.323 328.949 235.227 330.493 233.681C332.038 232.135 334.133 231.266 336.318 231.266H354.827C353.818 209.144 348.822 190.829 342.011 178.012C334.979 164.781 326.28 157.842 318.354 157.842H204.572ZM174.646 157.842C170.506 157.842 166.154 159.719 161.895 163.468C157.636 167.216 153.548 172.774 149.989 179.939C142.873 194.267 137.973 214.821 137.973 239.509C137.973 264.197 142.873 284.752 149.989 299.079C153.548 306.244 157.636 311.803 161.895 315.551C166.154 319.3 170.506 321.176 174.646 321.176C178.785 321.176 183.137 319.3 187.396 315.552C191.655 311.804 195.743 306.248 199.302 299.083C206.418 284.757 211.318 264.203 211.318 239.509C211.318 214.821 206.418 194.267 199.302 179.939C195.743 172.774 191.655 167.216 187.396 163.468C183.137 159.719 178.785 157.842 174.646 157.842ZM174.646 226.771C178.021 226.771 181.259 228.113 183.646 230.502C186.032 232.891 187.373 236.131 187.373 239.509C187.373 242.028 186.627 244.491 185.229 246.586C183.83 248.681 181.842 250.314 179.517 251.278C177.191 252.243 174.631 252.495 172.162 252.003C169.693 251.511 167.425 250.298 165.646 248.517C163.866 246.735 162.654 244.465 162.163 241.994C161.672 239.523 161.924 236.962 162.887 234.635C163.85 232.307 165.481 230.318 167.574 228.918C169.667 227.518 172.128 226.771 174.646 226.771ZM300.391 231.266C302.576 231.266 304.671 232.135 306.216 233.681C307.76 235.227 308.627 237.323 308.627 239.509C308.627 241.694 307.76 243.791 306.216 245.337C304.671 246.883 302.576 247.752 300.391 247.752H282.428C280.243 247.752 278.147 246.883 276.603 245.337C275.058 243.791 274.19 241.694 274.19 239.509C274.19 237.323 275.058 235.227 276.603 233.681C278.147 232.135 280.243 231.266 282.428 231.266H300.391Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"3\"/><path d=\"M361.576 433C367.651 433.042 372.542 438 372.501 444.074C372.46 450.149 367.501 455.04 361.426 454.999L287.926 454.499C281.851 454.457 276.96 449.5 277.001 443.425C277.042 437.35 282.001 432.459 288.076 432.5L361.576 433ZM65.8721 418.682C68.8091 413.364 75.5006 411.434 80.8184 414.37C91.4364 420.234 118.045 431.791 139.861 432.506C159.077 433.136 187.16 432.832 196.622 432.506C202.693 432.297 207.784 437.049 207.994 443.12C208.203 449.191 203.451 454.284 197.38 454.493C187.508 454.834 158.925 455.142 139.141 454.493C112.158 453.608 81.8993 440.099 70.1836 433.629C64.8655 430.692 62.9352 424 65.8721 418.682ZM450.445 304.61C456.459 303.752 462.031 307.93 462.891 313.943C466.733 340.838 467.437 337.258 469.466 362.622C470.429 374.662 467.727 387.312 464.389 397.731C461.013 408.267 456.677 417.463 453.562 422.939C450.557 428.219 443.842 430.064 438.562 427.061C433.281 424.056 431.436 417.34 434.44 412.06C436.825 407.869 440.539 400.065 443.438 391.018C446.375 381.854 448.173 372.337 447.536 364.377C445.565 339.742 445.269 346.16 441.111 317.055C440.253 311.041 444.432 305.47 450.445 304.61ZM50.9824 264.547C57.031 263.985 62.3912 268.432 62.9541 274.48C64.4004 290.028 62.5774 325.126 56.6836 349.123C55.2346 355.023 49.2766 358.63 43.377 357.182C37.4775 355.732 33.8695 349.776 35.3184 343.876C40.6243 322.273 42.2682 289.638 41.0479 276.519C40.4853 270.47 44.9335 265.11 50.9824 264.547ZM456.157 143.032C462.214 142.567 467.503 147.099 467.969 153.156C470.807 190.052 468.426 217.548 465.649 228.26C464.125 234.14 458.121 237.672 452.24 236.147C446.36 234.623 442.828 228.62 444.353 222.739C446.242 215.45 448.795 190.745 446.033 154.843C445.568 148.786 450.1 143.498 456.157 143.032ZM56.5391 78.1777C60.3071 73.4125 67.2249 72.6033 71.9902 76.3711C76.7553 80.1391 77.5637 87.057 73.7959 91.8223C71.2797 95.0046 67.2903 100.648 63.8408 106.811C60.2144 113.289 57.9762 118.966 57.6133 122.595C56.1782 136.946 57.668 156.507 57.668 164.5V183.5C57.6679 189.575 52.7427 194.5 46.668 194.5C40.5929 194.5 35.668 189.575 35.668 183.5V164.5C35.668 159.493 34.1578 136.054 35.7227 120.405C36.5598 112.035 40.7378 103.044 44.6445 96.0645C48.7283 88.7689 53.3887 82.162 56.5391 78.1777ZM299.442 44.5137C309.489 44.0029 334.979 43.287 357.111 44.5166C370.073 45.2368 385.732 50.9517 399.119 56.9824C412.843 63.1653 425.631 70.3596 433.331 75.1719C438.482 78.3916 440.048 85.1776 436.829 90.3291C433.609 95.4808 426.823 97.0468 421.671 93.8271C414.704 89.4729 402.792 82.7664 390.083 77.041C377.037 71.1636 364.529 66.9624 355.891 66.4824C334.824 65.3121 310.181 65.9962 300.56 66.4854C294.492 66.7939 289.324 62.1249 289.016 56.0576C288.708 49.9907 293.375 44.8222 299.442 44.5137ZM171.858 44.0498C187.6 43.8642 205.309 44.1678 216.822 44.5039C222.894 44.6816 227.673 49.7482 227.496 55.8203C227.319 61.8927 222.252 66.6722 216.18 66.4951C204.86 66.1646 187.468 65.8678 172.118 66.0488C164.427 66.1395 157.389 66.3484 151.934 66.7178C149.195 66.9032 147.009 67.1197 145.413 67.3525C144.301 67.5148 143.806 67.6393 143.724 67.6543C138.326 69.9036 132.063 67.5277 129.548 62.1836C126.961 56.6867 129.321 50.1336 134.817 47.5469L135.286 47.3359C137.655 46.3203 140.36 45.8569 142.237 45.583C144.622 45.2352 147.433 44.9727 150.447 44.7686C156.499 44.3588 164.005 44.1424 171.858 44.0498Z\" fill=\"currentColor\"/></svg>";
2
2
  export const OPENLV_ICON_128_WHITE = `data:image/svg+xml;base64,${btoa(openLvIcon)}`;
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GACd,mtMAAmtM,CAAC;AAEttM,MAAM,CAAC,MAAM,qBAAqB,GAAG,6BAA6B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/icons/index.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GACZ,2uMAA2uM,CAAC;AAEhvM,MAAM,CAAC,MAAM,qBAAqB,GAAG,6BAA6B,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC","sourcesContent":["const openLvIcon\n = \"<svg width=\\\"500\\\" height=\\\"500\\\" viewBox=\\\"0 0 500 500\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" style=\\\"color: #fe7d37;\\\"><path d=\\\"M318.354 141.355C333.64 141.355 346.952 152.55 356.358 170.152C365.791 187.805 371.5 212.223 371.5 239.509V338.41C371.5 342.98 369.686 347.365 366.457 350.597C363.228 353.829 358.849 355.644 354.282 355.645H228.536C223.969 355.644 219.589 353.829 216.36 350.597C213.131 347.365 211.318 342.98 211.318 338.41V311.256C202 327.486 189.221 337.662 174.646 337.662C159.36 337.662 146.048 326.468 136.642 308.865C127.209 291.213 121.5 266.794 121.5 239.509C121.5 212.223 127.209 187.805 136.642 170.152C146.048 152.55 159.36 141.355 174.646 141.355H318.354ZM204.572 157.842C217.61 173.942 226.28 200.459 227.599 231.266H246.5C248.685 231.266 250.78 232.135 252.324 233.681C253.869 235.227 254.736 237.323 254.736 239.509C254.736 241.695 253.869 243.791 252.324 245.337C250.78 246.883 248.685 247.752 246.5 247.752H227.791V338.41C227.791 338.609 227.87 338.799 228.01 338.939C228.15 339.079 228.339 339.158 228.536 339.158H354.282C354.479 339.158 354.669 339.079 354.809 338.939C354.948 338.799 355.027 338.609 355.027 338.41V247.752H336.318C334.133 247.752 332.038 246.883 330.493 245.337C328.949 243.791 328.082 241.694 328.082 239.509C328.082 237.323 328.949 235.227 330.493 233.681C332.038 232.135 334.133 231.266 336.318 231.266H354.827C353.818 209.144 348.822 190.829 342.011 178.012C334.979 164.781 326.28 157.842 318.354 157.842H204.572ZM174.646 157.842C170.506 157.842 166.154 159.719 161.895 163.468C157.636 167.216 153.548 172.774 149.989 179.939C142.873 194.267 137.973 214.821 137.973 239.509C137.973 264.197 142.873 284.752 149.989 299.079C153.548 306.244 157.636 311.803 161.895 315.551C166.154 319.3 170.506 321.176 174.646 321.176C178.785 321.176 183.137 319.3 187.396 315.552C191.655 311.804 195.743 306.248 199.302 299.083C206.418 284.757 211.318 264.203 211.318 239.509C211.318 214.821 206.418 194.267 199.302 179.939C195.743 172.774 191.655 167.216 187.396 163.468C183.137 159.719 178.785 157.842 174.646 157.842ZM174.646 226.771C178.021 226.771 181.259 228.113 183.646 230.502C186.032 232.891 187.373 236.131 187.373 239.509C187.373 242.028 186.627 244.491 185.229 246.586C183.83 248.681 181.842 250.314 179.517 251.278C177.191 252.243 174.631 252.495 172.162 252.003C169.693 251.511 167.425 250.298 165.646 248.517C163.866 246.735 162.654 244.465 162.163 241.994C161.672 239.523 161.924 236.962 162.887 234.635C163.85 232.307 165.481 230.318 167.574 228.918C169.667 227.518 172.128 226.771 174.646 226.771ZM300.391 231.266C302.576 231.266 304.671 232.135 306.216 233.681C307.76 235.227 308.627 237.323 308.627 239.509C308.627 241.694 307.76 243.791 306.216 245.337C304.671 246.883 302.576 247.752 300.391 247.752H282.428C280.243 247.752 278.147 246.883 276.603 245.337C275.058 243.791 274.19 241.694 274.19 239.509C274.19 237.323 275.058 235.227 276.603 233.681C278.147 232.135 280.243 231.266 282.428 231.266H300.391Z\\\" fill=\\\"currentColor\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"3\\\"/><path d=\\\"M361.576 433C367.651 433.042 372.542 438 372.501 444.074C372.46 450.149 367.501 455.04 361.426 454.999L287.926 454.499C281.851 454.457 276.96 449.5 277.001 443.425C277.042 437.35 282.001 432.459 288.076 432.5L361.576 433ZM65.8721 418.682C68.8091 413.364 75.5006 411.434 80.8184 414.37C91.4364 420.234 118.045 431.791 139.861 432.506C159.077 433.136 187.16 432.832 196.622 432.506C202.693 432.297 207.784 437.049 207.994 443.12C208.203 449.191 203.451 454.284 197.38 454.493C187.508 454.834 158.925 455.142 139.141 454.493C112.158 453.608 81.8993 440.099 70.1836 433.629C64.8655 430.692 62.9352 424 65.8721 418.682ZM450.445 304.61C456.459 303.752 462.031 307.93 462.891 313.943C466.733 340.838 467.437 337.258 469.466 362.622C470.429 374.662 467.727 387.312 464.389 397.731C461.013 408.267 456.677 417.463 453.562 422.939C450.557 428.219 443.842 430.064 438.562 427.061C433.281 424.056 431.436 417.34 434.44 412.06C436.825 407.869 440.539 400.065 443.438 391.018C446.375 381.854 448.173 372.337 447.536 364.377C445.565 339.742 445.269 346.16 441.111 317.055C440.253 311.041 444.432 305.47 450.445 304.61ZM50.9824 264.547C57.031 263.985 62.3912 268.432 62.9541 274.48C64.4004 290.028 62.5774 325.126 56.6836 349.123C55.2346 355.023 49.2766 358.63 43.377 357.182C37.4775 355.732 33.8695 349.776 35.3184 343.876C40.6243 322.273 42.2682 289.638 41.0479 276.519C40.4853 270.47 44.9335 265.11 50.9824 264.547ZM456.157 143.032C462.214 142.567 467.503 147.099 467.969 153.156C470.807 190.052 468.426 217.548 465.649 228.26C464.125 234.14 458.121 237.672 452.24 236.147C446.36 234.623 442.828 228.62 444.353 222.739C446.242 215.45 448.795 190.745 446.033 154.843C445.568 148.786 450.1 143.498 456.157 143.032ZM56.5391 78.1777C60.3071 73.4125 67.2249 72.6033 71.9902 76.3711C76.7553 80.1391 77.5637 87.057 73.7959 91.8223C71.2797 95.0046 67.2903 100.648 63.8408 106.811C60.2144 113.289 57.9762 118.966 57.6133 122.595C56.1782 136.946 57.668 156.507 57.668 164.5V183.5C57.6679 189.575 52.7427 194.5 46.668 194.5C40.5929 194.5 35.668 189.575 35.668 183.5V164.5C35.668 159.493 34.1578 136.054 35.7227 120.405C36.5598 112.035 40.7378 103.044 44.6445 96.0645C48.7283 88.7689 53.3887 82.162 56.5391 78.1777ZM299.442 44.5137C309.489 44.0029 334.979 43.287 357.111 44.5166C370.073 45.2368 385.732 50.9517 399.119 56.9824C412.843 63.1653 425.631 70.3596 433.331 75.1719C438.482 78.3916 440.048 85.1776 436.829 90.3291C433.609 95.4808 426.823 97.0468 421.671 93.8271C414.704 89.4729 402.792 82.7664 390.083 77.041C377.037 71.1636 364.529 66.9624 355.891 66.4824C334.824 65.3121 310.181 65.9962 300.56 66.4854C294.492 66.7939 289.324 62.1249 289.016 56.0576C288.708 49.9907 293.375 44.8222 299.442 44.5137ZM171.858 44.0498C187.6 43.8642 205.309 44.1678 216.822 44.5039C222.894 44.6816 227.673 49.7482 227.496 55.8203C227.319 61.8927 222.252 66.6722 216.18 66.4951C204.86 66.1646 187.468 65.8678 172.118 66.0488C164.427 66.1395 157.389 66.3484 151.934 66.7178C149.195 66.9032 147.009 67.1197 145.413 67.3525C144.301 67.5148 143.806 67.6393 143.724 67.6543C138.326 69.9036 132.063 67.5277 129.548 62.1836C126.961 56.6867 129.321 50.1336 134.817 47.5469L135.286 47.3359C137.655 46.3203 140.36 45.8569 142.237 45.583C144.622 45.2352 147.433 44.9727 150.447 44.7686C156.499 44.3588 164.005 44.1424 171.858 44.0498Z\\\" fill=\\\"currentColor\\\"/></svg>\";\n\nexport const OPENLV_ICON_128_WHITE = `data:image/svg+xml;base64,${btoa(openLvIcon)}`;\n"]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  /** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
2
2
  /** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
3
3
  export * from "./make.js";
4
- export * from "./messages/index.js";
4
+ export * from "./messages.js";
5
5
  export * from "./session.js";
6
- export * from "./settings.js";
7
6
  export * from "./url/index.js";
package/dist/index.js CHANGED
@@ -1,8 +1,7 @@
1
1
  /** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
2
2
  /** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
3
3
  export * from "./make.js";
4
- export * from "./messages/index.js";
4
+ export * from "./messages.js";
5
5
  export * from "./session.js";
6
- export * from "./settings.js";
7
6
  export * from "./url/index.js";
8
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC","sourcesContent":["/** biome-ignore-all lint/performance/noReExportAll: package entrypoint */\n/** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */\n\nexport * from \"./make.js\";\nexport * from \"./messages.js\";\nexport * from \"./session.js\";\nexport * from \"./url/index.js\";\n"]}
package/dist/make.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
1
+ type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
2
2
  type Merge<T extends readonly object[]> = UnionToIntersection<T[number]>;
3
3
  type EnsureAssignable<Have, Want> = Have extends Want ? unknown : never;
4
- export declare function combine<Target extends object, Parts extends readonly object[]>(...parts: Parts): EnsureAssignable<Merge<Parts>, Target> extends unknown ? Target : never;
4
+ export declare const combine: <Target extends object, Parts extends readonly object[]>(...parts: Parts) => EnsureAssignable<Merge<Parts>, Target> extends unknown ? Target : never;
5
5
  export declare const make: <M extends object, O extends object>(e: M, o: O) => M & O;
6
6
  export {};
package/dist/make.js CHANGED
@@ -1,8 +1,5 @@
1
- export function combine(...parts) {
2
- // runtime: left-to-right shallow assign
3
- return Object.assign({}, ...parts);
4
- }
5
- export const make = (e, o) => {
6
- return Object.assign(e, o);
7
- };
1
+ export const combine = (...parts) =>
2
+ // runtime: left-to-right shallow assign
3
+ Object.assign({}, ...parts);
4
+ export const make = (e, o) => Object.assign(e, o);
8
5
  //# sourceMappingURL=make.js.map
package/dist/make.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"make.js","sourceRoot":"","sources":["../src/make.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,OAAO,CACrB,GAAG,KAAY;IAEf,wCAAwC;IACxC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAAQ,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAqC,CAAI,EAAE,CAAI,EAAE,EAAE;IACrE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC;AACtC,CAAC,CAAC"}
1
+ {"version":3,"file":"make.js","sourceRoot":"","sources":["../src/make.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,GAAG,KAAY,EAC0D,EAAE;AAC7E,wCAAwC;AACtC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,KAAK,CAKjB,CAAC;AAEZ,MAAM,CAAC,MAAM,IAAI,GAAG,CAAqC,CAAI,EAAE,CAAI,EAAE,EAAE,CACrE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAU,CAAC","sourcesContent":["type UnionToIntersection<U> = (\n U extends unknown\n ? (k: U) => void\n : never\n) extends (k: infer I) => void\n ? I\n : never;\n\ntype Merge<T extends readonly object[]> = UnionToIntersection<T[number]>;\n\ntype EnsureAssignable<Have, Want> = Have extends Want ? unknown : never; // if not assignable -> return type becomes never\n\nexport const combine = <Target extends object, Parts extends readonly object[]>(\n ...parts: Parts\n): EnsureAssignable<Merge<Parts>, Target> extends unknown ? Target : never =>\n// runtime: left-to-right shallow assign\n Object.assign({}, ...parts) as EnsureAssignable<\n Merge<Parts>,\n Target\n > extends unknown\n ? Target\n : never;\n\nexport const make = <M extends object, O extends object>(e: M, o: O) =>\n Object.assign(e, o) as M & O;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"","sourcesContent":["export type SignalMessageBase<T extends string, P> = {\n type: T;\n payload: P;\n timestamp: number;\n};\n\n/**\n * Flash message\n * Sent to initiate handshake by non-host\n */\nexport type SignalMessageFlash = SignalMessageBase<\"flash\", object>;\n\nexport type SignalMessagePubkey = SignalMessageBase<\n \"pubkey\",\n {\n publicKey: string;\n dAppInfo?: {\n name: string;\n url: string;\n icon: string;\n };\n }\n>;\n\nexport type SignalMessageAck = SignalMessageBase<\"ack\", undefined>;\n\nexport type SignalMessageData = SignalMessageBase<\"data\", object>;\n\nexport type SignalMessage =\n | SignalMessageFlash\n | SignalMessagePubkey\n | SignalMessageAck\n | SignalMessageData;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"","sourcesContent":["import type { DecryptionKey, EncryptionKey } from \"./encryption/asymmetric.js\";\n\n// typescript type for 32 character hex string\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type Hex<_L> = string;\n\n/**\n * The parameters from the connection url\n */\nexport type SessionHandshakeParameters = {\n // Version of the openlv protocol\n version: 1;\n // Unique session identifier\n sessionId: Hex<16>;\n // Hash of peerA's public key\n h: Hex<16>;\n // Shared key for symmetric encryption during handshake\n k: Hex<16>;\n // Protocol for signaling\n p: string;\n // Signaling server URL\n s: string;\n};\n\n/**\n * The parameters that describe a session\n * these can be used to restart a session\n */\nexport type SessionConnectionParameters = SessionHandshakeParameters & {\n relyingPublicKey: EncryptionKey;\n // Our public key for the relying party to encrypt messages to us\n encryptionKey: EncryptionKey;\n // Our private key for decrypting messages from the relying party\n decryptionKey: DecryptionKey;\n};\n\nexport type SessionCreationParameters = Pick<\n SessionHandshakeParameters,\n \"p\" | \"s\"\n>;\n\nexport type SessionLinkParameters =\n | SessionConnectionParameters\n | SessionHandshakeParameters\n | SessionCreationParameters;\n"]}
package/dist/url/index.js CHANGED
@@ -14,7 +14,7 @@ export const encodeConnectionURL = (payload) => {
14
14
  export const decodeConnectionURL = (url) => {
15
15
  // Type check and validation
16
16
  if (typeof url !== "string") {
17
- throw new Error(`Invalid URL type: expected string, got ${typeof url}`);
17
+ throw new TypeError(`Invalid URL type: expected string, got ${typeof url}`);
18
18
  }
19
19
  if (!url || url.trim() === "") {
20
20
  throw new Error("URL cannot be empty");
@@ -52,7 +52,7 @@ export const decodeConnectionURL = (url) => {
52
52
  }
53
53
  // Validate shared key format (32 hex characters)
54
54
  if (!/^[0-9a-f]{32}$/.test(k)) {
55
- throw new Error(`Invalid shared key format: must be 32 hex characters, received: ${k}`);
55
+ throw new Error("Invalid shared key format: must be 32 lowercase hex characters");
56
56
  }
57
57
  return {
58
58
  version,
@@ -66,7 +66,9 @@ export const decodeConnectionURL = (url) => {
66
66
  }
67
67
  catch (error) {
68
68
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
69
- throw new Error(`Failed to parse URL: ${url}. Original error: ${errorMessage}`);
69
+ // Strip query string so handshake secrets (k) are not exposed in error messages
70
+ const safeUrl = url.includes("?") ? url.slice(0, url.indexOf("?")) + "?[redacted]" : url;
71
+ throw new Error(`Failed to parse URL: ${safeUrl}. Original error: ${errorMessage}`);
70
72
  }
71
73
  };
72
74
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/url/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/url/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SessionHandshakeParameters } from \"../session.js\";\n\nexport const OPENLV_PROTOCOL_VERSION = 1;\n\nexport const encodeConnectionURL = (payload: SessionHandshakeParameters) => {\n const params = new URLSearchParams();\n\n params.set(\"h\", payload.h);\n params.set(\"k\", payload.k);\n\n if (payload.p) {\n params.set(\"p\", payload.p);\n }\n\n if (payload.s) {\n params.set(\"s\", payload.s);\n }\n\n return `openlv://${payload.sessionId}@${OPENLV_PROTOCOL_VERSION}?${params.toString()}`;\n};\n\nexport const decodeConnectionURL = (\n url: string,\n): SessionHandshakeParameters => {\n // Type check and validation\n if (typeof url !== \"string\") {\n throw new TypeError(`Invalid URL type: expected string, got ${typeof url}`);\n }\n\n if (!url || url.trim() === \"\") {\n throw new Error(\"URL cannot be empty\");\n }\n\n if (!url.startsWith(\"openlv://\")) {\n throw new Error(\n `Invalid URL format: must start with 'openlv://', got: ${url}`,\n );\n }\n\n try {\n const urlObj = new URL(url);\n const sessionId = urlObj.username;\n const version = Number(urlObj.hostname || urlObj.pathname.replace(\"/\", \"\"));\n\n if (version !== OPENLV_PROTOCOL_VERSION) {\n throw new Error(\n `Invalid protocol version: expected ${OPENLV_PROTOCOL_VERSION}, got ${version}`,\n );\n }\n\n const h = urlObj.searchParams.get(\"h\") || \"\";\n const k = urlObj.searchParams.get(\"k\") || \"\";\n const s = urlObj.searchParams.get(\"s\") || undefined;\n\n const p\n = (urlObj.searchParams.get(\"p\") as \"mqtt\" | \"waku\" | \"nostr\") || \"mqtt\";\n\n if (!sessionId) {\n throw new Error(\"Session ID is required in URL\");\n }\n\n // Validate session ID format (16 characters, URL-safe alphabet)\n if (!/^[A-Za-z0-9_-]{16}$/.test(sessionId)) {\n throw new Error(\n \"Invalid session ID format: must be 16 URL-safe characters\",\n );\n }\n\n if (!h) {\n throw new Error(\"Public key hash (h parameter) is required in URL\");\n }\n\n // Validate public key hash format (16 hex characters)\n if (!/^[0-9a-f]{16}$/.test(h)) {\n throw new Error(\n \"Invalid public key hash format: must be 16 hex characters\",\n );\n }\n\n if (!k) {\n throw new Error(\"Shared key (k parameter) is required in URL\");\n }\n\n // Validate shared key format (32 hex characters)\n if (!/^[0-9a-f]{32}$/.test(k)) {\n throw new Error(\"Invalid shared key format: must be 32 lowercase hex characters\");\n }\n\n return {\n version,\n sessionId,\n h,\n k,\n // TODO: figure out why '' empty string and not undefined\n s: s ? decodeURIComponent(s) : \"\",\n p,\n };\n }\n catch (error) {\n const errorMessage\n = error instanceof Error ? error.message : \"Unknown error\";\n\n // Strip query string so handshake secrets (k) are not exposed in error messages\n const safeUrl = url.includes(\"?\") ? url.slice(0, url.indexOf(\"?\")) + \"?[redacted]\" : url;\n\n throw new Error(`Failed to parse URL: ${safeUrl}. Original error: ${errorMessage}`);\n }\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/url/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,SAAS,GAAG;IAChB;QACE,GAAG,EAAE,yIAAyI;QAC9I,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,kBAAkB;YAC7B,CAAC,EAAE,kBAAkB;YACrB,CAAC,EAAE,kCAAkC;YACrC,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,oCAAoC;SAC/B;KACX;CACF,CAAC;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/url/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,SAAS,GAAG;IAChB;QACE,GAAG,EAAE,yIAAyI;QAC9I,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,kBAAkB;YAC7B,CAAC,EAAE,kBAAkB;YACrB,CAAC,EAAE,kCAAkC;YACrC,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,oCAAoC;SAC/B;KACX;CACF,CAAC;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEtD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, test } from \"vitest\";\n\nimport { decodeConnectionURL, encodeConnectionURL } from \"./index.js\";\n\nconst testCases = [\n {\n url: \"openlv://k7n8m9x2w5q1p3r6@1?h=a1b2c3d4e5f60708&k=0123456789abcdef0123456789abcdef&p=mqtt&s=wss%3A%2F%2Ftest.mosquitto.org%3A8081%2Fmqtt\",\n expected: {\n version: 1,\n sessionId: \"k7n8m9x2w5q1p3r6\",\n h: \"a1b2c3d4e5f60708\",\n k: \"0123456789abcdef0123456789abcdef\",\n p: \"mqtt\",\n s: \"wss://test.mosquitto.org:8081/mqtt\",\n } as const,\n },\n];\n\ndescribe(\"URL Utilities\", () => {\n test(\"should decode connection URL\", () => {\n testCases.forEach((testCase) => {\n const result = decodeConnectionURL(testCase.url);\n\n expect(result).toEqual(testCase.expected);\n });\n });\n\n test(\"should encode connection URL\", () => {\n testCases.forEach((testCase) => {\n const result = encodeConnectionURL(testCase.expected);\n\n expect(result).toEqual(testCase.url);\n });\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openlv/core",
3
- "version": "0.0.1-beta.8",
3
+ "version": "0.0.1",
4
4
  "keywords": [
5
5
  "open-lavatory"
6
6
  ],
@@ -31,8 +31,8 @@
31
31
  "default": "./dist/encryption/index.js"
32
32
  },
33
33
  "./errors": {
34
- "types": "./dist/errors/index.d.ts",
35
- "default": "./dist/errors/index.js"
34
+ "types": "./dist/errors.d.ts",
35
+ "default": "./dist/errors.js"
36
36
  },
37
37
  "./icons": {
38
38
  "types": "./dist/icons/index.d.ts",
@@ -46,8 +46,9 @@
46
46
  "README.md"
47
47
  ],
48
48
  "dependencies": {
49
- "eventemitter3": "^5.0.1",
50
- "tweetnacl": "^1.0.3"
49
+ "@noble/ciphers": "^1.3.0",
50
+ "@noble/curves": "^1.9.7",
51
+ "eventemitter3": "^5.0.1"
51
52
  },
52
53
  "devDependencies": {
53
54
  "typescript": "^5",
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/errors/base.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- /** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
2
- /** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
3
- export * from "./base.js";
4
- export * from "./signal.js";
@@ -1,5 +0,0 @@
1
- /** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
2
- /** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
3
- export * from "./base.js";
4
- export * from "./signal.js";
5
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAE1E,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -1,4 +0,0 @@
1
- import { BaseError } from "./base.js";
2
- export declare class SignalNoConnectionError extends BaseError {
3
- constructor();
4
- }
@@ -1,7 +0,0 @@
1
- import { BaseError } from "./base.js";
2
- export class SignalNoConnectionError extends BaseError {
3
- constructor() {
4
- super(["Hello", "World"].join("\n"), { name: "SignalConnectionError" });
5
- }
6
- }
7
- //# sourceMappingURL=signal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../src/errors/signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IACpD;QACE,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messages/index.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- import type { SessionCreationParameters } from "./session.js";
2
- export type SignalingSettings = SessionCreationParameters;
package/dist/settings.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=settings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":""}
File without changes