@wizardconnect/core 0.1.0 → 0.1.3
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.
- package/dist/connection-manager.d.ts +18 -29
- package/dist/connection-manager.js +142 -144
- package/dist/connection-manager.js.map +1 -1
- package/dist/dapp-relay.d.ts +16 -19
- package/dist/dapp-relay.js +100 -116
- package/dist/dapp-relay.js.map +1 -1
- package/dist/index.d.ts +4 -24
- package/dist/index.js +6 -15
- package/dist/index.js.map +1 -1
- package/dist/key-exchange.d.ts +17 -23
- package/dist/key-exchange.js +124 -144
- package/dist/key-exchange.js.map +1 -1
- package/dist/log.d.ts +3 -3
- package/dist/log.js +11 -8
- package/dist/log.js.map +1 -1
- package/dist/message-queue.d.ts +12 -12
- package/dist/message-queue.js +53 -52
- package/dist/message-queue.js.map +1 -1
- package/dist/primitives.js +14 -11
- package/dist/primitives.js.map +1 -1
- package/dist/protocols/base.d.ts +22 -28
- package/dist/protocols/base.js +25 -28
- package/dist/protocols/base.js.map +1 -1
- package/dist/protocols/hdwalletv1.d.ts +25 -31
- package/dist/protocols/hdwalletv1.js +47 -57
- package/dist/protocols/hdwalletv1.js.map +1 -1
- package/dist/relay-client.d.ts +32 -32
- package/dist/relay-client.js +242 -291
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-handler.d.ts +13 -22
- package/dist/relay-handler.js +107 -117
- package/dist/relay-handler.js.map +1 -1
- package/dist/utilnostr.d.ts +1 -3
- package/dist/utilnostr.js +9 -10
- package/dist/utilnostr.js.map +1 -1
- package/dist/wallet-relay.d.ts +11 -14
- package/dist/wallet-relay.js +58 -64
- package/dist/wallet-relay.js.map +1 -1
- package/package.json +8 -3
package/dist/relay-handler.js
CHANGED
|
@@ -1,125 +1,115 @@
|
|
|
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 { RelayClient } from "./relay-client.js";
|
|
2
|
-
import { createConnectionManager } from "./connection-manager.js";
|
|
5
|
+
import { createConnectionManager, } from "./connection-manager.js";
|
|
3
6
|
import { debug, error as logError, Scope } from "./log.js";
|
|
4
7
|
export class RelayStatus {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
8
|
+
status;
|
|
9
|
+
error;
|
|
10
|
+
sessionId;
|
|
11
|
+
constructor(status, error, sessionId = null) {
|
|
12
|
+
this.status = status;
|
|
13
|
+
this.error = error;
|
|
14
|
+
this.sessionId = sessionId;
|
|
15
|
+
}
|
|
16
|
+
static connected(sessionId) {
|
|
17
|
+
return new RelayStatus("connected", null, sessionId || null);
|
|
18
|
+
}
|
|
19
|
+
static reconnecting(reason, sessionId) {
|
|
20
|
+
return new RelayStatus("reconnecting", reason, sessionId || null);
|
|
21
|
+
}
|
|
22
|
+
static disconnected() {
|
|
23
|
+
return new RelayStatus("disconnected", null, null);
|
|
24
|
+
}
|
|
25
|
+
static sessionDeleted() {
|
|
26
|
+
return new RelayStatus("session_deleted", null, null);
|
|
27
|
+
}
|
|
25
28
|
}
|
|
26
|
-
export const initiateRelay = (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
onConnected: () => {
|
|
42
|
-
if (lastProcessedTimestamp > 0) {
|
|
43
|
-
client.setLastProcessedTimestamp(lastProcessedTimestamp);
|
|
44
|
-
} else {
|
|
45
|
-
lastProcessedTimestamp = client.getLastProcessedTimestamp();
|
|
46
|
-
}
|
|
47
|
-
dispatchCallback({
|
|
48
|
-
client,
|
|
49
|
-
status: RelayStatus.connected(),
|
|
50
|
-
});
|
|
51
|
-
},
|
|
52
|
-
onReconnecting: (_client, reason) => {
|
|
53
|
-
dispatchCallback({
|
|
54
|
-
client,
|
|
55
|
-
status: RelayStatus.reconnecting(reason),
|
|
56
|
-
});
|
|
57
|
-
},
|
|
58
|
-
onDisconnected: () => {
|
|
59
|
-
dispatchCallback({
|
|
60
|
-
client,
|
|
61
|
-
status: RelayStatus.disconnected(),
|
|
62
|
-
});
|
|
63
|
-
},
|
|
64
|
-
onError: (_client, _error) => {
|
|
65
|
-
// Error handling is already done in onReconnecting
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
connected: "connection",
|
|
70
|
-
disconnected: "disconnect",
|
|
71
|
-
error: "error",
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
reconnectInterval: options?.reconnectInterval,
|
|
75
|
-
maxReconnectAttempts: options?.maxReconnectAttempts,
|
|
76
|
-
enableVisibilityHandling: options?.enableVisibilityHandling ?? true,
|
|
77
|
-
scope: Scope.Relay,
|
|
78
|
-
onVisibilityChange: async (context) => {
|
|
79
|
-
if (context.state === "hidden") {
|
|
80
|
-
debug(Scope.Relay, "Page hidden, disconnecting relay");
|
|
81
|
-
context.setPaused(true);
|
|
82
|
-
try {
|
|
83
|
-
await client.disconnect();
|
|
84
|
-
lastProcessedTimestamp = client.getLastProcessedTimestamp();
|
|
85
|
-
debug(
|
|
86
|
-
Scope.Relay,
|
|
87
|
-
`Disconnected, last processed timestamp: ${lastProcessedTimestamp}`,
|
|
88
|
-
);
|
|
29
|
+
export const initiateRelay = (dispatchCallback, signerPrivateKey, pairPublicKey, options) => {
|
|
30
|
+
const client = new RelayClient({
|
|
31
|
+
explicitRelayUrls: options?.explicitRelayUrls ?? [],
|
|
32
|
+
signerPrivateKey: signerPrivateKey,
|
|
33
|
+
pairedPublicKey: pairPublicKey,
|
|
34
|
+
});
|
|
35
|
+
let lastProcessedTimestamp = 0;
|
|
36
|
+
const connectionManager = createConnectionManager(client, {
|
|
37
|
+
onConnected: () => {
|
|
38
|
+
if (lastProcessedTimestamp > 0) {
|
|
39
|
+
client.setLastProcessedTimestamp(lastProcessedTimestamp);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
lastProcessedTimestamp = client.getLastProcessedTimestamp();
|
|
43
|
+
}
|
|
89
44
|
dispatchCallback({
|
|
90
|
-
|
|
91
|
-
|
|
45
|
+
client,
|
|
46
|
+
status: RelayStatus.connected(),
|
|
92
47
|
});
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
48
|
+
},
|
|
49
|
+
onReconnecting: (_client, reason) => {
|
|
50
|
+
dispatchCallback({
|
|
51
|
+
client,
|
|
52
|
+
status: RelayStatus.reconnecting(reason),
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
onDisconnected: () => {
|
|
56
|
+
dispatchCallback({
|
|
57
|
+
client,
|
|
58
|
+
status: RelayStatus.disconnected(),
|
|
59
|
+
});
|
|
60
|
+
},
|
|
61
|
+
onError: (_client, _error) => {
|
|
62
|
+
// Error handling is already done in onReconnecting
|
|
63
|
+
},
|
|
64
|
+
}, {
|
|
65
|
+
connected: "connection",
|
|
66
|
+
disconnected: "disconnect",
|
|
67
|
+
error: "error",
|
|
68
|
+
}, {
|
|
69
|
+
reconnectInterval: options?.reconnectInterval,
|
|
70
|
+
maxReconnectAttempts: options?.maxReconnectAttempts,
|
|
71
|
+
enableVisibilityHandling: options?.enableVisibilityHandling ?? true,
|
|
72
|
+
scope: Scope.Relay,
|
|
73
|
+
onVisibilityChange: async (context) => {
|
|
74
|
+
if (context.state === "hidden") {
|
|
75
|
+
debug(Scope.Relay, "Page hidden, disconnecting relay");
|
|
76
|
+
context.setPaused(true);
|
|
77
|
+
try {
|
|
78
|
+
await client.disconnect();
|
|
79
|
+
lastProcessedTimestamp = client.getLastProcessedTimestamp();
|
|
80
|
+
debug(Scope.Relay, `Disconnected, last processed timestamp: ${lastProcessedTimestamp}`);
|
|
81
|
+
dispatchCallback({
|
|
82
|
+
client,
|
|
83
|
+
status: RelayStatus.disconnected(),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
logError(Scope.Relay, "Error disconnecting on visibility change:", error);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else if (context.state === "visible") {
|
|
91
|
+
if (context.isPaused()) {
|
|
92
|
+
debug(Scope.Relay, "Page visible, reconnecting relay");
|
|
93
|
+
context.setPaused(false);
|
|
94
|
+
context.startConnectionLoop();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
115
98
|
});
|
|
116
|
-
(
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
99
|
+
connectionManager.startConnectionLoop();
|
|
100
|
+
return () => {
|
|
101
|
+
dispatchCallback({
|
|
102
|
+
client,
|
|
103
|
+
status: RelayStatus.disconnected(),
|
|
104
|
+
});
|
|
105
|
+
(async () => {
|
|
106
|
+
try {
|
|
107
|
+
await connectionManager.cleanup();
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Ignore disconnect errors during cleanup
|
|
111
|
+
}
|
|
112
|
+
})();
|
|
113
|
+
};
|
|
124
114
|
};
|
|
125
|
-
//# sourceMappingURL=relay-handler.js.map
|
|
115
|
+
//# sourceMappingURL=relay-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-handler.js","sourceRoot":"","sources":["../src/relay-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAQ3D,MAAM,OAAO,WAAW;IACtB,MAAM,CAAkB;IACxB,KAAK,CAAgB;IACrB,SAAS,CAAgB;IAEzB,YACE,MAAuB,EACvB,KAAoB,EACpB,YAA2B,IAAI;QAE/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,SAAkB;QACjC,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,MAAqB,EAAE,SAAkB;QAC3D,OAAO,IAAI,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,WAAW,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,cAAc;QACnB,OAAO,IAAI,WAAW,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;CACF;AASD,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,gBAAqC,EACrC,gBAA4B,EAC5B,aAAyB,EACzB,OAKC,EACD,EAAE;IACF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;QAC7B,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,IAAI,EAAE;QACnD,gBAAgB,EAAE,gBAAgB;QAClC,eAAe,EAAE,aAAa;KAC/B,CAAC,CAAC;IAEH,IAAI,sBAAsB,GAAW,CAAC,CAAC;IAEvC,MAAM,iBAAiB,GAAG,uBAAuB,CAC/C,MAAM,EACN;QACE,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,sBAAsB,GAAG,MAAM,CAAC,yBAAyB,EAAE,CAAC;YAC9D,CAAC;YACD,gBAAgB,CAAC;gBACf,MAAM;gBACN,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE;aAChC,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,CAAC,OAAoB,EAAE,MAAqB,EAAE,EAAE;YAC9D,gBAAgB,CAAC;gBACf,MAAM;gBACN,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC;aACzC,CAAC,CAAC;QACL,CAAC;QACD,cAAc,EAAE,GAAG,EAAE;YACnB,gBAAgB,CAAC;gBACf,MAAM;gBACN,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE;aACnC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC,OAAoB,EAAE,MAAW,EAAE,EAAE;YAC7C,mDAAmD;QACrD,CAAC;KACF,EACD;QACE,SAAS,EAAE,YAAY;QACvB,YAAY,EAAE,YAAY;QAC1B,KAAK,EAAE,OAAO;KACf,EACD;QACE,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;QAC7C,oBAAoB,EAAE,OAAO,EAAE,oBAAoB;QACnD,wBAAwB,EAAE,OAAO,EAAE,wBAAwB,IAAI,IAAI;QACnE,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,kBAAkB,EAAE,KAAK,EACvB,OAA6C,EAC7C,EAAE;YACF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC/B,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC;gBACvD,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;oBAC1B,sBAAsB,GAAG,MAAM,CAAC,yBAAyB,EAAE,CAAC;oBAC5D,KAAK,CACH,KAAK,CAAC,KAAK,EACX,2CAA2C,sBAAsB,EAAE,CACpE,CAAC;oBACF,gBAAgB,CAAC;wBACf,MAAM;wBACN,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE;qBACnC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,QAAQ,CACN,KAAK,CAAC,KAAK,EACX,2CAA2C,EAC3C,KAAK,CACN,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACvC,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;oBACvB,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,kCAAkC,CAAC,CAAC;oBACvD,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;KACF,CACF,CAAC;IAEF,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;IAExC,OAAO,GAAG,EAAE;QACV,gBAAgB,CAAC;YACf,MAAM;YACN,MAAM,EAAE,WAAW,CAAC,YAAY,EAAE;SACnC,CAAC,CAAC;QAEH,CAAC,KAAK,IAAI,EAAE;YACV,IAAI,CAAC;gBACH,MAAM,iBAAiB,CAAC,OAAO,EAAE,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"relay-handler.js","sourceRoot":"","sources":["../src/relay-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/utilnostr.d.ts
CHANGED
package/dist/utilnostr.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
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 { binToHex, secp256k1 } from "@bitauth/libauth";
|
|
2
5
|
import { unwrap } from "./primitives.js";
|
|
3
6
|
export function deriveNostrPublicKey(privateKey) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const publicKeyNostr = publicKeyCompressed.slice(1);
|
|
8
|
-
return binToHex(publicKeyNostr);
|
|
7
|
+
const publicKeyCompressed = unwrap(secp256k1.derivePublicKeyCompressed(privateKey));
|
|
8
|
+
const publicKeyNostr = publicKeyCompressed.slice(1);
|
|
9
|
+
return binToHex(publicKeyNostr);
|
|
9
10
|
}
|
|
10
11
|
export function deriveNostrPublicKeyBytes(privateKey) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
);
|
|
14
|
-
return publicKeyCompressed.slice(1);
|
|
12
|
+
const publicKeyCompressed = unwrap(secp256k1.derivePublicKeyCompressed(privateKey));
|
|
13
|
+
return publicKeyCompressed.slice(1);
|
|
15
14
|
}
|
|
16
|
-
//# sourceMappingURL=utilnostr.js.map
|
|
15
|
+
//# sourceMappingURL=utilnostr.js.map
|
package/dist/utilnostr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilnostr.js","sourceRoot":"","sources":["../src/utilnostr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,UAAsB;IACzD,MAAM,mBAAmB,GAAG,MAAM,CAChC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAChD,CAAC;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAsB;IAC9D,MAAM,mBAAmB,GAAG,MAAM,CAChC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAChD,CAAC;IACF,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
|
1
|
+
{"version":3,"file":"utilnostr.js","sourceRoot":"","sources":["../src/utilnostr.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,sGAAsG;AACtG,0GAA0G;AAE1G,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,UAAU,oBAAoB,CAAC,UAAsB;IACzD,MAAM,mBAAmB,GAAG,MAAM,CAChC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAChD,CAAC;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC,cAAc,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAsB;IAC9D,MAAM,mBAAmB,GAAG,MAAM,CAChC,SAAS,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAChD,CAAC;IACF,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC"}
|
package/dist/wallet-relay.d.ts
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
1
|
import { RelayClient } from "./relay-client.js";
|
|
2
2
|
import { RelayStatusCallback } from "./relay-handler.js";
|
|
3
3
|
export interface WalletRelayOptions {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
uri: string;
|
|
5
|
+
walletPrivateKey: Uint8Array;
|
|
6
|
+
explicitRelayUrls?: string[];
|
|
7
|
+
reconnectInterval?: number;
|
|
8
|
+
maxReconnectAttempts?: number;
|
|
9
9
|
}
|
|
10
10
|
export interface WalletRelayResult {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
client: RelayClient;
|
|
12
|
+
dappPublicKey: Uint8Array;
|
|
13
|
+
walletPublicKey: Uint8Array;
|
|
14
|
+
secret: string;
|
|
15
|
+
cleanup: () => void;
|
|
16
16
|
}
|
|
17
|
-
export declare function initiateWalletRelay(
|
|
18
|
-
statusCallback: RelayStatusCallback,
|
|
19
|
-
options: WalletRelayOptions,
|
|
20
|
-
): WalletRelayResult;
|
|
17
|
+
export declare function initiateWalletRelay(statusCallback: RelayStatusCallback, options: WalletRelayOptions): WalletRelayResult;
|
package/dist/wallet-relay.js
CHANGED
|
@@ -1,71 +1,65 @@
|
|
|
1
|
-
|
|
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 { decodeKeyExchangeURI, DEFAULT_RELAY_PORT } from "./key-exchange.js";
|
|
3
|
-
import {
|
|
6
|
+
import { hexToBin } from "@bitauth/libauth";
|
|
4
7
|
import { deriveNostrPublicKeyBytes } from "./utilnostr.js";
|
|
5
8
|
export function initiateWalletRelay(statusCallback, options) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} catch (err) {
|
|
10
|
-
throw new Error(`Failed to decode connection URI: ${err.message}`, {
|
|
11
|
-
cause: err,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
const dappPublicKeyHex = decoded.publicKey;
|
|
15
|
-
const secret = decoded.secret;
|
|
16
|
-
const dappPublicKeyNostr = hexToBin(dappPublicKeyHex);
|
|
17
|
-
const hostname = decoded.hostname;
|
|
18
|
-
const protocol = decoded.protocol;
|
|
19
|
-
const port = decoded.port;
|
|
20
|
-
const relayUrl = `${protocol}://${hostname}${port === (protocol === "wss" ? DEFAULT_RELAY_PORT : 80) ? "" : `:${port}`}`;
|
|
21
|
-
const walletPublicKeyNostr = deriveNostrPublicKeyBytes(
|
|
22
|
-
options.walletPrivateKey,
|
|
23
|
-
);
|
|
24
|
-
const walletPublicKeyHex = binToHex(walletPublicKeyNostr);
|
|
25
|
-
let relayClient = null;
|
|
26
|
-
const wrappedCallback = (payload) => {
|
|
27
|
-
if (!relayClient) {
|
|
28
|
-
relayClient = payload.client;
|
|
9
|
+
let decoded;
|
|
10
|
+
try {
|
|
11
|
+
decoded = decodeKeyExchangeURI(options.uri);
|
|
29
12
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
13
|
+
catch (err) {
|
|
14
|
+
throw new Error(`Failed to decode connection URI: ${err.message}`, {
|
|
15
|
+
cause: err,
|
|
16
|
+
});
|
|
34
17
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
18
|
+
const dappPublicKeyHex = decoded.publicKey;
|
|
19
|
+
const secret = decoded.secret;
|
|
20
|
+
const dappPublicKeyNostr = hexToBin(dappPublicKeyHex);
|
|
21
|
+
const hostname = decoded.hostname;
|
|
22
|
+
const protocol = decoded.protocol;
|
|
23
|
+
const port = decoded.port;
|
|
24
|
+
const relayUrl = `${protocol}://${hostname}${port === (protocol === "wss" ? DEFAULT_RELAY_PORT : 80) ? "" : `:${port}`}`;
|
|
25
|
+
const walletPublicKeyNostr = deriveNostrPublicKeyBytes(options.walletPrivateKey);
|
|
26
|
+
let relayClient = null;
|
|
27
|
+
const wrappedCallback = (payload) => {
|
|
28
|
+
if (!relayClient) {
|
|
29
|
+
relayClient = payload.client;
|
|
30
|
+
}
|
|
31
|
+
if (payload.status.status === "connected") {
|
|
32
|
+
// Set dapp's pubkey so outbound messages are addressed correctly.
|
|
33
|
+
// The wallet's own pubkey + secret are delivered via wallet_ready.
|
|
34
|
+
relayClient.setPairedPublicKey(dappPublicKeyNostr);
|
|
35
|
+
}
|
|
36
|
+
statusCallback(payload);
|
|
37
|
+
};
|
|
38
|
+
const relayUrls = [relayUrl];
|
|
39
|
+
if (options.explicitRelayUrls && options.explicitRelayUrls.length > 0) {
|
|
40
|
+
for (const explicitUrl of options.explicitRelayUrls) {
|
|
41
|
+
if (!relayUrls.includes(explicitUrl)) {
|
|
42
|
+
relayUrls.push(explicitUrl);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
43
45
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
{
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return relayClient;
|
|
63
|
-
},
|
|
64
|
-
dappPublicKey: dappPublicKeyNostr,
|
|
65
|
-
walletPublicKey: walletPublicKeyNostr,
|
|
66
|
-
secret,
|
|
67
|
-
cleanup,
|
|
68
|
-
};
|
|
69
|
-
return result;
|
|
46
|
+
const cleanup = initiateRelay(wrappedCallback, options.walletPrivateKey, dappPublicKeyNostr, {
|
|
47
|
+
explicitRelayUrls: relayUrls,
|
|
48
|
+
reconnectInterval: options.reconnectInterval,
|
|
49
|
+
maxReconnectAttempts: options.maxReconnectAttempts,
|
|
50
|
+
});
|
|
51
|
+
const result = {
|
|
52
|
+
get client() {
|
|
53
|
+
if (!relayClient) {
|
|
54
|
+
throw new Error("Relay client not yet initialized. Wait for connection status callback.");
|
|
55
|
+
}
|
|
56
|
+
return relayClient;
|
|
57
|
+
},
|
|
58
|
+
dappPublicKey: dappPublicKeyNostr,
|
|
59
|
+
walletPublicKey: walletPublicKeyNostr,
|
|
60
|
+
secret,
|
|
61
|
+
cleanup,
|
|
62
|
+
};
|
|
63
|
+
return result;
|
|
70
64
|
}
|
|
71
|
-
//# sourceMappingURL=wallet-relay.js.map
|
|
65
|
+
//# sourceMappingURL=wallet-relay.js.map
|
package/dist/wallet-relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-relay.js","sourceRoot":"","sources":["../src/wallet-relay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet-relay.js","sourceRoot":"","sources":["../src/wallet-relay.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wizardconnect/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Transport and protocol primitives for WizardConnect",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://gitlab.com/riftenlabs/lib/wizardconnect",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
6
11
|
"main": "dist/index.js",
|
|
7
12
|
"types": "dist/index.d.ts",
|
|
8
13
|
"files": [
|
|
@@ -11,11 +16,11 @@
|
|
|
11
16
|
"scripts": {
|
|
12
17
|
"build": "tsc",
|
|
13
18
|
"test": "vitest --config vitest.config.ts --run --passWithNoTests",
|
|
14
|
-
"lint:prettier": "prettier . --list-different",
|
|
19
|
+
"lint:prettier": "prettier --ignore-path ../../.gitignore . --list-different",
|
|
15
20
|
"lint:eslint": "eslint .",
|
|
16
21
|
"lint": "npm run lint:eslint && npm run lint:prettier",
|
|
17
22
|
"fix": "npm run fix:eslint && npm run fix:prettier",
|
|
18
|
-
"fix:prettier": "prettier . --write",
|
|
23
|
+
"fix:prettier": "prettier --ignore-path ../../.gitignore . --write",
|
|
19
24
|
"fix:eslint": "npm run lint:eslint -- --fix"
|
|
20
25
|
},
|
|
21
26
|
"dependencies": {
|