shogun-core 1.2.7 → 1.2.8
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/README.md +0 -1
- package/dist/browser/shogun-core.js +1 -1
- package/dist/browser/shogun-core.js.LICENSE.txt +2 -0
- package/dist/browser/shogun-core.light.js +1 -1
- package/dist/browser/shogun-core.vendors.light.js +1 -1
- package/dist/core.js +31 -71
- package/dist/gundb/{instance.js → gunInstance.js} +135 -115
- package/dist/gundb/index.js +3 -20
- package/dist/plugins/index.js +23 -1
- package/dist/plugins/nostr/index.js +1 -0
- package/dist/plugins/nostr/nostrChain.js +128 -0
- package/dist/plugins/nostr/nostrConnector.js +42 -7
- package/dist/plugins/nostr/nostrConnectorPlugin.js +157 -1
- package/dist/plugins/nostr/nostrSigner.js +343 -0
- package/dist/plugins/oauth/index.js +13 -0
- package/dist/plugins/oauth/oauthChain.js +161 -0
- package/dist/plugins/oauth/oauthConnector.js +542 -0
- package/dist/plugins/oauth/oauthPlugin.js +302 -0
- package/dist/plugins/oauth/types.js +2 -0
- package/dist/plugins/web3/index.js +1 -0
- package/dist/plugins/web3/web3Chain.js +77 -2
- package/dist/plugins/web3/web3Connector.js +159 -37
- package/dist/plugins/web3/web3ConnectorPlugin.js +157 -1
- package/dist/plugins/web3/web3Signer.js +268 -0
- package/dist/plugins/webauthn/webauthnChain.js +78 -0
- package/dist/plugins/webauthn/webauthnPlugin.js +154 -1
- package/dist/plugins/webauthn/webauthnSigner.js +318 -0
- package/dist/storage/storage.js +0 -8
- package/dist/types/core.d.ts +10 -34
- package/dist/types/gundb/gun-es/gun-es.d.ts +1 -0
- package/dist/types/gundb/{instance.d.ts → gunInstance.d.ts} +2 -2
- package/dist/types/gundb/index.d.ts +1 -4
- package/dist/types/plugins/index.d.ts +4 -0
- package/dist/types/plugins/nostr/index.d.ts +1 -0
- package/dist/types/plugins/nostr/nostrConnector.d.ts +3 -2
- package/dist/types/plugins/nostr/nostrConnectorPlugin.d.ts +82 -0
- package/dist/types/plugins/nostr/nostrSigner.d.ts +104 -0
- package/dist/types/plugins/oauth/index.d.ts +4 -0
- package/dist/types/plugins/oauth/oauthChain.d.ts +2 -0
- package/dist/types/plugins/oauth/oauthConnector.d.ts +100 -0
- package/dist/types/plugins/oauth/oauthPlugin.d.ts +89 -0
- package/dist/types/plugins/oauth/types.d.ts +106 -0
- package/dist/types/plugins/web3/index.d.ts +1 -0
- package/dist/types/plugins/web3/types.d.ts +1 -0
- package/dist/types/plugins/web3/web3Connector.d.ts +8 -2
- package/dist/types/plugins/web3/web3ConnectorPlugin.d.ts +82 -0
- package/dist/types/plugins/web3/web3Signer.d.ts +93 -0
- package/dist/types/plugins/webauthn/webauthnPlugin.d.ts +81 -0
- package/dist/types/plugins/webauthn/webauthnSigner.d.ts +90 -0
- package/dist/types/shogun.js +1 -28
- package/dist/types/types/events.d.ts +2 -2
- package/dist/types/types/shogun.d.ts +13 -49
- package/package.json +2 -1
- package/dist/browser.js +0 -107
- package/dist/contracts/base.js +0 -152
- package/dist/contracts/entryPoint.js +0 -407
- package/dist/contracts/index.js +0 -47
- package/dist/contracts/registry.js +0 -259
- package/dist/contracts/relay.js +0 -494
- package/dist/contracts/utils.js +0 -582
- package/dist/types/browser.d.ts +0 -27
- package/dist/types/contracts/base.d.ts +0 -82
- package/dist/types/contracts/entryPoint.d.ts +0 -138
- package/dist/types/contracts/index.d.ts +0 -17
- package/dist/types/contracts/registry.d.ts +0 -97
- package/dist/types/contracts/relay.d.ts +0 -165
- package/dist/types/contracts/utils.d.ts +0 -173
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NostrSigner = void 0;
|
|
7
|
+
const nostrConnector_1 = require("./nostrConnector");
|
|
8
|
+
const logger_1 = require("../../utils/logger");
|
|
9
|
+
const derive_1 = __importDefault(require("../../gundb/derive"));
|
|
10
|
+
/**
|
|
11
|
+
* Nostr Signer - Provides oneshot signing functionality
|
|
12
|
+
* Similar to webauthn.js but for Nostr/Bitcoin wallets
|
|
13
|
+
* CONSISTENT with normal Nostr approach
|
|
14
|
+
*/
|
|
15
|
+
class NostrSigner {
|
|
16
|
+
nostrConnector;
|
|
17
|
+
credentials = new Map();
|
|
18
|
+
MESSAGE_TO_SIGN = "I Love Shogun!"; // Same as normal approach
|
|
19
|
+
constructor(nostrConnector) {
|
|
20
|
+
this.nostrConnector = nostrConnector || new nostrConnector_1.NostrConnector();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new Nostr signing credential
|
|
24
|
+
* CONSISTENT with normal Nostr approach
|
|
25
|
+
*/
|
|
26
|
+
async createSigningCredential(address) {
|
|
27
|
+
try {
|
|
28
|
+
(0, logger_1.logDebug)(`Creating Nostr signing credential for address: ${address}`);
|
|
29
|
+
// Validate address (same validation as normal approach)
|
|
30
|
+
const validAddress = this.validateAddress(address);
|
|
31
|
+
// Generate signature using the SAME approach as normal Nostr
|
|
32
|
+
const signature = await this.generateDeterministicSignature(validAddress);
|
|
33
|
+
// Generate credentials using the SAME logic as normal approach
|
|
34
|
+
const username = `${validAddress.toLowerCase()}`;
|
|
35
|
+
const password = await this.generatePassword(signature);
|
|
36
|
+
const signingCredential = {
|
|
37
|
+
address: validAddress,
|
|
38
|
+
signature,
|
|
39
|
+
message: this.MESSAGE_TO_SIGN,
|
|
40
|
+
username,
|
|
41
|
+
password, // This ensures consistency with normal approach
|
|
42
|
+
};
|
|
43
|
+
// Store credential for later use
|
|
44
|
+
this.credentials.set(validAddress.toLowerCase(), signingCredential);
|
|
45
|
+
(0, logger_1.logDebug)("Created Nostr signing credential:", signingCredential);
|
|
46
|
+
return signingCredential;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
(0, logger_1.logError)("Error creating Nostr signing credential:", error);
|
|
50
|
+
throw new Error(`Failed to create Nostr signing credential: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Validates address using the same logic as NostrConnector
|
|
55
|
+
*/
|
|
56
|
+
validateAddress(address) {
|
|
57
|
+
if (!address) {
|
|
58
|
+
throw new Error("Address not provided");
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
const normalizedAddress = String(address).trim();
|
|
62
|
+
// Basic validation for Bitcoin addresses and Nostr pubkeys (same as normal approach)
|
|
63
|
+
if (!/^(npub1|[0-9a-f]{64}|bc1|[13])[a-zA-HJ-NP-Z0-9]{25,59}$/.test(normalizedAddress)) {
|
|
64
|
+
// More lenient validation for Nostr addresses
|
|
65
|
+
if (normalizedAddress.length < 10) {
|
|
66
|
+
throw new Error("Invalid Nostr/Bitcoin address format");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return normalizedAddress;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new Error("Invalid Nostr/Bitcoin address provided");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Generate deterministic signature using the SAME approach as NostrConnector
|
|
77
|
+
*/
|
|
78
|
+
async generateDeterministicSignature(address) {
|
|
79
|
+
// Create a deterministic signature based on the address and a fixed message
|
|
80
|
+
// This ensures the same credentials are generated each time for the same address
|
|
81
|
+
// SAME LOGIC as NostrConnector.generateDeterministicSignature
|
|
82
|
+
const baseString = `${address}_${this.MESSAGE_TO_SIGN}_shogun_deterministic`;
|
|
83
|
+
// Simple hash function to create a deterministic signature
|
|
84
|
+
let hash = "";
|
|
85
|
+
let runningValue = 0;
|
|
86
|
+
for (let i = 0; i < baseString.length; i++) {
|
|
87
|
+
const charCode = baseString.charCodeAt(i);
|
|
88
|
+
runningValue = (runningValue * 31 + charCode) & 0xffffffff;
|
|
89
|
+
if (i % 4 === 3) {
|
|
90
|
+
hash += runningValue.toString(16).padStart(8, "0");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// Ensure we have exactly 128 characters (64 bytes in hex)
|
|
94
|
+
while (hash.length < 128) {
|
|
95
|
+
runningValue = (runningValue * 31 + hash.length) & 0xffffffff;
|
|
96
|
+
hash += runningValue.toString(16).padStart(8, "0");
|
|
97
|
+
}
|
|
98
|
+
// Ensure the result is exactly 128 characters and contains only valid hex characters
|
|
99
|
+
let deterministicSignature = hash.substring(0, 128);
|
|
100
|
+
// Double-check that it's a valid hex string
|
|
101
|
+
deterministicSignature = deterministicSignature
|
|
102
|
+
.toLowerCase()
|
|
103
|
+
.replace(/[^0-9a-f]/g, "0");
|
|
104
|
+
// Ensure it's exactly 128 characters
|
|
105
|
+
if (deterministicSignature.length < 128) {
|
|
106
|
+
deterministicSignature = deterministicSignature.padEnd(128, "0");
|
|
107
|
+
}
|
|
108
|
+
else if (deterministicSignature.length > 128) {
|
|
109
|
+
deterministicSignature = deterministicSignature.substring(0, 128);
|
|
110
|
+
}
|
|
111
|
+
(0, logger_1.logDebug)(`Generated deterministic signature: ${deterministicSignature.substring(0, 16)}... (${deterministicSignature.length} chars)`);
|
|
112
|
+
return deterministicSignature;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generate password using the SAME approach as NostrConnector
|
|
116
|
+
*/
|
|
117
|
+
async generatePassword(signature) {
|
|
118
|
+
if (!signature) {
|
|
119
|
+
throw new Error("Invalid signature");
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
// SAME LOGIC as NostrConnector.generatePassword
|
|
123
|
+
// Normalize the signature to ensure it's clean
|
|
124
|
+
const normalizedSig = signature.toLowerCase().replace(/[^a-f0-9]/g, "");
|
|
125
|
+
// Create a hash using a simple algorithm
|
|
126
|
+
let hash = "";
|
|
127
|
+
let runningValue = 0;
|
|
128
|
+
for (let i = 0; i < normalizedSig.length; i++) {
|
|
129
|
+
const charCode = normalizedSig.charCodeAt(i);
|
|
130
|
+
runningValue = (runningValue * 31 + charCode) & 0xffffffff;
|
|
131
|
+
if (i % 8 === 7) {
|
|
132
|
+
hash += runningValue.toString(16).padStart(8, "0");
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Ensure we have at least 64 characters
|
|
136
|
+
while (hash.length < 64) {
|
|
137
|
+
runningValue = (runningValue * 31 + hash.length) & 0xffffffff;
|
|
138
|
+
hash += runningValue.toString(16).padStart(8, "0");
|
|
139
|
+
}
|
|
140
|
+
// Trim to 64 characters (matching the normal approach)
|
|
141
|
+
return hash.substring(0, 64);
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
(0, logger_1.logError)("Error generating password:", error);
|
|
145
|
+
throw new Error("Failed to generate password from signature");
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Creates an authenticator function compatible with SEA.sign
|
|
150
|
+
* This is the key function that makes it work like webauthn.js but for Nostr
|
|
151
|
+
*/
|
|
152
|
+
createAuthenticator(address) {
|
|
153
|
+
const credential = this.credentials.get(address.toLowerCase());
|
|
154
|
+
if (!credential) {
|
|
155
|
+
throw new Error(`Credential for address ${address} not found`);
|
|
156
|
+
}
|
|
157
|
+
return async (data) => {
|
|
158
|
+
try {
|
|
159
|
+
// Verify the user by requesting a new signature for the data
|
|
160
|
+
// In a real implementation, this would use the Nostr extension
|
|
161
|
+
const dataToSign = JSON.stringify(data);
|
|
162
|
+
// For now, create a deterministic signature based on the data and credential
|
|
163
|
+
const signature = await this.signData(dataToSign, credential);
|
|
164
|
+
(0, logger_1.logDebug)("Nostr authentication successful:", { data, signature });
|
|
165
|
+
return signature;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
(0, logger_1.logError)("Nostr authentication error:", error);
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Sign data using the credential
|
|
175
|
+
*/
|
|
176
|
+
async signData(data, credential) {
|
|
177
|
+
// Create a deterministic signature for the data
|
|
178
|
+
const signatureBase = `${credential.signature}_${data}_${Date.now()}`;
|
|
179
|
+
return this.generateDeterministicSignature(signatureBase);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Creates a derived key pair from Nostr credential
|
|
183
|
+
* CONSISTENT with normal approach: uses password as seed
|
|
184
|
+
*/
|
|
185
|
+
async createDerivedKeyPair(address, extra) {
|
|
186
|
+
const credential = this.credentials.get(address.toLowerCase());
|
|
187
|
+
if (!credential) {
|
|
188
|
+
throw new Error(`Credential for address ${address} not found`);
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
// CONSISTENCY: Use the same approach as normal Nostr
|
|
192
|
+
// Use password as seed (same as normal approach)
|
|
193
|
+
const derivedKeys = await (0, derive_1.default)(credential.password, // This is the key consistency point!
|
|
194
|
+
extra, { includeP256: true });
|
|
195
|
+
return {
|
|
196
|
+
pub: derivedKeys.pub,
|
|
197
|
+
priv: derivedKeys.priv,
|
|
198
|
+
epub: derivedKeys.epub,
|
|
199
|
+
epriv: derivedKeys.epriv,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
(0, logger_1.logError)("Error deriving keys from Nostr credential:", error);
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Creates a Gun user from Nostr credential
|
|
209
|
+
* This ensures the SAME user is created as with normal approach
|
|
210
|
+
*/
|
|
211
|
+
async createGunUser(address, gunInstance) {
|
|
212
|
+
const credential = this.credentials.get(address.toLowerCase());
|
|
213
|
+
if (!credential) {
|
|
214
|
+
throw new Error(`Credential for address ${address} not found`);
|
|
215
|
+
}
|
|
216
|
+
try {
|
|
217
|
+
// Use the SAME approach as normal Nostr
|
|
218
|
+
return new Promise((resolve) => {
|
|
219
|
+
gunInstance
|
|
220
|
+
.user()
|
|
221
|
+
.create(credential.username, credential.password, (ack) => {
|
|
222
|
+
if (ack.err) {
|
|
223
|
+
// Try to login if user already exists
|
|
224
|
+
gunInstance
|
|
225
|
+
.user()
|
|
226
|
+
.auth(credential.username, credential.password, (authAck) => {
|
|
227
|
+
if (authAck.err) {
|
|
228
|
+
resolve({ success: false, error: authAck.err });
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
const userPub = authAck.pub;
|
|
232
|
+
// Update credential with Gun user pub
|
|
233
|
+
credential.gunUserPub = userPub;
|
|
234
|
+
this.credentials.set(address.toLowerCase(), credential);
|
|
235
|
+
resolve({ success: true, userPub });
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// User created, now login
|
|
241
|
+
gunInstance
|
|
242
|
+
.user()
|
|
243
|
+
.auth(credential.username, credential.password, (authAck) => {
|
|
244
|
+
if (authAck.err) {
|
|
245
|
+
resolve({ success: false, error: authAck.err });
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
const userPub = authAck.pub;
|
|
249
|
+
// Update credential with Gun user pub
|
|
250
|
+
credential.gunUserPub = userPub;
|
|
251
|
+
this.credentials.set(address.toLowerCase(), credential);
|
|
252
|
+
resolve({ success: true, userPub });
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
(0, logger_1.logError)("Error creating Gun user:", error);
|
|
261
|
+
return { success: false, error: error.message };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Signs data using Nostr + derived keys
|
|
266
|
+
* This provides a hybrid approach: Nostr for user verification + derived keys for actual signing
|
|
267
|
+
* CONSISTENT with normal approach
|
|
268
|
+
*/
|
|
269
|
+
async signWithDerivedKeys(data, address, extra) {
|
|
270
|
+
try {
|
|
271
|
+
// First, verify user with Nostr
|
|
272
|
+
const authenticator = this.createAuthenticator(address);
|
|
273
|
+
await authenticator(data); // This verifies the user
|
|
274
|
+
// Then use derived keys for actual signing (CONSISTENT approach)
|
|
275
|
+
const keyPair = await this.createDerivedKeyPair(address, extra);
|
|
276
|
+
// Create signature using the same approach as SEA
|
|
277
|
+
const message = JSON.stringify(data);
|
|
278
|
+
// Use a simple signing approach (in production, would use proper crypto)
|
|
279
|
+
const signature = await this.generateDeterministicSignature(`${keyPair.priv}_${message}`);
|
|
280
|
+
// Format like SEA signature
|
|
281
|
+
const seaSignature = {
|
|
282
|
+
m: message,
|
|
283
|
+
s: signature,
|
|
284
|
+
};
|
|
285
|
+
return "SEA" + JSON.stringify(seaSignature);
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
(0, logger_1.logError)("Error signing with derived keys:", error);
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Get the Gun user public key for a credential
|
|
294
|
+
* This allows checking if the same user would be created
|
|
295
|
+
*/
|
|
296
|
+
getGunUserPub(address) {
|
|
297
|
+
const credential = this.credentials.get(address.toLowerCase());
|
|
298
|
+
return credential?.gunUserPub;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get the password (for consistency checking)
|
|
302
|
+
*/
|
|
303
|
+
getPassword(address) {
|
|
304
|
+
const credential = this.credentials.get(address.toLowerCase());
|
|
305
|
+
return credential?.password;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Check if this credential would create the same Gun user as normal approach
|
|
309
|
+
*/
|
|
310
|
+
async verifyConsistency(address, expectedUserPub) {
|
|
311
|
+
const credential = this.credentials.get(address.toLowerCase());
|
|
312
|
+
if (!credential) {
|
|
313
|
+
return { consistent: false };
|
|
314
|
+
}
|
|
315
|
+
// The derived keys should be the same as normal approach
|
|
316
|
+
const derivedKeys = await this.createDerivedKeyPair(address);
|
|
317
|
+
return {
|
|
318
|
+
consistent: expectedUserPub ? derivedKeys.pub === expectedUserPub : true,
|
|
319
|
+
actualUserPub: derivedKeys.pub,
|
|
320
|
+
expectedUserPub,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Get credential by address
|
|
325
|
+
*/
|
|
326
|
+
getCredential(address) {
|
|
327
|
+
return this.credentials.get(address.toLowerCase());
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* List all stored credentials
|
|
331
|
+
*/
|
|
332
|
+
listCredentials() {
|
|
333
|
+
return Array.from(this.credentials.values());
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Remove a credential
|
|
337
|
+
*/
|
|
338
|
+
removeCredential(address) {
|
|
339
|
+
return this.credentials.delete(address.toLowerCase());
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
exports.NostrSigner = NostrSigner;
|
|
343
|
+
exports.default = NostrSigner;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.oauthChain = exports.OAuthPlugin = exports.OAuthConnector = void 0;
|
|
7
|
+
// OAuth plugin exports
|
|
8
|
+
var oauthConnector_1 = require("./oauthConnector");
|
|
9
|
+
Object.defineProperty(exports, "OAuthConnector", { enumerable: true, get: function () { return oauthConnector_1.OAuthConnector; } });
|
|
10
|
+
var oauthPlugin_1 = require("./oauthPlugin");
|
|
11
|
+
Object.defineProperty(exports, "OAuthPlugin", { enumerable: true, get: function () { return oauthPlugin_1.OAuthPlugin; } });
|
|
12
|
+
var oauthChain_1 = require("./oauthChain");
|
|
13
|
+
Object.defineProperty(exports, "oauthChain", { enumerable: true, get: function () { return __importDefault(oauthChain_1).default; } });
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const gun_1 = __importDefault(require("gun"));
|
|
7
|
+
const oauthConnector_1 = require("./oauthConnector");
|
|
8
|
+
const oauthChain = () => {
|
|
9
|
+
const oauth = new oauthConnector_1.OAuthConnector();
|
|
10
|
+
// Initialize the oauth chain object if it doesn't exist
|
|
11
|
+
if (!gun_1.default.chain.oauth) {
|
|
12
|
+
gun_1.default.chain.oauth = {};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if OAuth is supported
|
|
16
|
+
*/
|
|
17
|
+
gun_1.default.chain.oauth.isSupported = function () {
|
|
18
|
+
return oauth.isSupported();
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Get available OAuth providers
|
|
22
|
+
*/
|
|
23
|
+
gun_1.default.chain.oauth.getAvailableProviders = function () {
|
|
24
|
+
return oauth.getAvailableProviders();
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Initiate OAuth flow with a provider
|
|
28
|
+
*/
|
|
29
|
+
gun_1.default.chain.oauth.initiateOAuth = async function (provider) {
|
|
30
|
+
return await oauth.initiateOAuth(provider);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Complete OAuth flow
|
|
34
|
+
*/
|
|
35
|
+
gun_1.default.chain.oauth.completeOAuth = async function (provider, authCode, state) {
|
|
36
|
+
return await oauth.completeOAuth(provider, authCode, state);
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Generate credentials from OAuth user info
|
|
40
|
+
*/
|
|
41
|
+
gun_1.default.chain.oauth.generateCredentials = async function (userInfo, provider) {
|
|
42
|
+
return await oauth.generateCredentials(userInfo, provider);
|
|
43
|
+
};
|
|
44
|
+
// === CONVENIENCE METHODS FOR SPECIFIC PROVIDERS ===
|
|
45
|
+
/**
|
|
46
|
+
* Google OAuth flow
|
|
47
|
+
*/
|
|
48
|
+
gun_1.default.chain.oauth.google = {
|
|
49
|
+
initiate: async function () {
|
|
50
|
+
return await oauth.initiateOAuth("google");
|
|
51
|
+
},
|
|
52
|
+
complete: async function (authCode, state) {
|
|
53
|
+
return await oauth.completeOAuth("google", authCode, state);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* GitHub OAuth flow
|
|
58
|
+
*/
|
|
59
|
+
gun_1.default.chain.oauth.github = {
|
|
60
|
+
initiate: async function () {
|
|
61
|
+
return await oauth.initiateOAuth("github");
|
|
62
|
+
},
|
|
63
|
+
complete: async function (authCode, state) {
|
|
64
|
+
return await oauth.completeOAuth("github", authCode, state);
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Discord OAuth flow
|
|
69
|
+
*/
|
|
70
|
+
gun_1.default.chain.oauth.discord = {
|
|
71
|
+
initiate: async function () {
|
|
72
|
+
return await oauth.initiateOAuth("discord");
|
|
73
|
+
},
|
|
74
|
+
complete: async function (authCode, state) {
|
|
75
|
+
return await oauth.completeOAuth("discord", authCode, state);
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Twitter OAuth flow
|
|
80
|
+
*/
|
|
81
|
+
gun_1.default.chain.oauth.twitter = {
|
|
82
|
+
initiate: async function () {
|
|
83
|
+
return await oauth.initiateOAuth("twitter");
|
|
84
|
+
},
|
|
85
|
+
complete: async function (authCode, state) {
|
|
86
|
+
return await oauth.completeOAuth("twitter", authCode, state);
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Setup OAuth for a specific provider with configuration
|
|
91
|
+
*/
|
|
92
|
+
gun_1.default.chain.oauth.setup = function (provider, config) {
|
|
93
|
+
try {
|
|
94
|
+
console.log(`Setting up OAuth for ${provider}`);
|
|
95
|
+
// Store configuration securely
|
|
96
|
+
const configKey = `oauth_config_${provider}`;
|
|
97
|
+
sessionStorage.setItem(configKey, JSON.stringify(config));
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
provider,
|
|
101
|
+
message: `OAuth configured for ${provider}`,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
console.error(`Error setting up OAuth for ${provider}:`, error);
|
|
106
|
+
return {
|
|
107
|
+
success: false,
|
|
108
|
+
error: error.message,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Get configuration for a provider
|
|
114
|
+
*/
|
|
115
|
+
gun_1.default.chain.oauth.getConfig = function (provider) {
|
|
116
|
+
try {
|
|
117
|
+
const configKey = `oauth_config_${provider}`;
|
|
118
|
+
const config = sessionStorage.getItem(configKey);
|
|
119
|
+
if (!config) {
|
|
120
|
+
return {
|
|
121
|
+
success: false,
|
|
122
|
+
error: `No configuration found for ${provider}`,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
success: true,
|
|
127
|
+
config: JSON.parse(config),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error(`Error getting config for ${provider}:`, error);
|
|
132
|
+
return {
|
|
133
|
+
success: false,
|
|
134
|
+
error: error.message,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Cleanup OAuth resources
|
|
140
|
+
*/
|
|
141
|
+
gun_1.default.chain.oauth.cleanup = function () {
|
|
142
|
+
try {
|
|
143
|
+
oauth.cleanup();
|
|
144
|
+
// Clear all OAuth related session storage
|
|
145
|
+
const keysToRemove = [];
|
|
146
|
+
for (let i = 0; i < sessionStorage.length; i++) {
|
|
147
|
+
const key = sessionStorage.key(i);
|
|
148
|
+
if (key && key.startsWith("oauth_")) {
|
|
149
|
+
keysToRemove.push(key);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
keysToRemove.forEach((key) => sessionStorage.removeItem(key));
|
|
153
|
+
return { success: true, message: "OAuth cleanup completed" };
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.error("Error during OAuth cleanup:", error);
|
|
157
|
+
return { success: false, error: error.message };
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
};
|
|
161
|
+
exports.default = oauthChain;
|