@wizardconnect/core 0.1.0 → 0.1.4

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 (39) hide show
  1. package/dist/connection-manager.d.ts +18 -29
  2. package/dist/connection-manager.js +142 -144
  3. package/dist/connection-manager.js.map +1 -1
  4. package/dist/dapp-relay.d.ts +17 -19
  5. package/dist/dapp-relay.js +103 -115
  6. package/dist/dapp-relay.js.map +1 -1
  7. package/dist/index.d.ts +4 -24
  8. package/dist/index.js +6 -15
  9. package/dist/index.js.map +1 -1
  10. package/dist/key-exchange.d.ts +17 -23
  11. package/dist/key-exchange.js +124 -144
  12. package/dist/key-exchange.js.map +1 -1
  13. package/dist/log.d.ts +3 -3
  14. package/dist/log.js +11 -8
  15. package/dist/log.js.map +1 -1
  16. package/dist/message-queue.d.ts +12 -12
  17. package/dist/message-queue.js +53 -52
  18. package/dist/message-queue.js.map +1 -1
  19. package/dist/primitives.js +14 -11
  20. package/dist/primitives.js.map +1 -1
  21. package/dist/protocols/base.d.ts +22 -28
  22. package/dist/protocols/base.js +25 -28
  23. package/dist/protocols/base.js.map +1 -1
  24. package/dist/protocols/hdwalletv1.d.ts +25 -31
  25. package/dist/protocols/hdwalletv1.js +47 -57
  26. package/dist/protocols/hdwalletv1.js.map +1 -1
  27. package/dist/relay-client.d.ts +32 -32
  28. package/dist/relay-client.js +242 -291
  29. package/dist/relay-client.js.map +1 -1
  30. package/dist/relay-handler.d.ts +13 -22
  31. package/dist/relay-handler.js +107 -117
  32. package/dist/relay-handler.js.map +1 -1
  33. package/dist/utilnostr.d.ts +1 -3
  34. package/dist/utilnostr.js +9 -10
  35. package/dist/utilnostr.js.map +1 -1
  36. package/dist/wallet-relay.d.ts +11 -14
  37. package/dist/wallet-relay.js +58 -64
  38. package/dist/wallet-relay.js.map +1 -1
  39. package/package.json +8 -3
@@ -1,45 +1,34 @@
1
1
  import { LogScope } from "./log.js";
2
2
  import { EventEmitter } from "eventemitter3";
3
3
  export interface VisibilityChangeContext<TClient> {
4
- client: TClient;
5
- state: "hidden" | "visible";
6
- setPaused: (_value: boolean) => void;
7
- isPaused: () => boolean;
8
- startConnectionLoop: () => void;
4
+ client: TClient;
5
+ state: "hidden" | "visible";
6
+ setPaused: (_value: boolean) => void;
7
+ isPaused: () => boolean;
8
+ startConnectionLoop: () => void;
9
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>;
10
+ export interface ConnectionManagerOptions<TClient extends ConnectionClient = ConnectionClient> {
11
+ reconnectInterval?: number;
12
+ maxReconnectAttempts?: number;
13
+ enableVisibilityHandling?: boolean;
14
+ scope?: LogScope;
15
+ onVisibilityChange?: (_context: VisibilityChangeContext<TClient>) => void | Promise<void>;
20
16
  }
21
17
  export interface ConnectionClient extends EventEmitter {
22
- connect(): Promise<void>;
23
- disconnect(..._args: any[]): Promise<void | boolean>;
18
+ connect(): Promise<void>;
19
+ disconnect(..._args: any[]): Promise<void | boolean>;
24
20
  }
25
21
  export interface ConnectionManagerResult {
26
- cleanup: () => Promise<void>;
27
- startConnectionLoop: () => void;
22
+ cleanup: () => Promise<void>;
23
+ startConnectionLoop: () => void;
28
24
  }
29
- export declare const createConnectionManager: <
30
- TClient extends ConnectionClient,
31
- >(
32
- client: TClient,
33
- callbacks: {
25
+ export declare const createConnectionManager: <TClient extends ConnectionClient>(client: TClient, callbacks: {
34
26
  onConnected: (_client: TClient) => void;
35
27
  onReconnecting: (_client: TClient, _reason: string | null) => void;
36
28
  onDisconnected: (_client: TClient) => void;
37
29
  onError?: (_client: TClient, _error: any) => void;
38
- },
39
- events: {
30
+ }, events: {
40
31
  connected: string;
41
32
  disconnected: string;
42
33
  error?: string;
43
- },
44
- options?: ConnectionManagerOptions<TClient>,
45
- ) => ConnectionManagerResult;
34
+ }, options?: ConnectionManagerOptions<TClient>) => ConnectionManagerResult;
@@ -1,157 +1,155 @@
1
+ // Copyright (C) 2026 Whiterun LLC,
2
+ // This software is licensed under the GNU Lesser General Public License (LGPL), version 3.0 or later.
3
+ // A copy of the license can be found in the LICENSE file or at https://www.gnu.org/licenses/lgpl-3.0.html
1
4
  import { debug, Scope } from "./log.js";
2
5
  async function sleep(ms) {
3
- return new Promise((resolve) => setTimeout(resolve, ms));
6
+ return new Promise((resolve) => setTimeout(resolve, ms));
4
7
  }
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;
8
+ export const createConnectionManager = (client, callbacks, events, options = {}) => {
9
+ const { reconnectInterval = 5000, maxReconnectAttempts = Infinity, enableVisibilityHandling = true, scope = Scope.Network, onVisibilityChange, } = options;
10
+ let isPaused = false;
11
+ let reconnectLoop = null;
12
+ let visibilityChangeHandler = null;
13
+ const triggerReconnect = (reason) => {
14
+ if (!isPaused) {
15
+ callbacks.onReconnecting(client, reason);
16
+ reconnectLoop = null;
17
+ startConnectionLoop();
18
+ }
19
+ };
20
+ const onConnected = () => callbacks.onConnected(client);
21
+ client.on(events.connected, onConnected);
22
+ const onDisconnected = (...args) => {
23
+ const err = args[0] instanceof Error ? args[0].message : null;
24
+ debug(scope, "Disconnected event received", err);
25
+ triggerReconnect(err);
26
+ };
27
+ const onError = (err) => {
28
+ const errorMsg = err?.message || String(err);
29
+ debug(scope, "Error event received", errorMsg);
30
+ triggerReconnect(errorMsg);
31
+ if (callbacks.onError) {
32
+ callbacks.onError(client, err);
33
+ }
34
+ };
35
+ client.on(events.disconnected, onDisconnected);
36
+ if (events.error) {
37
+ client.on(events.error, onError);
50
38
  }
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,
39
+ const setupVisibilityHandling = () => {
40
+ if (typeof document === "undefined") {
41
+ return;
42
+ }
43
+ visibilityChangeHandler = () => {
44
+ const state = document.visibilityState;
45
+ if (onVisibilityChange) {
46
+ const context = {
47
+ client,
48
+ state,
49
+ setPaused: (value) => {
50
+ isPaused = value;
51
+ },
52
+ isPaused: () => isPaused,
53
+ startConnectionLoop,
54
+ };
55
+ (async () => {
56
+ try {
57
+ await onVisibilityChange(context);
58
+ }
59
+ catch (err) {
60
+ debug(scope, "Error in custom visibility change handler:", err);
61
+ }
62
+ })();
63
+ return;
64
+ }
65
+ if (state === "hidden") {
66
+ isPaused = true;
67
+ (async () => {
68
+ try {
69
+ await client.disconnect();
70
+ callbacks.onDisconnected(client);
71
+ }
72
+ catch (err) {
73
+ debug(scope, "Error disconnecting on visibility change:", err);
74
+ }
75
+ })();
76
+ }
77
+ else if (state === "visible") {
78
+ if (isPaused) {
79
+ isPaused = false;
80
+ startConnectionLoop();
81
+ }
82
+ }
62
83
  };
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();
84
+ document.addEventListener("visibilitychange", visibilityChangeHandler);
85
+ };
86
+ const startConnectionLoop = () => {
87
+ if (reconnectLoop) {
88
+ return;
86
89
  }
87
- }
90
+ reconnectLoop = (async () => {
91
+ let reconnectAttempts = 0;
92
+ let wasConnected = false;
93
+ while (true) {
94
+ if (isPaused) {
95
+ await sleep(1000);
96
+ continue;
97
+ }
98
+ try {
99
+ await client.connect();
100
+ // onConnected is fired via the "connection" event emitted inside client.connect()
101
+ // — do NOT call callbacks.onConnected here too, that would double-fire it.
102
+ reconnectAttempts = 0;
103
+ wasConnected = true;
104
+ reconnectLoop = null;
105
+ return;
106
+ }
107
+ catch (e) {
108
+ reconnectAttempts++;
109
+ if (wasConnected || reconnectAttempts === 1) {
110
+ callbacks.onReconnecting(client, `${e}`);
111
+ wasConnected = false;
112
+ }
113
+ if (reconnectAttempts > maxReconnectAttempts) {
114
+ callbacks.onDisconnected(client);
115
+ reconnectLoop = null;
116
+ return;
117
+ }
118
+ try {
119
+ await client.disconnect();
120
+ }
121
+ catch (disconnectError) {
122
+ debug(scope, "Failed to disconnect client", disconnectError);
123
+ }
124
+ await sleep(reconnectInterval);
125
+ }
126
+ }
127
+ })();
88
128
  };
89
- document.addEventListener("visibilitychange", visibilityChangeHandler);
90
- };
91
- const startConnectionLoop = () => {
92
- if (reconnectLoop) {
93
- return;
129
+ if (enableVisibilityHandling) {
130
+ setupVisibilityHandling();
94
131
  }
95
- reconnectLoop = (async () => {
96
- let reconnectAttempts = 0;
97
- let wasConnected = false;
98
- while (true) {
99
- if (isPaused) {
100
- await sleep(1000);
101
- continue;
132
+ const cleanup = async () => {
133
+ isPaused = true;
134
+ if (typeof document !== "undefined" && visibilityChangeHandler !== null) {
135
+ document.removeEventListener("visibilitychange", visibilityChangeHandler);
102
136
  }
137
+ client.off(events.connected, onConnected);
138
+ client.off(events.disconnected, onDisconnected);
139
+ if (events.error) {
140
+ client.off(events.error, onError);
141
+ }
142
+ callbacks.onDisconnected(client);
103
143
  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
144
  await client.disconnect();
124
- } catch (disconnectError) {
125
- debug(scope, "Failed to disconnect client", disconnectError);
126
- }
127
- await sleep(reconnectInterval);
128
145
  }
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
- };
146
+ catch (e) {
147
+ debug(scope, "Failed to disconnect client during cleanup", e);
148
+ }
149
+ };
150
+ return {
151
+ cleanup,
152
+ startConnectionLoop,
153
+ };
156
154
  };
157
- //# sourceMappingURL=connection-manager.js.map
155
+ //# sourceMappingURL=connection-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../src/connection-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../src/connection-manager.ts"],"names":[],"mappings":"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"}
@@ -3,25 +3,23 @@ import { RelayStatusCallback } from "./relay-handler.js";
3
3
  import { KeyExchangeCredentials } from "./key-exchange.js";
4
4
  import { EventEmitter } from "eventemitter3";
5
5
  export interface DappRelayOptions {
6
- explicitRelayUrls?: string[];
7
- reconnectInterval?: number;
8
- maxReconnectAttempts?: number;
9
- existingCredentials?: {
10
- privateKey: string;
11
- secret: string;
12
- };
6
+ explicitRelayUrls?: string[];
7
+ reconnectInterval?: number;
8
+ maxReconnectAttempts?: number;
9
+ existingCredentials?: {
10
+ privateKey: string;
11
+ secret: string;
12
+ walletPublicKey: string;
13
+ };
13
14
  }
14
15
  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;
16
+ client: RelayClient;
17
+ uri: string;
18
+ qrUri: string;
19
+ credentials: KeyExchangeCredentials;
20
+ events: EventEmitter<{
21
+ keyexchangecomplete: [walletPublicKey: Uint8Array];
22
+ }>;
23
+ cleanup: () => void;
23
24
  }
24
- export declare function initiateDappRelay(
25
- statusCallback: RelayStatusCallback,
26
- options?: DappRelayOptions,
27
- ): DappRelayResult;
25
+ export declare function initiateDappRelay(statusCallback: RelayStatusCallback, options?: DappRelayOptions): DappRelayResult;
@@ -1,129 +1,117 @@
1
- import { initiateRelay } from "./relay-handler.js";
1
+ // Copyright (C) 2026 Whiterun LLC,
2
+ // This software is licensed under the GNU Lesser General Public License (LGPL), version 3.0 or later.
3
+ // A copy of the license can be found in the LICENSE file or at https://www.gnu.org/licenses/lgpl-3.0.html
4
+ import { initiateRelay, } from "./relay-handler.js";
2
5
  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";
6
+ import { generateKeyExchangeCredentials, encodeKeyExchangeURI, DEFAULT_RELAY_HOSTNAME, DEFAULT_RELAY_PORT, DEFAULT_RELAY_PROTOCOL, } from "./key-exchange.js";
10
7
  import { hexToBin, binToHex } from "@bitauth/libauth";
11
8
  import { EventEmitter } from "eventemitter3";
12
9
  import { deriveNostrPublicKey } from "./utilnostr.js";
13
10
  import { error as logError, warn, Scope } from "./log.js";
14
11
  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);
12
+ const events = new EventEmitter();
13
+ let credentials;
14
+ let dappPrivateKey;
15
+ if (options.existingCredentials) {
16
+ const privateKeyHex = options.existingCredentials.privateKey;
17
+ if (privateKeyHex.length !== 64) {
18
+ throw new Error("Private key must be 64 hex characters (32 bytes)");
19
+ }
20
+ dappPrivateKey = hexToBin(privateKeyHex);
21
+ const dappPublicKeyHex = deriveNostrPublicKey(dappPrivateKey);
22
+ credentials = {
23
+ privateKey: privateKeyHex,
24
+ publicKey: dappPublicKeyHex,
25
+ secret: options.existingCredentials.secret,
26
+ };
44
27
  }
45
- if (relayUrl.startsWith("wss://")) {
46
- uriOptions.protocol = "wss";
47
- } else if (relayUrl.startsWith("ws://")) {
48
- uriOptions.protocol = "ws";
28
+ else {
29
+ credentials = generateKeyExchangeCredentials();
30
+ dappPrivateKey = hexToBin(credentials.privateKey);
49
31
  }
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
32
+ let uriOptions = {};
33
+ if (options.explicitRelayUrls && options.explicitRelayUrls.length > 0) {
34
+ const relayUrl = options.explicitRelayUrls[0];
35
+ const hostMatch = relayUrl.match(/^wss?:\/\/([^:/]+)/);
36
+ const portMatch = relayUrl.match(/:(\d+)/);
37
+ if (hostMatch) {
38
+ uriOptions.hostname = hostMatch[1];
39
+ }
40
+ if (portMatch) {
41
+ uriOptions.port = parseInt(portMatch[1], 10);
42
+ }
43
+ if (relayUrl.startsWith("wss://")) {
44
+ uriOptions.protocol = "wss";
45
+ }
46
+ else if (relayUrl.startsWith("ws://")) {
47
+ uriOptions.protocol = "ws";
93
48
  }
94
- });
95
49
  }
96
- if (payload.status.status === "connected") {
97
- if (walletPublicKeyNostr && relayClient) {
98
- relayClient.setPairedPublicKey(walletPublicKeyNostr);
50
+ const { uri, qrUri } = encodeKeyExchangeURI(credentials.publicKey, credentials.secret, uriOptions);
51
+ let relayClient = null;
52
+ let keyExchanged = false;
53
+ let walletPublicKeyNostr = null;
54
+ if (options.existingCredentials) {
55
+ walletPublicKeyNostr = hexToBin(options.existingCredentials.walletPublicKey);
99
56
  keyExchanged = true;
100
- }
101
57
  }
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}`,
58
+ const wrappedCallback = (payload) => {
59
+ if (!relayClient) {
60
+ relayClient = payload.client;
61
+ relayClient.on("message", async (message) => {
62
+ if (message.action === RelayMsgAction.WalletReady) {
63
+ const walletReady = message;
64
+ if (walletReady.secret !== credentials.secret) {
65
+ if (!keyExchanged) {
66
+ logError(Scope.Relay, "Key exchange failed: secret mismatch");
67
+ }
68
+ return;
69
+ }
70
+ const receivedWalletKey = hexToBin(walletReady.public_key);
71
+ if (receivedWalletKey.length !== 32) {
72
+ logError(Scope.Relay, "Invalid wallet public key length");
73
+ return;
74
+ }
75
+ if (keyExchanged && walletPublicKeyNostr) {
76
+ if (binToHex(receivedWalletKey) !== binToHex(walletPublicKeyNostr)) {
77
+ warn(Scope.Relay, "Different wallet connected (different public key)");
78
+ }
79
+ }
80
+ walletPublicKeyNostr = receivedWalletKey;
81
+ relayClient.setPairedPublicKey(receivedWalletKey);
82
+ if (!keyExchanged) {
83
+ keyExchanged = true;
84
+ events.emit("keyexchangecomplete", receivedWalletKey);
85
+ }
86
+ // NOTE: do NOT return — message also propagates to DappConnectionManager's listener
87
+ }
88
+ });
89
+ }
90
+ if (payload.status.status === "connected") {
91
+ if (walletPublicKeyNostr && relayClient) {
92
+ relayClient.setPairedPublicKey(walletPublicKeyNostr);
93
+ keyExchanged = true;
94
+ }
95
+ }
96
+ statusCallback(payload);
97
+ };
98
+ const relayUrls = options.explicitRelayUrls && options.explicitRelayUrls.length > 0
99
+ ? options.explicitRelayUrls
100
+ : [
101
+ `${DEFAULT_RELAY_PROTOCOL}://${DEFAULT_RELAY_HOSTNAME}:${DEFAULT_RELAY_PORT}`,
109
102
  ];
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
- };
103
+ const cleanup = initiateRelay(wrappedCallback, dappPrivateKey, new Uint8Array(33), {
104
+ explicitRelayUrls: relayUrls,
105
+ reconnectInterval: options.reconnectInterval,
106
+ maxReconnectAttempts: options.maxReconnectAttempts,
107
+ });
108
+ return {
109
+ client: relayClient,
110
+ uri,
111
+ qrUri,
112
+ credentials,
113
+ events,
114
+ cleanup,
115
+ };
128
116
  }
129
- //# sourceMappingURL=dapp-relay.js.map
117
+ //# sourceMappingURL=dapp-relay.js.map