@wizardconnect/core 0.1.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 (40) hide show
  1. package/dist/connection-manager.d.ts +45 -0
  2. package/dist/connection-manager.js +157 -0
  3. package/dist/connection-manager.js.map +1 -0
  4. package/dist/dapp-relay.d.ts +27 -0
  5. package/dist/dapp-relay.js +129 -0
  6. package/dist/dapp-relay.js.map +1 -0
  7. package/dist/index.d.ts +33 -0
  8. package/dist/index.js +21 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/key-exchange.d.ts +35 -0
  11. package/dist/key-exchange.js +154 -0
  12. package/dist/key-exchange.js.map +1 -0
  13. package/dist/log.d.ts +14 -0
  14. package/dist/log.js +23 -0
  15. package/dist/log.js.map +1 -0
  16. package/dist/message-queue.d.ts +15 -0
  17. package/dist/message-queue.js +61 -0
  18. package/dist/message-queue.js.map +1 -0
  19. package/dist/primitives.d.ts +5 -0
  20. package/dist/primitives.js +18 -0
  21. package/dist/primitives.js.map +1 -0
  22. package/dist/protocols/base.d.ts +37 -0
  23. package/dist/protocols/base.js +46 -0
  24. package/dist/protocols/base.js.map +1 -0
  25. package/dist/protocols/hdwalletv1.d.ts +56 -0
  26. package/dist/protocols/hdwalletv1.js +80 -0
  27. package/dist/protocols/hdwalletv1.js.map +1 -0
  28. package/dist/relay-client.d.ts +38 -0
  29. package/dist/relay-client.js +323 -0
  30. package/dist/relay-client.js.map +1 -0
  31. package/dist/relay-handler.d.ts +33 -0
  32. package/dist/relay-handler.js +125 -0
  33. package/dist/relay-handler.js.map +1 -0
  34. package/dist/utilnostr.d.ts +4 -0
  35. package/dist/utilnostr.js +16 -0
  36. package/dist/utilnostr.js.map +1 -0
  37. package/dist/wallet-relay.d.ts +20 -0
  38. package/dist/wallet-relay.js +71 -0
  39. package/dist/wallet-relay.js.map +1 -0
  40. package/package.json +34 -0
@@ -0,0 +1,45 @@
1
+ import { LogScope } from "./log.js";
2
+ import { EventEmitter } from "eventemitter3";
3
+ export interface VisibilityChangeContext<TClient> {
4
+ client: TClient;
5
+ state: "hidden" | "visible";
6
+ setPaused: (_value: boolean) => void;
7
+ isPaused: () => boolean;
8
+ startConnectionLoop: () => void;
9
+ }
10
+ export interface ConnectionManagerOptions<
11
+ TClient extends ConnectionClient = ConnectionClient,
12
+ > {
13
+ reconnectInterval?: number;
14
+ maxReconnectAttempts?: number;
15
+ enableVisibilityHandling?: boolean;
16
+ scope?: LogScope;
17
+ onVisibilityChange?: (
18
+ _context: VisibilityChangeContext<TClient>,
19
+ ) => void | Promise<void>;
20
+ }
21
+ export interface ConnectionClient extends EventEmitter {
22
+ connect(): Promise<void>;
23
+ disconnect(..._args: any[]): Promise<void | boolean>;
24
+ }
25
+ export interface ConnectionManagerResult {
26
+ cleanup: () => Promise<void>;
27
+ startConnectionLoop: () => void;
28
+ }
29
+ export declare const createConnectionManager: <
30
+ TClient extends ConnectionClient,
31
+ >(
32
+ client: TClient,
33
+ callbacks: {
34
+ onConnected: (_client: TClient) => void;
35
+ onReconnecting: (_client: TClient, _reason: string | null) => void;
36
+ onDisconnected: (_client: TClient) => void;
37
+ onError?: (_client: TClient, _error: any) => void;
38
+ },
39
+ events: {
40
+ connected: string;
41
+ disconnected: string;
42
+ error?: string;
43
+ },
44
+ options?: ConnectionManagerOptions<TClient>,
45
+ ) => ConnectionManagerResult;
@@ -0,0 +1,157 @@
1
+ import { debug, Scope } from "./log.js";
2
+ async function sleep(ms) {
3
+ return new Promise((resolve) => setTimeout(resolve, ms));
4
+ }
5
+ export const createConnectionManager = (
6
+ client,
7
+ callbacks,
8
+ events,
9
+ options = {},
10
+ ) => {
11
+ const {
12
+ reconnectInterval = 5000,
13
+ maxReconnectAttempts = Infinity,
14
+ enableVisibilityHandling = true,
15
+ scope = Scope.Network,
16
+ onVisibilityChange,
17
+ } = options;
18
+ let isPaused = false;
19
+ let reconnectLoop = null;
20
+ let visibilityChangeHandler = null;
21
+ const triggerReconnect = (reason) => {
22
+ if (!isPaused) {
23
+ callbacks.onReconnecting(client, reason);
24
+ reconnectLoop = null;
25
+ startConnectionLoop();
26
+ }
27
+ };
28
+ const onConnected = () => callbacks.onConnected(client);
29
+ client.on(events.connected, onConnected);
30
+ const onDisconnected = (...args) => {
31
+ const err = args[0] instanceof Error ? args[0].message : null;
32
+ debug(scope, "Disconnected event received", err);
33
+ triggerReconnect(err);
34
+ };
35
+ const onError = (err) => {
36
+ const errorMsg = err?.message || String(err);
37
+ debug(scope, "Error event received", errorMsg);
38
+ triggerReconnect(errorMsg);
39
+ if (callbacks.onError) {
40
+ callbacks.onError(client, err);
41
+ }
42
+ };
43
+ client.on(events.disconnected, onDisconnected);
44
+ if (events.error) {
45
+ client.on(events.error, onError);
46
+ }
47
+ const setupVisibilityHandling = () => {
48
+ if (typeof document === "undefined") {
49
+ return;
50
+ }
51
+ visibilityChangeHandler = () => {
52
+ const state = document.visibilityState;
53
+ if (onVisibilityChange) {
54
+ const context = {
55
+ client,
56
+ state,
57
+ setPaused: (value) => {
58
+ isPaused = value;
59
+ },
60
+ isPaused: () => isPaused,
61
+ startConnectionLoop,
62
+ };
63
+ (async () => {
64
+ try {
65
+ await onVisibilityChange(context);
66
+ } catch (err) {
67
+ debug(scope, "Error in custom visibility change handler:", err);
68
+ }
69
+ })();
70
+ return;
71
+ }
72
+ if (state === "hidden") {
73
+ isPaused = true;
74
+ (async () => {
75
+ try {
76
+ await client.disconnect();
77
+ callbacks.onDisconnected(client);
78
+ } catch (err) {
79
+ debug(scope, "Error disconnecting on visibility change:", err);
80
+ }
81
+ })();
82
+ } else if (state === "visible") {
83
+ if (isPaused) {
84
+ isPaused = false;
85
+ startConnectionLoop();
86
+ }
87
+ }
88
+ };
89
+ document.addEventListener("visibilitychange", visibilityChangeHandler);
90
+ };
91
+ const startConnectionLoop = () => {
92
+ if (reconnectLoop) {
93
+ return;
94
+ }
95
+ reconnectLoop = (async () => {
96
+ let reconnectAttempts = 0;
97
+ let wasConnected = false;
98
+ while (true) {
99
+ if (isPaused) {
100
+ await sleep(1000);
101
+ continue;
102
+ }
103
+ try {
104
+ await client.connect();
105
+ // onConnected is fired via the "connection" event emitted inside client.connect()
106
+ // — do NOT call callbacks.onConnected here too, that would double-fire it.
107
+ reconnectAttempts = 0;
108
+ wasConnected = true;
109
+ reconnectLoop = null;
110
+ return;
111
+ } catch (e) {
112
+ reconnectAttempts++;
113
+ if (wasConnected || reconnectAttempts === 1) {
114
+ callbacks.onReconnecting(client, `${e}`);
115
+ wasConnected = false;
116
+ }
117
+ if (reconnectAttempts > maxReconnectAttempts) {
118
+ callbacks.onDisconnected(client);
119
+ reconnectLoop = null;
120
+ return;
121
+ }
122
+ try {
123
+ await client.disconnect();
124
+ } catch (disconnectError) {
125
+ debug(scope, "Failed to disconnect client", disconnectError);
126
+ }
127
+ await sleep(reconnectInterval);
128
+ }
129
+ }
130
+ })();
131
+ };
132
+ if (enableVisibilityHandling) {
133
+ setupVisibilityHandling();
134
+ }
135
+ const cleanup = async () => {
136
+ isPaused = true;
137
+ if (typeof document !== "undefined" && visibilityChangeHandler !== null) {
138
+ document.removeEventListener("visibilitychange", visibilityChangeHandler);
139
+ }
140
+ client.off(events.connected, onConnected);
141
+ client.off(events.disconnected, onDisconnected);
142
+ if (events.error) {
143
+ client.off(events.error, onError);
144
+ }
145
+ callbacks.onDisconnected(client);
146
+ try {
147
+ await client.disconnect();
148
+ } catch (e) {
149
+ debug(scope, "Failed to disconnect client during cleanup", e);
150
+ }
151
+ };
152
+ return {
153
+ cleanup,
154
+ startConnectionLoop,
155
+ };
156
+ };
157
+ //# sourceMappingURL=connection-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../src/connection-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { RelayClient } from "./relay-client.js";
2
+ import { RelayStatusCallback } from "./relay-handler.js";
3
+ import { KeyExchangeCredentials } from "./key-exchange.js";
4
+ import { EventEmitter } from "eventemitter3";
5
+ export interface DappRelayOptions {
6
+ explicitRelayUrls?: string[];
7
+ reconnectInterval?: number;
8
+ maxReconnectAttempts?: number;
9
+ existingCredentials?: {
10
+ privateKey: string;
11
+ secret: string;
12
+ };
13
+ }
14
+ export interface DappRelayResult {
15
+ client: RelayClient;
16
+ uri: string;
17
+ qrUri: string;
18
+ credentials: KeyExchangeCredentials;
19
+ events: EventEmitter<{
20
+ keyexchangecomplete: [walletPublicKey: Uint8Array];
21
+ }>;
22
+ cleanup: () => void;
23
+ }
24
+ export declare function initiateDappRelay(
25
+ statusCallback: RelayStatusCallback,
26
+ options?: DappRelayOptions,
27
+ ): DappRelayResult;
@@ -0,0 +1,129 @@
1
+ import { initiateRelay } from "./relay-handler.js";
2
+ import { RelayMsgAction } from "./protocols/hdwalletv1.js";
3
+ import {
4
+ generateKeyExchangeCredentials,
5
+ encodeKeyExchangeURI,
6
+ DEFAULT_RELAY_HOSTNAME,
7
+ DEFAULT_RELAY_PORT,
8
+ DEFAULT_RELAY_PROTOCOL,
9
+ } from "./key-exchange.js";
10
+ import { hexToBin, binToHex } from "@bitauth/libauth";
11
+ import { EventEmitter } from "eventemitter3";
12
+ import { deriveNostrPublicKey } from "./utilnostr.js";
13
+ import { error as logError, warn, Scope } from "./log.js";
14
+ export function initiateDappRelay(statusCallback, options = {}) {
15
+ const events = new EventEmitter();
16
+ let credentials;
17
+ let dappPrivateKey;
18
+ if (options.existingCredentials) {
19
+ const privateKeyHex = options.existingCredentials.privateKey;
20
+ if (privateKeyHex.length !== 64) {
21
+ throw new Error("Private key must be 64 hex characters (32 bytes)");
22
+ }
23
+ dappPrivateKey = hexToBin(privateKeyHex);
24
+ const dappPublicKeyHex = deriveNostrPublicKey(dappPrivateKey);
25
+ credentials = {
26
+ privateKey: privateKeyHex,
27
+ publicKey: dappPublicKeyHex,
28
+ secret: options.existingCredentials.secret,
29
+ };
30
+ } else {
31
+ credentials = generateKeyExchangeCredentials();
32
+ dappPrivateKey = hexToBin(credentials.privateKey);
33
+ }
34
+ let uriOptions = {};
35
+ if (options.explicitRelayUrls && options.explicitRelayUrls.length > 0) {
36
+ const relayUrl = options.explicitRelayUrls[0];
37
+ const hostMatch = relayUrl.match(/^wss?:\/\/([^:/]+)/);
38
+ const portMatch = relayUrl.match(/:(\d+)/);
39
+ if (hostMatch) {
40
+ uriOptions.hostname = hostMatch[1];
41
+ }
42
+ if (portMatch) {
43
+ uriOptions.port = parseInt(portMatch[1], 10);
44
+ }
45
+ if (relayUrl.startsWith("wss://")) {
46
+ uriOptions.protocol = "wss";
47
+ } else if (relayUrl.startsWith("ws://")) {
48
+ uriOptions.protocol = "ws";
49
+ }
50
+ }
51
+ const { uri, qrUri } = encodeKeyExchangeURI(
52
+ credentials.publicKey,
53
+ credentials.secret,
54
+ uriOptions,
55
+ );
56
+ let relayClient = null;
57
+ let keyExchanged = false;
58
+ let walletPublicKeyNostr = null;
59
+ const wrappedCallback = (payload) => {
60
+ if (!relayClient) {
61
+ relayClient = payload.client;
62
+ relayClient.on("message", async (message) => {
63
+ if (message.action === RelayMsgAction.WalletReady) {
64
+ const walletReady = message;
65
+ if (walletReady.secret !== credentials.secret) {
66
+ if (!keyExchanged) {
67
+ logError(Scope.Relay, "Key exchange failed: secret mismatch");
68
+ }
69
+ return;
70
+ }
71
+ const receivedWalletKey = hexToBin(walletReady.public_key);
72
+ if (receivedWalletKey.length !== 32) {
73
+ logError(Scope.Relay, "Invalid wallet public key length");
74
+ return;
75
+ }
76
+ if (keyExchanged && walletPublicKeyNostr) {
77
+ if (
78
+ binToHex(receivedWalletKey) !== binToHex(walletPublicKeyNostr)
79
+ ) {
80
+ warn(
81
+ Scope.Relay,
82
+ "Different wallet connected (different public key)",
83
+ );
84
+ }
85
+ }
86
+ walletPublicKeyNostr = receivedWalletKey;
87
+ relayClient.setPairedPublicKey(receivedWalletKey);
88
+ if (!keyExchanged) {
89
+ keyExchanged = true;
90
+ events.emit("keyexchangecomplete", receivedWalletKey);
91
+ }
92
+ // NOTE: do NOT return — message also propagates to DappConnectionManager's listener
93
+ }
94
+ });
95
+ }
96
+ if (payload.status.status === "connected") {
97
+ if (walletPublicKeyNostr && relayClient) {
98
+ relayClient.setPairedPublicKey(walletPublicKeyNostr);
99
+ keyExchanged = true;
100
+ }
101
+ }
102
+ statusCallback(payload);
103
+ };
104
+ const relayUrls =
105
+ options.explicitRelayUrls && options.explicitRelayUrls.length > 0
106
+ ? options.explicitRelayUrls
107
+ : [
108
+ `${DEFAULT_RELAY_PROTOCOL}://${DEFAULT_RELAY_HOSTNAME}:${DEFAULT_RELAY_PORT}`,
109
+ ];
110
+ const cleanup = initiateRelay(
111
+ wrappedCallback,
112
+ dappPrivateKey,
113
+ new Uint8Array(33),
114
+ {
115
+ explicitRelayUrls: relayUrls,
116
+ reconnectInterval: options.reconnectInterval,
117
+ maxReconnectAttempts: options.maxReconnectAttempts,
118
+ },
119
+ );
120
+ return {
121
+ client: relayClient,
122
+ uri,
123
+ qrUri,
124
+ credentials,
125
+ events,
126
+ cleanup,
127
+ };
128
+ }
129
+ //# sourceMappingURL=dapp-relay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dapp-relay.js","sourceRoot":"","sources":["../src/dapp-relay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export { RelayClient } from "./relay-client.js";
2
+ export type { RelayClientConfig } from "./relay-client.js";
3
+ export { RelayStatus, initiateRelay } from "./relay-handler.js";
4
+ export type {
5
+ RelayUpdatePayload,
6
+ RelayStatusCallback,
7
+ } from "./relay-handler.js";
8
+ export { initiateDappRelay } from "./dapp-relay.js";
9
+ export type { DappRelayOptions, DappRelayResult } from "./dapp-relay.js";
10
+ export { initiateWalletRelay } from "./wallet-relay.js";
11
+ export type { WalletRelayOptions, WalletRelayResult } from "./wallet-relay.js";
12
+ export {
13
+ generateKeyExchangeCredentials,
14
+ encodeKeyExchangeURI,
15
+ decodeKeyExchangeURI,
16
+ DEFAULT_RELAY_HOSTNAME,
17
+ DEFAULT_RELAY_PORT,
18
+ DEFAULT_RELAY_PROTOCOL,
19
+ } from "./key-exchange.js";
20
+ export type {
21
+ KeyExchangeCredentials,
22
+ DecodedKeyExchangeURI,
23
+ KeyExchangeURIOptions,
24
+ KeyExchangeURIResult,
25
+ } from "./key-exchange.js";
26
+ export * from "./protocols/hdwalletv1.js";
27
+ export * from "./protocols/base.js";
28
+ export {
29
+ binToHex,
30
+ hexToBin,
31
+ binToBech32Padded,
32
+ bech32PaddedToBin,
33
+ } from "@bitauth/libauth";
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ export { RelayClient } from "./relay-client.js";
2
+ export { RelayStatus, initiateRelay } from "./relay-handler.js";
3
+ export { initiateDappRelay } from "./dapp-relay.js";
4
+ export { initiateWalletRelay } from "./wallet-relay.js";
5
+ export {
6
+ generateKeyExchangeCredentials,
7
+ encodeKeyExchangeURI,
8
+ decodeKeyExchangeURI,
9
+ DEFAULT_RELAY_HOSTNAME,
10
+ DEFAULT_RELAY_PORT,
11
+ DEFAULT_RELAY_PROTOCOL,
12
+ } from "./key-exchange.js";
13
+ export * from "./protocols/hdwalletv1.js";
14
+ export * from "./protocols/base.js";
15
+ export {
16
+ binToHex,
17
+ hexToBin,
18
+ binToBech32Padded,
19
+ bech32PaddedToBin,
20
+ } from "@bitauth/libauth";
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAO3B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,35 @@
1
+ export declare const DEFAULT_RELAY_HOSTNAME = "relay.cauldron.quest";
2
+ export declare const DEFAULT_RELAY_PORT = 443;
3
+ export declare const DEFAULT_RELAY_PROTOCOL: "wss";
4
+ export interface KeyExchangeCredentials {
5
+ privateKey: string;
6
+ publicKey: string;
7
+ secret: string;
8
+ }
9
+ export declare function generateKeyExchangeCredentials(): KeyExchangeCredentials;
10
+ export interface DecodedKeyExchangeURI {
11
+ publicKey: string;
12
+ secret: string;
13
+ hostname: string;
14
+ port: number;
15
+ protocol: "ws" | "wss";
16
+ }
17
+ export interface KeyExchangeURIOptions {
18
+ hostname?: string;
19
+ port?: number;
20
+ protocol?: "ws" | "wss";
21
+ }
22
+ export interface KeyExchangeURIResult {
23
+ /** Standard URI for copy-paste and display: wiz://?p=...&s=... */
24
+ uri: string;
25
+ /** Fully QR-alphanumeric-safe URI for QR code generation: WIZ://%3FP%3D... */
26
+ qrUri: string;
27
+ }
28
+ export declare function encodeKeyExchangeURI(
29
+ publicKey: string,
30
+ secret: string,
31
+ options?: KeyExchangeURIOptions,
32
+ ): KeyExchangeURIResult;
33
+ export declare function decodeKeyExchangeURI(
34
+ uri: string,
35
+ ): DecodedKeyExchangeURI;
@@ -0,0 +1,154 @@
1
+ import {
2
+ generatePrivateKey,
3
+ binToHex,
4
+ hexToBin,
5
+ binToBech32Padded,
6
+ bech32PaddedToBin,
7
+ } from "@bitauth/libauth";
8
+ import { deriveNostrPublicKey } from "./utilnostr.js";
9
+ export const DEFAULT_RELAY_HOSTNAME = "relay.cauldron.quest";
10
+ export const DEFAULT_RELAY_PORT = 443;
11
+ export const DEFAULT_RELAY_PROTOCOL = "wss";
12
+ export function generateKeyExchangeCredentials() {
13
+ const privateKey = generatePrivateKey();
14
+ const privateKeyHex = binToHex(privateKey);
15
+ const publicKeyHex = deriveNostrPublicKey(privateKey);
16
+ const secretBytes = generatePrivateKey();
17
+ const secretShort = secretBytes.slice(0, 8);
18
+ const secret = binToHex(secretShort);
19
+ return {
20
+ privateKey: privateKeyHex,
21
+ publicKey: publicKeyHex,
22
+ secret: secret,
23
+ };
24
+ }
25
+ export function encodeKeyExchangeURI(publicKey, secret, options = {}) {
26
+ const publicKeyBin = hexToBin(publicKey);
27
+ const secretBin = hexToBin(secret);
28
+ if (publicKeyBin.length !== 32) {
29
+ throw new Error(
30
+ `Invalid public key length: expected 32 bytes, got ${publicKeyBin.length}`,
31
+ );
32
+ }
33
+ if (secretBin.length !== 8) {
34
+ throw new Error(
35
+ `Invalid secret length: expected 8 bytes, got ${secretBin.length}`,
36
+ );
37
+ }
38
+ const publicKeyBech32 = binToBech32Padded(publicKeyBin).toLowerCase();
39
+ const secretBech32 = binToBech32Padded(secretBin).toLowerCase();
40
+ const hostname = options.hostname || DEFAULT_RELAY_HOSTNAME;
41
+ const port = options.port ?? DEFAULT_RELAY_PORT;
42
+ const protocol = options.protocol || DEFAULT_RELAY_PROTOCOL;
43
+ const isDefaultHostname = hostname === DEFAULT_RELAY_HOSTNAME;
44
+ const defaultPort = protocol === "wss" ? 443 : 80;
45
+ const isDefaultPort = port === defaultPort;
46
+ const isDefaultProtocol = protocol === DEFAULT_RELAY_PROTOCOL;
47
+ let uri;
48
+ if (isDefaultHostname && isDefaultPort && isDefaultProtocol) {
49
+ uri = `wiz://?p=${publicKeyBech32}&s=${secretBech32}`;
50
+ } else {
51
+ const portPart = isDefaultPort ? "" : `:${port}`;
52
+ const authority = `${hostname}${portPart}`;
53
+ uri = `wiz://${authority}?p=${publicKeyBech32}&s=${secretBech32}`;
54
+ if (!isDefaultProtocol) {
55
+ uri += `&pr=${protocol}`;
56
+ }
57
+ }
58
+ const qrUri = uri
59
+ .toUpperCase()
60
+ .replace("?", "%3F")
61
+ .replace(/=/g, "%3D")
62
+ .replace(/&/g, "%26");
63
+ return { uri, qrUri };
64
+ }
65
+ export function decodeKeyExchangeURI(uri) {
66
+ let url;
67
+ try {
68
+ const lower = uri.toLowerCase();
69
+ const isQr = lower.includes("%3f") && !lower.includes("?");
70
+ const toParse = isQr
71
+ ? lower.replace("%3f", "?").replace(/%3d/g, "=").replace(/%26/g, "&")
72
+ : lower;
73
+ url = new URL(toParse);
74
+ } catch (error) {
75
+ throw new Error(
76
+ `Invalid URI format: ${error instanceof Error ? error.message : "unknown error"}`,
77
+ { cause: error },
78
+ );
79
+ }
80
+ if (url.protocol !== "wiz:") {
81
+ throw new Error("Invalid URI scheme. Expected: wiz://");
82
+ }
83
+ let hostname = url.hostname || DEFAULT_RELAY_HOSTNAME;
84
+ let port;
85
+ if (url.port) {
86
+ const parsedPort = parseInt(url.port, 10);
87
+ if (isNaN(parsedPort) || parsedPort < 1 || parsedPort > 65535) {
88
+ throw new Error(`Invalid port number: ${url.port}`);
89
+ }
90
+ port = parsedPort;
91
+ } else {
92
+ port = DEFAULT_RELAY_PORT;
93
+ }
94
+ const publicKeyBech32 = url.searchParams.get("p");
95
+ const secretBech32 = url.searchParams.get("s");
96
+ if (!publicKeyBech32 || !secretBech32) {
97
+ throw new Error(
98
+ "Invalid URI format. Missing required parameters: p (public key) or s (secret)",
99
+ );
100
+ }
101
+ const protocol = url.searchParams.get("pr");
102
+ const publicKeyBech32Normalized = publicKeyBech32.toLowerCase();
103
+ const secretBech32Normalized = secretBech32.toLowerCase();
104
+ let publicKeyBin;
105
+ let secretBin;
106
+ try {
107
+ const pubkeyResult = bech32PaddedToBin(publicKeyBech32Normalized);
108
+ const secretResult = bech32PaddedToBin(secretBech32Normalized);
109
+ if (
110
+ pubkeyResult instanceof Uint8Array &&
111
+ secretResult instanceof Uint8Array
112
+ ) {
113
+ publicKeyBin = pubkeyResult;
114
+ secretBin = secretResult;
115
+ } else {
116
+ const pubkeyError =
117
+ typeof pubkeyResult === "string" ? pubkeyResult : "Unknown error";
118
+ const secretError =
119
+ typeof secretResult === "string" ? secretResult : "Unknown error";
120
+ throw new Error(
121
+ `Bech32 decoding failed: pubkey=${pubkeyError}, secret=${secretError}`,
122
+ );
123
+ }
124
+ } catch (error) {
125
+ throw new Error(
126
+ `Invalid bech32 encoding: ${error instanceof Error ? error.message : "unknown error"}`,
127
+ { cause: error },
128
+ );
129
+ }
130
+ if (publicKeyBin.length !== 32) {
131
+ throw new Error(
132
+ `Invalid public key length: expected 32 bytes, got ${publicKeyBin.length}`,
133
+ );
134
+ }
135
+ if (secretBin.length !== 8) {
136
+ throw new Error(
137
+ `Invalid secret length: expected 8 bytes, got ${secretBin.length}`,
138
+ );
139
+ }
140
+ if (protocol && protocol !== "ws" && protocol !== "wss") {
141
+ throw new Error(`Invalid protocol: ${protocol}. Must be 'ws' or 'wss'`);
142
+ }
143
+ if (!url.port && protocol === "ws") {
144
+ port = 80;
145
+ }
146
+ return {
147
+ publicKey: binToHex(publicKeyBin),
148
+ secret: binToHex(secretBin),
149
+ hostname: hostname,
150
+ port: port,
151
+ protocol: protocol || DEFAULT_RELAY_PROTOCOL,
152
+ };
153
+ }
154
+ //# sourceMappingURL=key-exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-exchange.js","sourceRoot":"","sources":["../src/key-exchange.ts"],"names":[],"mappings":"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"}
package/dist/log.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Simple console-based logger shim.
3
+ * Replaces @riftenlabs/log without any external dependencies.
4
+ */
5
+ export declare enum Scope {
6
+ Relay = "relay",
7
+ Network = "network",
8
+ Misc = "misc",
9
+ }
10
+ export type LogScope = Scope | string;
11
+ export declare function debug(scope: LogScope, ...args: unknown[]): void;
12
+ export declare function info(scope: LogScope, ...args: unknown[]): void;
13
+ export declare function warn(scope: LogScope, ...args: unknown[]): void;
14
+ export declare function error(scope: LogScope, ...args: unknown[]): void;
package/dist/log.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Simple console-based logger shim.
3
+ * Replaces @riftenlabs/log without any external dependencies.
4
+ */
5
+ export var Scope;
6
+ (function (Scope) {
7
+ Scope["Relay"] = "relay";
8
+ Scope["Network"] = "network";
9
+ Scope["Misc"] = "misc";
10
+ })(Scope || (Scope = {}));
11
+ export function debug(scope, ...args) {
12
+ console.log(`[${scope}]`, ...args);
13
+ }
14
+ export function info(scope, ...args) {
15
+ console.info(`[${scope}]`, ...args);
16
+ }
17
+ export function warn(scope, ...args) {
18
+ console.warn(`[${scope}]`, ...args);
19
+ }
20
+ export function error(scope, ...args) {
21
+ console.error(`[${scope}]`, ...args);
22
+ }
23
+ //# sourceMappingURL=log.js.map