@bsv/sdk 1.2.20 → 1.2.22
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/cjs/package.json +3 -3
- package/dist/cjs/src/auth/Peer.js +536 -0
- package/dist/cjs/src/auth/Peer.js.map +1 -0
- package/dist/cjs/src/auth/SessionManager.js +66 -0
- package/dist/cjs/src/auth/SessionManager.js.map +1 -0
- package/dist/cjs/src/auth/{Certificate.js → certificates/Certificate.js} +22 -26
- package/dist/cjs/src/auth/certificates/Certificate.js.map +1 -0
- package/dist/cjs/src/auth/certificates/MasterCertificate.js +79 -0
- package/dist/cjs/src/auth/certificates/MasterCertificate.js.map +1 -0
- package/dist/cjs/src/auth/certificates/VerifiableCertificate.js +49 -0
- package/dist/cjs/src/auth/certificates/VerifiableCertificate.js.map +1 -0
- package/dist/cjs/src/auth/certificates/index.js +25 -0
- package/dist/cjs/src/auth/certificates/index.js.map +1 -0
- package/dist/cjs/src/auth/clients/AuthFetch.js +411 -0
- package/dist/cjs/src/auth/clients/AuthFetch.js.map +1 -0
- package/dist/cjs/src/auth/clients/index.js +18 -0
- package/dist/cjs/src/auth/clients/index.js.map +1 -0
- package/dist/cjs/src/auth/index.js +20 -5
- package/dist/cjs/src/auth/index.js.map +1 -1
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js +259 -0
- package/dist/cjs/src/auth/transports/SimplifiedFetchTransport.js.map +1 -0
- package/dist/cjs/src/auth/transports/index.js +18 -0
- package/dist/cjs/src/auth/transports/index.js.map +1 -0
- package/dist/cjs/src/auth/types.js +3 -0
- package/dist/cjs/src/auth/types.js.map +1 -0
- package/dist/cjs/src/auth/utils/certificateHelpers.js +51 -0
- package/dist/cjs/src/auth/utils/certificateHelpers.js.map +1 -0
- package/dist/cjs/src/auth/utils/createNonce.js +19 -0
- package/dist/cjs/src/auth/utils/createNonce.js.map +1 -0
- package/dist/cjs/src/auth/utils/getVerifiableCertificates.js +31 -0
- package/dist/cjs/src/auth/utils/getVerifiableCertificates.js.map +1 -0
- package/dist/cjs/src/auth/utils/index.js +22 -0
- package/dist/cjs/src/auth/utils/index.js.map +1 -0
- package/dist/cjs/src/auth/utils/validateCertificates.js +42 -0
- package/dist/cjs/src/auth/utils/validateCertificates.js.map +1 -0
- package/dist/cjs/src/auth/utils/verifyNonce.js +27 -0
- package/dist/cjs/src/auth/utils/verifyNonce.js.map +1 -0
- package/dist/cjs/src/primitives/Point.js +1 -1
- package/dist/cjs/src/primitives/Point.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js +148 -148
- package/dist/cjs/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/src/auth/Peer.js +533 -0
- package/dist/esm/src/auth/Peer.js.map +1 -0
- package/dist/esm/src/auth/SessionManager.js +63 -0
- package/dist/esm/src/auth/SessionManager.js.map +1 -0
- package/dist/esm/src/auth/{Certificate.js → certificates/Certificate.js} +1 -2
- package/dist/esm/src/auth/certificates/Certificate.js.map +1 -0
- package/dist/esm/src/auth/certificates/MasterCertificate.js +73 -0
- package/dist/esm/src/auth/certificates/MasterCertificate.js.map +1 -0
- package/dist/esm/src/auth/certificates/VerifiableCertificate.js +44 -0
- package/dist/esm/src/auth/certificates/VerifiableCertificate.js.map +1 -0
- package/dist/esm/src/auth/certificates/index.js +4 -0
- package/dist/esm/src/auth/certificates/index.js.map +1 -0
- package/dist/esm/src/auth/clients/AuthFetch.js +409 -0
- package/dist/esm/src/auth/clients/AuthFetch.js.map +1 -0
- package/dist/esm/src/auth/clients/index.js +2 -0
- package/dist/esm/src/auth/clients/index.js.map +1 -0
- package/dist/esm/src/auth/index.js +7 -1
- package/dist/esm/src/auth/index.js.map +1 -1
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js +258 -0
- package/dist/esm/src/auth/transports/SimplifiedFetchTransport.js.map +1 -0
- package/dist/esm/src/auth/transports/index.js +2 -0
- package/dist/esm/src/auth/transports/index.js.map +1 -0
- package/dist/esm/src/auth/types.js +2 -0
- package/dist/esm/src/auth/types.js.map +1 -0
- package/dist/esm/src/auth/utils/certificateHelpers.js +47 -0
- package/dist/esm/src/auth/utils/certificateHelpers.js.map +1 -0
- package/dist/esm/src/auth/utils/createNonce.js +16 -0
- package/dist/esm/src/auth/utils/createNonce.js.map +1 -0
- package/dist/esm/src/auth/utils/getVerifiableCertificates.js +27 -0
- package/dist/esm/src/auth/utils/getVerifiableCertificates.js.map +1 -0
- package/dist/esm/src/auth/utils/index.js +6 -0
- package/dist/esm/src/auth/utils/index.js.map +1 -0
- package/dist/esm/src/auth/utils/validateCertificates.js +38 -0
- package/dist/esm/src/auth/utils/validateCertificates.js.map +1 -0
- package/dist/esm/src/auth/utils/verifyNonce.js +24 -0
- package/dist/esm/src/auth/utils/verifyNonce.js.map +1 -0
- package/dist/esm/src/primitives/Point.js +1 -1
- package/dist/esm/src/primitives/Point.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireProcessor.js.map +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js +1 -1
- package/dist/esm/src/wallet/substrates/WalletWireTransceiver.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/types/src/auth/Peer.d.ts +193 -0
- package/dist/types/src/auth/Peer.d.ts.map +1 -0
- package/dist/types/src/auth/SessionManager.d.ts +42 -0
- package/dist/types/src/auth/SessionManager.d.ts.map +1 -0
- package/dist/types/src/auth/{Certificate.d.ts → certificates/Certificate.d.ts} +1 -1
- package/dist/types/src/auth/certificates/Certificate.d.ts.map +1 -0
- package/dist/types/src/auth/certificates/MasterCertificate.d.ts +38 -0
- package/dist/types/src/auth/certificates/MasterCertificate.d.ts.map +1 -0
- package/dist/types/src/auth/certificates/VerifiableCertificate.d.ts +26 -0
- package/dist/types/src/auth/certificates/VerifiableCertificate.d.ts.map +1 -0
- package/dist/types/src/auth/certificates/index.d.ts +4 -0
- package/dist/types/src/auth/certificates/index.d.ts.map +1 -0
- package/dist/types/src/auth/clients/AuthFetch.d.ts +87 -0
- package/dist/types/src/auth/clients/AuthFetch.d.ts.map +1 -0
- package/dist/types/src/auth/clients/index.d.ts +2 -0
- package/dist/types/src/auth/clients/index.d.ts.map +1 -0
- package/dist/types/src/auth/index.d.ts +7 -1
- package/dist/types/src/auth/index.d.ts.map +1 -1
- package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts +51 -0
- package/dist/types/src/auth/transports/SimplifiedFetchTransport.d.ts.map +1 -0
- package/dist/types/src/auth/transports/index.d.ts +2 -0
- package/dist/types/src/auth/transports/index.d.ts.map +1 -0
- package/dist/types/src/auth/types.d.ts +31 -0
- package/dist/types/src/auth/types.d.ts.map +1 -0
- package/dist/types/src/auth/utils/certificateHelpers.d.ts +26 -0
- package/dist/types/src/auth/utils/certificateHelpers.d.ts.map +1 -0
- package/dist/types/src/auth/utils/createNonce.d.ts +8 -0
- package/dist/types/src/auth/utils/createNonce.d.ts.map +1 -0
- package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts +13 -0
- package/dist/types/src/auth/utils/getVerifiableCertificates.d.ts.map +1 -0
- package/dist/types/src/auth/utils/index.d.ts +6 -0
- package/dist/types/src/auth/utils/index.d.ts.map +1 -0
- package/dist/types/src/auth/utils/validateCertificates.d.ts +12 -0
- package/dist/types/src/auth/utils/validateCertificates.d.ts.map +1 -0
- package/dist/types/src/auth/utils/verifyNonce.d.ts +9 -0
- package/dist/types/src/auth/utils/verifyNonce.d.ts.map +1 -0
- package/dist/types/src/primitives/Point.d.ts.map +1 -1
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/dist/umd/bundle.js +1 -1
- package/docs/README.md +1 -0
- package/docs/auth.md +1193 -0
- package/package.json +13 -3
- package/src/auth/Peer.ts +600 -0
- package/src/auth/SessionManager.ts +71 -0
- package/src/auth/__tests/Peer.test.ts +599 -0
- package/src/auth/__tests/SessionManager.test.ts +87 -0
- package/src/auth/{Certificate.ts → certificates/Certificate.ts} +15 -8
- package/src/auth/certificates/MasterCertificate.ts +106 -0
- package/src/auth/certificates/VerifiableCertificate.ts +73 -0
- package/src/auth/certificates/__tests/Certificate.test.ts +282 -0
- package/src/auth/certificates/index.ts +3 -0
- package/src/auth/clients/AuthFetch.ts +482 -0
- package/src/auth/clients/index.ts +1 -0
- package/src/auth/index.ts +7 -1
- package/src/auth/transports/SimplifiedFetchTransport.ts +288 -0
- package/src/auth/transports/index.ts +1 -0
- package/src/auth/types.ts +41 -0
- package/src/auth/utils/__tests/cryptononce.test.ts +84 -0
- package/src/auth/utils/__tests/getVerifiableCertificates.test.ts +126 -0
- package/src/auth/utils/__tests/validateCertificates.test.ts +142 -0
- package/src/auth/utils/certificateHelpers.ts +86 -0
- package/src/auth/utils/createNonce.ts +16 -0
- package/src/auth/utils/getVerifiableCertificates.ts +40 -0
- package/src/auth/utils/index.ts +5 -0
- package/src/auth/utils/validateCertificates.ts +54 -0
- package/src/auth/utils/verifyNonce.ts +27 -0
- package/src/primitives/Point.ts +59 -59
- package/src/wallet/substrates/WalletWireProcessor.ts +1 -1
- package/src/wallet/substrates/WalletWireTransceiver.ts +1 -1
- package/dist/cjs/src/auth/Certificate.js.map +0 -1
- package/dist/esm/src/auth/Certificate.js.map +0 -1
- package/dist/types/src/auth/Certificate.d.ts.map +0 -1
- package/src/auth/__tests/Certificate.test.ts +0 -282
package/dist/cjs/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bsv/sdk",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.22",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"description": "BSV Blockchain Software Development Kit",
|
|
6
6
|
"files": [
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"build:umd": "webpack --config webpack.config.js",
|
|
21
21
|
"dev": "tsc -b -w",
|
|
22
22
|
"prepublish": "npm run build",
|
|
23
|
-
"doc": "ts2md
|
|
23
|
+
"doc": "ts2md"
|
|
24
24
|
},
|
|
25
25
|
"repository": {
|
|
26
26
|
"type": "git",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"ts-jest": "^29.1.1",
|
|
47
47
|
"ts-loader": "^9.5.1",
|
|
48
48
|
"ts-standard": "^12.0.2",
|
|
49
|
-
"ts2md": "^0.2.
|
|
49
|
+
"ts2md": "^0.2.5",
|
|
50
50
|
"tsconfig-to-dual-package": "^1.2.0",
|
|
51
51
|
"typescript": "^5.2.2",
|
|
52
52
|
"webpack": "^5.95.0",
|
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Peer = void 0;
|
|
4
|
+
const SessionManager_js_1 = require("./SessionManager.js");
|
|
5
|
+
const index_js_1 = require("./utils/index.js");
|
|
6
|
+
const mod_js_1 = require("../../mod.js");
|
|
7
|
+
const AUTH_VERSION = '0.1';
|
|
8
|
+
/**
|
|
9
|
+
* Represents a peer capable of performing mutual authentication.
|
|
10
|
+
* Manages sessions, handles authentication handshakes, certificate requests and responses,
|
|
11
|
+
* and sending and receiving general messages over a transport layer.
|
|
12
|
+
*/
|
|
13
|
+
class Peer {
|
|
14
|
+
/**
|
|
15
|
+
* Creates a new Peer instance
|
|
16
|
+
*
|
|
17
|
+
* @param {Wallet} wallet - The wallet instance used for cryptographic operations.
|
|
18
|
+
* @param {Transport} transport - The transport mechanism used for sending and receiving messages.
|
|
19
|
+
* @param {RequestedCertificateSet} [certificatesToRequest] - Optional set of certificates to request from a peer during the initial handshake.
|
|
20
|
+
* @param {SessionManager} [sessionManager] - Optional SessionManager to be used for managing peer sessions.
|
|
21
|
+
*/
|
|
22
|
+
constructor(wallet, transport, certificatesToRequest, sessionManager) {
|
|
23
|
+
this.onGeneralMessageReceivedCallbacks = new Map();
|
|
24
|
+
this.onCertificatesReceivedCallbacks = new Map();
|
|
25
|
+
this.onCertificateRequestReceivedCallbacks = new Map();
|
|
26
|
+
this.onInitialResponseReceivedCallbacks = new Map();
|
|
27
|
+
// Single shared counter for all callback types
|
|
28
|
+
this.callbackIdCounter = 0;
|
|
29
|
+
this.wallet = wallet;
|
|
30
|
+
this.transport = transport;
|
|
31
|
+
this.certificatesToRequest = certificatesToRequest !== null && certificatesToRequest !== void 0 ? certificatesToRequest : { certifiers: [], types: {} };
|
|
32
|
+
this.transport.onData(this.handleIncomingMessage.bind(this));
|
|
33
|
+
this.sessionManager = sessionManager || new SessionManager_js_1.SessionManager();
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sends a general message to a peer, and initiates a handshake if necessary.
|
|
37
|
+
*
|
|
38
|
+
* @param {number[]} message - The message payload to send.
|
|
39
|
+
* @param {string} [identityKey] - The identity public key of the peer. If not provided, a handshake will be initiated.
|
|
40
|
+
* @returns {Promise<void>}
|
|
41
|
+
* @throws Will throw an error if the message fails to send.
|
|
42
|
+
*/
|
|
43
|
+
async toPeer(message, identityKey, maxWaitTime) {
|
|
44
|
+
const peerSession = await this.getAuthenticatedSession(identityKey, maxWaitTime);
|
|
45
|
+
// Prepare the general message
|
|
46
|
+
const requestNonce = mod_js_1.Utils.toBase64((0, mod_js_1.Random)(32));
|
|
47
|
+
const { signature } = await this.wallet.createSignature({
|
|
48
|
+
data: message,
|
|
49
|
+
protocolID: [2, 'auth message signature'],
|
|
50
|
+
keyID: `${requestNonce} ${peerSession.peerNonce}`,
|
|
51
|
+
counterparty: peerSession.peerIdentityKey
|
|
52
|
+
});
|
|
53
|
+
const generalMessage = {
|
|
54
|
+
version: AUTH_VERSION,
|
|
55
|
+
messageType: 'general',
|
|
56
|
+
identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
|
|
57
|
+
nonce: requestNonce,
|
|
58
|
+
yourNonce: peerSession.peerNonce,
|
|
59
|
+
payload: message,
|
|
60
|
+
signature
|
|
61
|
+
};
|
|
62
|
+
try {
|
|
63
|
+
await this.transport.send(generalMessage);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const e = new Error(`Failed to send message to peer ${peerSession.peerIdentityKey}: ${error.message}`);
|
|
67
|
+
e.stack = error.stack;
|
|
68
|
+
throw e;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Sends a request for certificates to a peer.
|
|
73
|
+
* This method allows a peer to dynamically request specific certificates after
|
|
74
|
+
* an initial handshake or message has been exchanged.
|
|
75
|
+
*
|
|
76
|
+
* @param {RequestedCertificateSet} certificatesToRequest - Specifies the certifiers and types of certificates required from the peer.
|
|
77
|
+
* @param {string} [identityKey] - The identity public key of the peer. If not provided, the current session identity is used.
|
|
78
|
+
* @param {number} [maxWaitTime=10000] - Maximum time in milliseconds to wait for the peer session to be authenticated.
|
|
79
|
+
* @returns {Promise<void>} Resolves if the certificate request message is successfully sent.
|
|
80
|
+
* @throws Will throw an error if the peer session is not authenticated or if sending the request fails.
|
|
81
|
+
*/
|
|
82
|
+
async requestCertificates(certificatesToRequest, identityKey, maxWaitTime = 10000) {
|
|
83
|
+
const peerSession = await this.getAuthenticatedSession(identityKey, maxWaitTime);
|
|
84
|
+
// Prepare the general message
|
|
85
|
+
const requestNonce = mod_js_1.Utils.toBase64((0, mod_js_1.Random)(32));
|
|
86
|
+
const { signature } = await this.wallet.createSignature({
|
|
87
|
+
data: mod_js_1.Utils.toArray(JSON.stringify(certificatesToRequest), 'utf8'),
|
|
88
|
+
protocolID: [2, 'auth message signature'],
|
|
89
|
+
keyID: `${requestNonce} ${peerSession.peerNonce}`,
|
|
90
|
+
counterparty: peerSession.peerIdentityKey
|
|
91
|
+
});
|
|
92
|
+
const certRequestMessage = {
|
|
93
|
+
version: AUTH_VERSION,
|
|
94
|
+
messageType: 'certificateRequest',
|
|
95
|
+
identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
|
|
96
|
+
nonce: requestNonce,
|
|
97
|
+
initialNonce: peerSession.sessionNonce,
|
|
98
|
+
yourNonce: peerSession.peerNonce,
|
|
99
|
+
requestedCertificates: certificatesToRequest,
|
|
100
|
+
signature
|
|
101
|
+
};
|
|
102
|
+
try {
|
|
103
|
+
await this.transport.send(certRequestMessage);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
throw new Error(`Failed to send certificate request message to peer ${peerSession.peerIdentityKey}: ${error.message}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Retrieves an authenticated session for a given peer identity. If no session exists
|
|
111
|
+
* or the session is not authenticated, initiates a handshake to create or authenticate the session.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} [identityKey] - The identity public key of the peer. If provided, it attempts
|
|
114
|
+
* to retrieve an existing session associated with this identity.
|
|
115
|
+
* @param {number} [maxWaitTime] - The maximum time in milliseconds to wait for the handshake
|
|
116
|
+
* to complete if a new session is required. Defaults to a pre-defined timeout if not specified.
|
|
117
|
+
* @returns {Promise<PeerSession>} - A promise that resolves with an authenticated `PeerSession`.
|
|
118
|
+
* @throws {Error} - Throws an error if the transport is not connected or if the handshake fails.
|
|
119
|
+
*/
|
|
120
|
+
async getAuthenticatedSession(identityKey, maxWaitTime) {
|
|
121
|
+
if (!this.transport) {
|
|
122
|
+
throw new Error('Peer transport is not connected!');
|
|
123
|
+
}
|
|
124
|
+
let peerSession = identityKey ? this.sessionManager.getSession(identityKey) : undefined;
|
|
125
|
+
if (!peerSession || !peerSession.isAuthenticated) {
|
|
126
|
+
const sessionNonce = await this.initiateHandshake(identityKey, maxWaitTime);
|
|
127
|
+
peerSession = this.sessionManager.getSession(identityKey || sessionNonce);
|
|
128
|
+
if (!peerSession.isAuthenticated) {
|
|
129
|
+
throw new Error('Unable to establish mutual authentication with peer!');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return peerSession;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Registers a callback to listen for general messages from peers.
|
|
136
|
+
*
|
|
137
|
+
* @param {(senderPublicKey: string, payload: number[]) => void} callback - The function to call when a general message is received.
|
|
138
|
+
* @returns {number} The ID of the callback listener.
|
|
139
|
+
*/
|
|
140
|
+
listenForGeneralMessages(callback) {
|
|
141
|
+
const callbackID = this.callbackIdCounter++;
|
|
142
|
+
this.onGeneralMessageReceivedCallbacks.set(callbackID, callback);
|
|
143
|
+
return callbackID;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Removes a general message listener.
|
|
147
|
+
*
|
|
148
|
+
* @param {number} callbackID - The ID of the callback to remove.
|
|
149
|
+
*/
|
|
150
|
+
stopListeningForGeneralMessages(callbackID) {
|
|
151
|
+
this.onGeneralMessageReceivedCallbacks.delete(callbackID);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Registers a callback to listen for certificates received from peers.
|
|
155
|
+
*
|
|
156
|
+
* @param {(certs: VerifiableCertificate[]) => void} callback - The function to call when certificates are received.
|
|
157
|
+
* @returns {number} The ID of the callback listener.
|
|
158
|
+
*/
|
|
159
|
+
listenForCertificatesReceived(callback) {
|
|
160
|
+
const callbackID = this.callbackIdCounter++;
|
|
161
|
+
this.onCertificatesReceivedCallbacks.set(callbackID, callback);
|
|
162
|
+
return callbackID;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Cancels and unsubscribes a certificatesReceived listener.
|
|
166
|
+
*
|
|
167
|
+
* @param {number} callbackID - The ID of the certificates received callback to cancel.
|
|
168
|
+
*/
|
|
169
|
+
stopListeningForCertificatesReceived(callbackID) {
|
|
170
|
+
this.onCertificatesReceivedCallbacks.delete(callbackID);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Registers a callback to listen for certificates requested from peers.
|
|
174
|
+
*
|
|
175
|
+
* @param {(requestedCertificates: RequestedCertificateSet) => void} callback - The function to call when a certificate request is received
|
|
176
|
+
* @returns {number} The ID of the callback listener.
|
|
177
|
+
*/
|
|
178
|
+
listenForCertificatesRequested(callback) {
|
|
179
|
+
const callbackID = this.callbackIdCounter++;
|
|
180
|
+
this.onCertificateRequestReceivedCallbacks.set(callbackID, callback);
|
|
181
|
+
return callbackID;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Cancels and unsubscribes a certificatesRequested listener.
|
|
185
|
+
*
|
|
186
|
+
* @param {number} callbackID - The ID of the requested certificates callback to cancel.
|
|
187
|
+
*/
|
|
188
|
+
stopListeningForCertificatesRequested(callbackID) {
|
|
189
|
+
this.onCertificateRequestReceivedCallbacks.delete(callbackID);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Initiates the mutual authentication handshake with a peer.
|
|
193
|
+
*
|
|
194
|
+
* @private
|
|
195
|
+
* @param {string} [identityKey] - The identity public key of the peer.
|
|
196
|
+
* @returns {Promise<string>} A promise that resolves to the session nonce.
|
|
197
|
+
*/
|
|
198
|
+
async initiateHandshake(identityKey, maxWaitTime = 10000) {
|
|
199
|
+
const sessionNonce = await (0, index_js_1.createNonce)(this.wallet); // Initial request nonce
|
|
200
|
+
this.sessionManager.addSession({
|
|
201
|
+
isAuthenticated: false,
|
|
202
|
+
sessionNonce,
|
|
203
|
+
peerIdentityKey: identityKey
|
|
204
|
+
});
|
|
205
|
+
const initialRequest = {
|
|
206
|
+
version: AUTH_VERSION,
|
|
207
|
+
messageType: 'initialRequest',
|
|
208
|
+
identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
|
|
209
|
+
initialNonce: sessionNonce,
|
|
210
|
+
requestedCertificates: this.certificatesToRequest
|
|
211
|
+
};
|
|
212
|
+
await this.transport.send(initialRequest);
|
|
213
|
+
return await this.waitForInitialResponse(sessionNonce, maxWaitTime);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Waits for the initial response from the peer after sending an initial handshake request message.
|
|
217
|
+
*
|
|
218
|
+
* @param {string} sessionNonce - The session nonce created in the initial request.
|
|
219
|
+
* @returns {Promise<string>} A promise that resolves with the session nonce when the initial response is received.
|
|
220
|
+
*/
|
|
221
|
+
async waitForInitialResponse(sessionNonce, maxWaitTime = 10000) {
|
|
222
|
+
return await new Promise((resolve, reject) => {
|
|
223
|
+
const callbackID = this.listenForInitialResponse(sessionNonce, (sessionNonce) => {
|
|
224
|
+
clearTimeout(timeoutHandle);
|
|
225
|
+
this.stopListeningForInitialResponses(callbackID);
|
|
226
|
+
resolve(sessionNonce);
|
|
227
|
+
});
|
|
228
|
+
const timeoutHandle = setTimeout(() => {
|
|
229
|
+
this.stopListeningForInitialResponses(callbackID);
|
|
230
|
+
reject(new Error('Initial response timed out.'));
|
|
231
|
+
}, maxWaitTime);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Adds a listener for an initial response message matching a specific initial nonce.
|
|
236
|
+
*
|
|
237
|
+
* @private
|
|
238
|
+
* @param {string} sessionNonce - The session nonce to match.
|
|
239
|
+
* @param {(sessionNonce: string) => void} callback - The callback to invoke when the initial response is received.
|
|
240
|
+
* @returns {number} The ID of the callback listener.
|
|
241
|
+
*/
|
|
242
|
+
listenForInitialResponse(sessionNonce, callback) {
|
|
243
|
+
const callbackID = this.callbackIdCounter++;
|
|
244
|
+
this.onInitialResponseReceivedCallbacks.set(callbackID, { callback, sessionNonce });
|
|
245
|
+
return callbackID;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Removes a listener for initial responses.
|
|
249
|
+
*
|
|
250
|
+
* @private
|
|
251
|
+
* @param {number} callbackID - The ID of the callback to remove.
|
|
252
|
+
*/
|
|
253
|
+
stopListeningForInitialResponses(callbackID) {
|
|
254
|
+
this.onInitialResponseReceivedCallbacks.delete(callbackID);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Handles incoming messages from the transport.
|
|
258
|
+
*
|
|
259
|
+
* @param {AuthMessage} message - The incoming message to process.
|
|
260
|
+
* @returns {Promise<void>}
|
|
261
|
+
*/
|
|
262
|
+
async handleIncomingMessage(message) {
|
|
263
|
+
if (!message.version || message.version !== AUTH_VERSION) {
|
|
264
|
+
console.error(`Invalid message auth version! Received: ${message.version}, expected: ${AUTH_VERSION}`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
switch (message.messageType) {
|
|
268
|
+
case 'initialRequest':
|
|
269
|
+
await this.processInitialRequest(message);
|
|
270
|
+
break;
|
|
271
|
+
case 'initialResponse':
|
|
272
|
+
await this.processInitialResponse(message);
|
|
273
|
+
break;
|
|
274
|
+
case 'certificateRequest':
|
|
275
|
+
await this.processCertificateRequest(message);
|
|
276
|
+
break;
|
|
277
|
+
case 'certificateResponse':
|
|
278
|
+
await this.processCertificateResponse(message);
|
|
279
|
+
break;
|
|
280
|
+
case 'general':
|
|
281
|
+
await this.processGeneralMessage(message);
|
|
282
|
+
break;
|
|
283
|
+
default:
|
|
284
|
+
console.error(`Unknown message type of ${message.messageType} from ${message.identityKey}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Processes an initial request message from a peer.
|
|
289
|
+
*
|
|
290
|
+
* @param {AuthMessage} message - The incoming initial request message.
|
|
291
|
+
* @returns {Promise<void>}
|
|
292
|
+
*/
|
|
293
|
+
async processInitialRequest(message) {
|
|
294
|
+
var _a, _b;
|
|
295
|
+
if (!message.identityKey || !message.initialNonce) {
|
|
296
|
+
throw new Error('Missing required fields in initialResponse message.');
|
|
297
|
+
}
|
|
298
|
+
// Create an initial session nonce
|
|
299
|
+
const sessionNonce = await (0, index_js_1.createNonce)(this.wallet);
|
|
300
|
+
this.sessionManager.addSession({
|
|
301
|
+
isAuthenticated: true,
|
|
302
|
+
sessionNonce,
|
|
303
|
+
peerNonce: message.initialNonce,
|
|
304
|
+
peerIdentityKey: message.identityKey
|
|
305
|
+
});
|
|
306
|
+
// Handle initial certificate requests
|
|
307
|
+
let certificatesToInclude;
|
|
308
|
+
if (((_b = (_a = message.requestedCertificates) === null || _a === void 0 ? void 0 : _a.certifiers) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
309
|
+
if (this.onCertificateRequestReceivedCallbacks.size > 0) {
|
|
310
|
+
// The application wants to handle certificate requests
|
|
311
|
+
this.onCertificateRequestReceivedCallbacks.forEach(callback => {
|
|
312
|
+
callback(message.identityKey, message.requestedCertificates);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
// Attempt to find exact matching certificates to return automatically to save round trips
|
|
317
|
+
certificatesToInclude = await (0, index_js_1.getVerifiableCertificates)(this.wallet, message.requestedCertificates, message.identityKey);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Create the signature for the message
|
|
321
|
+
const { signature } = await this.wallet.createSignature({
|
|
322
|
+
data: mod_js_1.Utils.toArray(message.initialNonce + sessionNonce, 'base64'),
|
|
323
|
+
protocolID: [2, 'auth message signature'],
|
|
324
|
+
keyID: `${message.initialNonce} ${sessionNonce}`,
|
|
325
|
+
counterparty: message.identityKey
|
|
326
|
+
});
|
|
327
|
+
const initialResponseMessage = {
|
|
328
|
+
version: AUTH_VERSION,
|
|
329
|
+
messageType: 'initialResponse',
|
|
330
|
+
identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
|
|
331
|
+
initialNonce: sessionNonce,
|
|
332
|
+
yourNonce: message.initialNonce,
|
|
333
|
+
certificates: certificatesToInclude,
|
|
334
|
+
requestedCertificates: this.certificatesToRequest,
|
|
335
|
+
signature
|
|
336
|
+
};
|
|
337
|
+
await this.transport.send(initialResponseMessage);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Processes an initial response message from a peer.
|
|
341
|
+
*
|
|
342
|
+
* @private
|
|
343
|
+
* @param {AuthMessage} message - The incoming initial response message.
|
|
344
|
+
* @returns {Promise<void>}
|
|
345
|
+
* @throws Will throw an error if nonce verification or signature verification fails.
|
|
346
|
+
*/
|
|
347
|
+
async processInitialResponse(message) {
|
|
348
|
+
var _a, _b, _c, _d, _e;
|
|
349
|
+
const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
|
|
350
|
+
if (!validNonce) {
|
|
351
|
+
throw new Error(`Initial response nonce verification failed from peer: ${message.identityKey}`);
|
|
352
|
+
}
|
|
353
|
+
const peerSession = this.sessionManager.getSession(message.yourNonce);
|
|
354
|
+
if (!peerSession) {
|
|
355
|
+
throw new Error(`Peer session not found for peer: ${message.identityKey}`);
|
|
356
|
+
}
|
|
357
|
+
// Validate message signature
|
|
358
|
+
const { valid } = await this.wallet.verifySignature({
|
|
359
|
+
data: mod_js_1.Utils.toArray(peerSession.sessionNonce + message.initialNonce, 'base64'),
|
|
360
|
+
signature: message.signature,
|
|
361
|
+
protocolID: [2, 'auth message signature'],
|
|
362
|
+
keyID: `${peerSession.sessionNonce} ${message.initialNonce}`,
|
|
363
|
+
counterparty: message.identityKey
|
|
364
|
+
});
|
|
365
|
+
if (!valid) {
|
|
366
|
+
throw new Error(`Unable to verify initial response signature for peer: ${message.identityKey}`);
|
|
367
|
+
}
|
|
368
|
+
// After signature and nonce verification is complete, the peer is considered authenticated
|
|
369
|
+
// Save the peer's identity key and initial nonce
|
|
370
|
+
// This allows future requests to be linked to the same session
|
|
371
|
+
peerSession.peerNonce = message.initialNonce;
|
|
372
|
+
peerSession.peerIdentityKey = message.identityKey;
|
|
373
|
+
peerSession.isAuthenticated = true;
|
|
374
|
+
// Run update to ensure lookup is available by both peerIdentityKey and sessionNonce
|
|
375
|
+
this.sessionManager.updateSession(peerSession);
|
|
376
|
+
// Process certificates received
|
|
377
|
+
if (((_b = (_a = this.certificatesToRequest) === null || _a === void 0 ? void 0 : _a.certifiers) === null || _b === void 0 ? void 0 : _b.length) && ((_c = message.certificates) === null || _c === void 0 ? void 0 : _c.length)) {
|
|
378
|
+
await (0, index_js_1.validateCertificates)(this.wallet, message, this.certificatesToRequest);
|
|
379
|
+
this.onCertificatesReceivedCallbacks.forEach(callback => callback(message.identityKey, message.certificates));
|
|
380
|
+
}
|
|
381
|
+
this.onInitialResponseReceivedCallbacks.forEach((entry) => {
|
|
382
|
+
if (entry && entry.sessionNonce === peerSession.sessionNonce) {
|
|
383
|
+
entry.callback(peerSession.sessionNonce);
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
// Check if the peer requested certificates from us
|
|
387
|
+
if (((_e = (_d = message.requestedCertificates) === null || _d === void 0 ? void 0 : _d.certifiers) === null || _e === void 0 ? void 0 : _e.length) > 0) {
|
|
388
|
+
if (this.onCertificateRequestReceivedCallbacks.size > 0) {
|
|
389
|
+
// Application wants to handle certificate requests
|
|
390
|
+
this.onCertificateRequestReceivedCallbacks.forEach(callback => {
|
|
391
|
+
callback(message.identityKey, message.requestedCertificates);
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
// Attempt to find exact matching certificates to respond automatically and save round trips
|
|
396
|
+
const verifiableCertificates = await (0, index_js_1.getVerifiableCertificates)(this.wallet, message.requestedCertificates, message.identityKey);
|
|
397
|
+
await this.sendCertificateResponse(message.identityKey, verifiableCertificates);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Processes an incoming certificate request message from a peer.
|
|
403
|
+
* Verifies the nonce and signature to ensure the authenticity of the request,
|
|
404
|
+
* then initiates a response with any requested certificates that are available.
|
|
405
|
+
*
|
|
406
|
+
* @param {AuthMessage} message - The certificate request message received from the peer.
|
|
407
|
+
* @throws {Error} Throws an error if nonce verification fails, or the message signature is invalid.
|
|
408
|
+
*/
|
|
409
|
+
async processCertificateRequest(message) {
|
|
410
|
+
var _a, _b;
|
|
411
|
+
const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
|
|
412
|
+
if (!validNonce) {
|
|
413
|
+
throw new Error(`Unable to verify nonce for certificate request message from: ${message.identityKey}`);
|
|
414
|
+
}
|
|
415
|
+
const peerSession = this.sessionManager.getSession(message.yourNonce);
|
|
416
|
+
const { valid } = await this.wallet.verifySignature({
|
|
417
|
+
data: mod_js_1.Utils.toArray(JSON.stringify(message.requestedCertificates), 'utf8'),
|
|
418
|
+
signature: message.signature,
|
|
419
|
+
protocolID: [2, 'auth message signature'],
|
|
420
|
+
keyID: `${message.nonce} ${peerSession.sessionNonce}`,
|
|
421
|
+
counterparty: peerSession.peerIdentityKey
|
|
422
|
+
});
|
|
423
|
+
if (!valid) {
|
|
424
|
+
throw new Error(`Invalid signature in certificate request message from ${peerSession.peerIdentityKey}`);
|
|
425
|
+
}
|
|
426
|
+
if (((_b = (_a = message.requestedCertificates) === null || _a === void 0 ? void 0 : _a.certifiers) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
427
|
+
if (this.onCertificateRequestReceivedCallbacks.size > 0) {
|
|
428
|
+
// Application wants to handle certificate requests
|
|
429
|
+
this.onCertificateRequestReceivedCallbacks.forEach(callback => {
|
|
430
|
+
callback(message.identityKey, message.requestedCertificates);
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
// Attempt to find exact matching certificates to respond automatically and save round trips
|
|
435
|
+
const verifiableCertificates = await (0, index_js_1.getVerifiableCertificates)(this.wallet, message.requestedCertificates, message.identityKey);
|
|
436
|
+
await this.sendCertificateResponse(message.identityKey, verifiableCertificates);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Sends a certificate response message containing the specified certificates to a peer.
|
|
442
|
+
*
|
|
443
|
+
* @param {string} verifierIdentityKey - The identity key of the peer requesting the certificates.
|
|
444
|
+
* @param {VerifiableCertificate[]} certificates - The list of certificates to be included in the response.
|
|
445
|
+
* @returns {Promise<void>} - A promise that resolves once the certificate response has been sent successfully.
|
|
446
|
+
*
|
|
447
|
+
* @throws {Error} Throws an error if the peer session could not be authenticated or if message signing fails.
|
|
448
|
+
*/
|
|
449
|
+
async sendCertificateResponse(verifierIdentityKey, certificates) {
|
|
450
|
+
const peerSession = await this.getAuthenticatedSession(verifierIdentityKey);
|
|
451
|
+
const requestNonce = mod_js_1.Utils.toBase64((0, mod_js_1.Random)(32));
|
|
452
|
+
const { signature } = await this.wallet.createSignature({
|
|
453
|
+
data: mod_js_1.Utils.toArray(JSON.stringify(certificates), 'utf8'),
|
|
454
|
+
protocolID: [2, 'auth message signature'],
|
|
455
|
+
keyID: `${requestNonce} ${peerSession.peerNonce}`,
|
|
456
|
+
counterparty: peerSession.peerIdentityKey
|
|
457
|
+
});
|
|
458
|
+
const certificateResponse = {
|
|
459
|
+
version: AUTH_VERSION,
|
|
460
|
+
messageType: 'certificateResponse',
|
|
461
|
+
identityKey: (await this.wallet.getPublicKey({ identityKey: true })).publicKey,
|
|
462
|
+
nonce: requestNonce,
|
|
463
|
+
initialNonce: peerSession.sessionNonce,
|
|
464
|
+
yourNonce: peerSession.peerNonce,
|
|
465
|
+
certificates,
|
|
466
|
+
signature
|
|
467
|
+
};
|
|
468
|
+
try {
|
|
469
|
+
await this.transport.send(certificateResponse);
|
|
470
|
+
}
|
|
471
|
+
catch (error) {
|
|
472
|
+
throw new Error(`Failed to send certificate response message to peer ${peerSession.peerIdentityKey}: ${error.message}`);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Processes a certificate response message from a peer.
|
|
477
|
+
*
|
|
478
|
+
* @private
|
|
479
|
+
* @param {AuthMessage} message - The incoming certificate response message.
|
|
480
|
+
* @returns {Promise<void>}
|
|
481
|
+
* @throws Will throw an error if nonce verification or signature verification fails.
|
|
482
|
+
*/
|
|
483
|
+
async processCertificateResponse(message) {
|
|
484
|
+
const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
|
|
485
|
+
if (!validNonce) {
|
|
486
|
+
throw new Error(`Unable to verify nonce for certificate response from: ${message.identityKey}!`);
|
|
487
|
+
}
|
|
488
|
+
const peerSession = this.sessionManager.getSession(message.yourNonce);
|
|
489
|
+
// Validate message signature
|
|
490
|
+
const { valid } = await this.wallet.verifySignature({
|
|
491
|
+
data: mod_js_1.Utils.toArray(JSON.stringify(message.certificates), 'utf8'),
|
|
492
|
+
signature: message.signature,
|
|
493
|
+
protocolID: [2, 'auth message signature'],
|
|
494
|
+
keyID: `${message.nonce} ${peerSession.sessionNonce}`,
|
|
495
|
+
counterparty: message.identityKey
|
|
496
|
+
});
|
|
497
|
+
if (!valid) {
|
|
498
|
+
throw new Error(`Unable to verify certificate response signature for peer: ${message.identityKey}`);
|
|
499
|
+
}
|
|
500
|
+
// Process and verify any certificates received
|
|
501
|
+
await (0, index_js_1.validateCertificates)(this.wallet, message, message.requestedCertificates);
|
|
502
|
+
this.onCertificatesReceivedCallbacks.forEach(callback => {
|
|
503
|
+
callback(message.identityKey, message.certificates);
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Processes a general message from a peer.
|
|
508
|
+
*
|
|
509
|
+
* @private
|
|
510
|
+
* @param {AuthMessage} message - The incoming general message.
|
|
511
|
+
* @returns {Promise<void>}
|
|
512
|
+
* @throws Will throw an error if nonce verification or signature verification fails.
|
|
513
|
+
*/
|
|
514
|
+
async processGeneralMessage(message) {
|
|
515
|
+
const validNonce = await (0, index_js_1.verifyNonce)(message.yourNonce, this.wallet);
|
|
516
|
+
if (!validNonce) {
|
|
517
|
+
throw new Error(`Unable to verify nonce for general message from: ${message.identityKey}`);
|
|
518
|
+
}
|
|
519
|
+
const peerSession = this.sessionManager.getSession(message.yourNonce);
|
|
520
|
+
const { valid } = await this.wallet.verifySignature({
|
|
521
|
+
data: message.payload,
|
|
522
|
+
signature: message.signature,
|
|
523
|
+
protocolID: [2, 'auth message signature'],
|
|
524
|
+
keyID: `${message.nonce} ${peerSession.sessionNonce}`,
|
|
525
|
+
counterparty: peerSession.peerIdentityKey
|
|
526
|
+
});
|
|
527
|
+
if (!valid) {
|
|
528
|
+
throw new Error(`Invalid signature in generalMessage from ${peerSession.peerIdentityKey}`);
|
|
529
|
+
}
|
|
530
|
+
this.onGeneralMessageReceivedCallbacks.forEach(callback => {
|
|
531
|
+
callback(message.identityKey, message.payload);
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
exports.Peer = Peer;
|
|
536
|
+
//# sourceMappingURL=Peer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Peer.js","sourceRoot":"","sources":["../../../../src/auth/Peer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionManager = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Manages sessions for peers, allowing sessions to be added, retrieved, updated, and removed
|
|
6
|
+
* by relevant identifiers (sessionNonce and peerIdentityKey).
|
|
7
|
+
*/
|
|
8
|
+
class SessionManager {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.identifierToSession = new Map();
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Adds a session to the manager, associating it with relevant identifiers for retrieval.
|
|
14
|
+
*
|
|
15
|
+
* @param {PeerSession} session - The peer session to add.
|
|
16
|
+
*/
|
|
17
|
+
addSession(session) {
|
|
18
|
+
if (!session.sessionNonce && !session.peerIdentityKey) {
|
|
19
|
+
throw new Error('Invalid session: at least one of sessionNonce or peerIdentityKey is required.');
|
|
20
|
+
}
|
|
21
|
+
if (session.sessionNonce) {
|
|
22
|
+
this.identifierToSession.set(session.sessionNonce, session);
|
|
23
|
+
}
|
|
24
|
+
if (session.peerIdentityKey) {
|
|
25
|
+
this.identifierToSession.set(session.peerIdentityKey, session);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Updates a session in the manager, ensuring that all identifiers are correctly associated.
|
|
30
|
+
*
|
|
31
|
+
* @param {PeerSession} session - The peer session to update.
|
|
32
|
+
*/
|
|
33
|
+
updateSession(session) {
|
|
34
|
+
this.removeSession(session);
|
|
35
|
+
this.addSession(session);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Retrieves a session based on a given identifier.
|
|
39
|
+
*
|
|
40
|
+
* @param {string} identifier - The identifier for the session (sessionNonce or peerIdentityKey).
|
|
41
|
+
* @returns {PeerSession | undefined} - The matching peer session, or undefined if not found.
|
|
42
|
+
*/
|
|
43
|
+
getSession(identifier) {
|
|
44
|
+
return this.identifierToSession.get(identifier);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Removes a session from the manager by clearing all associated identifiers.
|
|
48
|
+
*
|
|
49
|
+
* @param {PeerSession} session - The peer session to remove.
|
|
50
|
+
*/
|
|
51
|
+
removeSession(session) {
|
|
52
|
+
this.identifierToSession.delete(session.sessionNonce);
|
|
53
|
+
this.identifierToSession.delete(session.peerIdentityKey);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Checks if a session exists based on a given identifier.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} identifier - The identifier to check.
|
|
59
|
+
* @returns {boolean} - True if the session exists, false otherwise.
|
|
60
|
+
*/
|
|
61
|
+
hasSession(identifier) {
|
|
62
|
+
return this.identifierToSession.has(identifier);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.SessionManager = SessionManager;
|
|
66
|
+
//# sourceMappingURL=SessionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../../src/auth/SessionManager.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACH,MAAa,cAAc;IAGzB;QACE,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC3D,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAE,OAAoB;QAC9B,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAA;QAClG,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED;;;;MAIE;IACF,aAAa,CAAE,OAAoB;QACjC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAE,UAAkB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAE,OAAoB;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;QACrD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAE,UAAkB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACjD,CAAC;CACF;AAhED,wCAgEC"}
|