@metamask/profile-sync-controller 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -1
- package/dist/chunk-26CCETCM.mjs +70 -0
- package/dist/chunk-2MVOZPBN.js +98 -0
- package/dist/chunk-2MVOZPBN.js.map +1 -0
- package/dist/chunk-3FJQHCCQ.mjs +106 -0
- package/dist/chunk-3FJQHCCQ.mjs.map +1 -0
- package/dist/chunk-4OMJ7A6A.js +77 -0
- package/dist/chunk-4OMJ7A6A.js.map +1 -0
- package/dist/chunk-6P6CUKKI.mjs +30 -0
- package/dist/chunk-6P6CUKKI.mjs.map +1 -0
- package/dist/{chunk-OF3TQWGX.js → chunk-6TK7544L.js} +34 -34
- package/dist/chunk-6TK7544L.js.map +1 -0
- package/dist/chunk-76VRE4BI.mjs +18 -0
- package/dist/chunk-76VRE4BI.mjs.map +1 -0
- package/dist/chunk-772MKTIO.mjs +25 -0
- package/dist/chunk-772MKTIO.mjs.map +1 -0
- package/dist/chunk-7FCK4BY3.js +25 -0
- package/dist/chunk-7FCK4BY3.js.map +1 -0
- package/dist/{chunk-CYGZ4WLJ.mjs → chunk-7VMXBDXN.mjs} +36 -5
- package/dist/chunk-7VMXBDXN.mjs.map +1 -0
- package/dist/chunk-ARWL2LBB.js +273 -0
- package/dist/chunk-ARWL2LBB.js.map +1 -0
- package/dist/chunk-BFE6TB7Y.mjs +11 -0
- package/dist/chunk-BFE6TB7Y.mjs.map +1 -0
- package/dist/chunk-BVM4HBM4.js +112 -0
- package/dist/chunk-BVM4HBM4.js.map +1 -0
- package/dist/chunk-DHHBHLVN.mjs +70 -0
- package/dist/chunk-DHHBHLVN.mjs.map +1 -0
- package/dist/chunk-DLXLU44Z.js +106 -0
- package/dist/chunk-DLXLU44Z.js.map +1 -0
- package/dist/chunk-GJJT2CAL.js +3342 -0
- package/dist/chunk-GJJT2CAL.js.map +1 -0
- package/dist/{chunk-VZXD5DCQ.js → chunk-GLDUXN2T.js} +36 -27
- package/dist/chunk-GLDUXN2T.js.map +1 -0
- package/dist/chunk-GLS4QZF6.mjs +77 -0
- package/dist/chunk-GLS4QZF6.mjs.map +1 -0
- package/dist/chunk-H25EBXG5.mjs +58 -0
- package/dist/chunk-H25EBXG5.mjs.map +1 -0
- package/dist/chunk-IPSBQ3MS.js +30 -0
- package/dist/chunk-IPSBQ3MS.js.map +1 -0
- package/dist/chunk-IZHWP5VW.mjs +79 -0
- package/dist/chunk-IZHWP5VW.mjs.map +1 -0
- package/dist/chunk-JAGWB4JI.mjs +102 -0
- package/dist/chunk-JAGWB4JI.mjs.map +1 -0
- package/dist/chunk-JMU3OVPK.mjs +3342 -0
- package/dist/chunk-JMU3OVPK.mjs.map +1 -0
- package/dist/chunk-JTDFOATG.js +11 -0
- package/dist/chunk-JTDFOATG.js.map +1 -0
- package/dist/chunk-JWTNHCVG.js +158 -0
- package/dist/chunk-JWTNHCVG.js.map +1 -0
- package/dist/chunk-K6G7X6PX.js +70 -0
- package/dist/chunk-K6G7X6PX.js.map +1 -0
- package/dist/chunk-LHDVZNW5.js +126 -0
- package/dist/chunk-LHDVZNW5.js.map +1 -0
- package/dist/{chunk-VXPVURGH.mjs → chunk-LN2BY2QF.mjs} +9 -9
- package/dist/chunk-LN2BY2QF.mjs.map +1 -0
- package/dist/{chunk-6X6I3HZU.js → chunk-LUKNP4HM.js} +28 -26
- package/dist/chunk-LUKNP4HM.js.map +1 -0
- package/dist/{chunk-GQLHSQGZ.js → chunk-MBTBE4P5.js} +9 -2
- package/dist/chunk-MBTBE4P5.js.map +1 -0
- package/dist/chunk-PCOIRDTO.js +18 -0
- package/dist/chunk-PCOIRDTO.js.map +1 -0
- package/dist/chunk-PNZGAAT4.mjs +273 -0
- package/dist/chunk-PNZGAAT4.mjs.map +1 -0
- package/dist/chunk-PRDECQM6.mjs +221 -0
- package/dist/chunk-PRDECQM6.mjs.map +1 -0
- package/dist/chunk-QE2F5AZL.mjs +158 -0
- package/dist/chunk-QE2F5AZL.mjs.map +1 -0
- package/dist/chunk-QHL6SQTC.mjs +112 -0
- package/dist/chunk-QHL6SQTC.mjs.map +1 -0
- package/dist/chunk-QILE6KIE.js +79 -0
- package/dist/chunk-QILE6KIE.js.map +1 -0
- package/dist/{chunk-CFST6GWE.js → chunk-T77FC4PB.js} +1 -1
- package/dist/chunk-T77FC4PB.js.map +1 -0
- package/dist/{chunk-BHVT2QEA.mjs → chunk-TFFQFIJV.mjs} +8 -1
- package/dist/chunk-TFFQFIJV.mjs.map +1 -0
- package/dist/chunk-UAXWZN5J.js +58 -0
- package/dist/chunk-UAXWZN5J.js.map +1 -0
- package/dist/{chunk-CZ7YK35S.mjs → chunk-UEZI2POO.mjs} +7 -5
- package/dist/{chunk-CZ7YK35S.mjs.map → chunk-UEZI2POO.mjs.map} +1 -1
- package/dist/{chunk-4NGEEDGV.mjs → chunk-UWRKMJBI.mjs} +9 -9
- package/dist/chunk-UWRKMJBI.mjs.map +1 -0
- package/dist/chunk-V46WVGWN.js +70 -0
- package/dist/{chunk-UMKBFFZ5.mjs → chunk-VTM5T7Y4.mjs} +13 -4
- package/dist/chunk-VTM5T7Y4.mjs.map +1 -0
- package/dist/chunk-VYE2DKST.js +102 -0
- package/dist/chunk-VYE2DKST.js.map +1 -0
- package/dist/chunk-W7JFFMEZ.mjs +98 -0
- package/dist/chunk-W7JFFMEZ.mjs.map +1 -0
- package/dist/chunk-WAS6V24H.js +221 -0
- package/dist/chunk-WAS6V24H.js.map +1 -0
- package/dist/{chunk-NRH6O4QZ.js → chunk-XUPRRLBI.js} +45 -14
- package/dist/chunk-XUPRRLBI.js.map +1 -0
- package/dist/{chunk-2FZSWVHT.mjs → chunk-YWA77VMP.mjs} +1 -1
- package/dist/chunk-YWA77VMP.mjs.map +1 -0
- package/dist/controllers/authentication/AuthenticationController.js +22 -0
- package/dist/controllers/authentication/AuthenticationController.mjs +22 -0
- package/dist/controllers/authentication/auth-snap-requests.js +10 -0
- package/dist/controllers/authentication/auth-snap-requests.mjs +10 -0
- package/dist/controllers/authentication/index.js +27 -0
- package/dist/controllers/authentication/index.js.map +1 -0
- package/dist/controllers/authentication/index.mjs +27 -0
- package/dist/controllers/authentication/index.mjs.map +1 -0
- package/dist/controllers/authentication/services.js +32 -0
- package/dist/controllers/authentication/services.js.map +1 -0
- package/dist/controllers/authentication/services.mjs +32 -0
- package/dist/controllers/authentication/services.mjs.map +1 -0
- package/dist/controllers/index.js +35 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/index.mjs +35 -0
- package/dist/controllers/index.mjs.map +1 -0
- package/dist/controllers/user-storage/UserStorageController.js +27 -0
- package/dist/controllers/user-storage/UserStorageController.js.map +1 -0
- package/dist/controllers/user-storage/UserStorageController.mjs +27 -0
- package/dist/controllers/user-storage/UserStorageController.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/cache.js +13 -0
- package/dist/controllers/user-storage/encryption/cache.js.map +1 -0
- package/dist/controllers/user-storage/encryption/cache.mjs +13 -0
- package/dist/controllers/user-storage/encryption/cache.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/encryption.js +12 -0
- package/dist/controllers/user-storage/encryption/encryption.js.map +1 -0
- package/dist/controllers/user-storage/encryption/encryption.mjs +12 -0
- package/dist/controllers/user-storage/encryption/encryption.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/index.js +16 -0
- package/dist/controllers/user-storage/encryption/index.js.map +1 -0
- package/dist/controllers/user-storage/encryption/index.mjs +16 -0
- package/dist/controllers/user-storage/encryption/index.mjs.map +1 -0
- package/dist/controllers/user-storage/encryption/utils.js +12 -0
- package/dist/controllers/user-storage/encryption/utils.js.map +1 -0
- package/dist/controllers/user-storage/encryption/utils.mjs +12 -0
- package/dist/controllers/user-storage/encryption/utils.mjs.map +1 -0
- package/dist/controllers/user-storage/index.js +37 -0
- package/dist/controllers/user-storage/index.js.map +1 -0
- package/dist/controllers/user-storage/index.mjs +37 -0
- package/dist/controllers/user-storage/index.mjs.map +1 -0
- package/dist/controllers/user-storage/schema.js +14 -0
- package/dist/controllers/user-storage/schema.js.map +1 -0
- package/dist/controllers/user-storage/schema.mjs +14 -0
- package/dist/controllers/user-storage/schema.mjs.map +1 -0
- package/dist/controllers/user-storage/services.js +31 -0
- package/dist/controllers/user-storage/services.js.map +1 -0
- package/dist/controllers/user-storage/services.mjs +31 -0
- package/dist/controllers/user-storage/services.mjs.map +1 -0
- package/dist/index.js +32 -62
- package/dist/index.mjs +33 -63
- package/dist/sdk/authentication-jwt-bearer/flow-siwe.js +7 -8
- package/dist/sdk/authentication-jwt-bearer/flow-siwe.mjs +6 -7
- package/dist/sdk/authentication-jwt-bearer/flow-srp.js +7 -8
- package/dist/sdk/authentication-jwt-bearer/flow-srp.mjs +6 -7
- package/dist/sdk/authentication-jwt-bearer/services.js +10 -6
- package/dist/sdk/authentication-jwt-bearer/services.mjs +11 -7
- package/dist/sdk/authentication-jwt-bearer/types.js +3 -3
- package/dist/sdk/authentication-jwt-bearer/types.mjs +2 -2
- package/dist/sdk/authentication.js +9 -10
- package/dist/sdk/authentication.mjs +8 -9
- package/dist/sdk/encryption.js +5 -3
- package/dist/sdk/encryption.mjs +4 -2
- package/dist/sdk/env.js +5 -3
- package/dist/sdk/env.mjs +4 -2
- package/dist/sdk/errors.js +5 -3
- package/dist/sdk/errors.mjs +4 -2
- package/dist/sdk/index.js +18 -13
- package/dist/sdk/index.mjs +17 -12
- package/dist/sdk/user-storage.js +6 -6
- package/dist/sdk/user-storage.mjs +5 -5
- package/dist/sdk/utils/eip-6963-metamask-provider.js +1 -1
- package/dist/sdk/utils/eip-6963-metamask-provider.mjs +1 -1
- package/dist/sdk/utils/messaging-signing-snap-requests.js +1 -1
- package/dist/sdk/utils/messaging-signing-snap-requests.mjs +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/controllers/authentication/AuthenticationController.d.ts +73 -0
- package/dist/types/controllers/authentication/AuthenticationController.d.ts.map +1 -0
- package/dist/types/controllers/authentication/__fixtures__/index.d.ts +3 -0
- package/dist/types/controllers/authentication/__fixtures__/index.d.ts.map +1 -0
- package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts +23 -0
- package/dist/types/controllers/authentication/__fixtures__/mockResponses.d.ts.map +1 -0
- package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts +10 -0
- package/dist/types/controllers/authentication/__fixtures__/mockServices.d.ts.map +1 -0
- package/dist/types/controllers/authentication/auth-snap-requests.d.ts +17 -0
- package/dist/types/controllers/authentication/auth-snap-requests.d.ts.map +1 -0
- package/dist/types/controllers/authentication/index.d.ts +5 -0
- package/dist/types/controllers/authentication/index.d.ts.map +1 -0
- package/dist/types/controllers/authentication/services.d.ts +69 -0
- package/dist/types/controllers/authentication/services.d.ts.map +1 -0
- package/dist/types/controllers/index.d.ts +3 -0
- package/dist/types/controllers/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/UserStorageController.d.ts +84 -0
- package/dist/types/controllers/user-storage/UserStorageController.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/index.d.ts +4 -0
- package/dist/types/controllers/user-storage/__fixtures__/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts +13 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockResponses.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts +9 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockServices.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts +5 -0
- package/dist/types/controllers/user-storage/__fixtures__/mockStorage.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/cache.d.ts +31 -0
- package/dist/types/controllers/user-storage/encryption/cache.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/encryption.d.ts +26 -0
- package/dist/types/controllers/user-storage/encryption/encryption.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/index.d.ts +5 -0
- package/dist/types/controllers/user-storage/encryption/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/encryption/utils.d.ts +4 -0
- package/dist/types/controllers/user-storage/encryption/utils.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/index.d.ts +6 -0
- package/dist/types/controllers/user-storage/index.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/schema.d.ts +22 -0
- package/dist/types/controllers/user-storage/schema.d.ts.map +1 -0
- package/dist/types/controllers/user-storage/services.d.ts +30 -0
- package/dist/types/controllers/user-storage/services.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/sdk/__fixtures__/mock-auth.d.ts +3 -0
- package/dist/types/sdk/__fixtures__/mock-auth.d.ts.map +1 -1
- package/dist/types/sdk/__fixtures__/mock-userstorage.d.ts.map +1 -1
- package/dist/types/sdk/__fixtures__/test-utils.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/flow-siwe.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/flow-srp.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/services.d.ts +20 -2
- package/dist/types/sdk/authentication-jwt-bearer/services.d.ts.map +1 -1
- package/dist/types/sdk/authentication-jwt-bearer/types.d.ts +8 -1
- package/dist/types/sdk/authentication-jwt-bearer/types.d.ts.map +1 -1
- package/dist/types/sdk/authentication.d.ts +2 -1
- package/dist/types/sdk/authentication.d.ts.map +1 -1
- package/dist/types/sdk/encryption.d.ts +2 -2
- package/dist/types/sdk/encryption.d.ts.map +1 -1
- package/dist/types/sdk/env.d.ts +8 -1
- package/dist/types/sdk/env.d.ts.map +1 -1
- package/dist/types/sdk/errors.d.ts +3 -0
- package/dist/types/sdk/errors.d.ts.map +1 -1
- package/dist/types/sdk/user-storage.d.ts.map +1 -1
- package/package.json +15 -2
- package/dist/chunk-2FZSWVHT.mjs.map +0 -1
- package/dist/chunk-4NGEEDGV.mjs.map +0 -1
- package/dist/chunk-6X6I3HZU.js.map +0 -1
- package/dist/chunk-BARZBXO7.js +0 -7
- package/dist/chunk-BARZBXO7.js.map +0 -1
- package/dist/chunk-BHVT2QEA.mjs.map +0 -1
- package/dist/chunk-CFST6GWE.js.map +0 -1
- package/dist/chunk-CYGZ4WLJ.mjs.map +0 -1
- package/dist/chunk-DEATIRII.js +0 -1
- package/dist/chunk-GQLHSQGZ.js.map +0 -1
- package/dist/chunk-GVMIXMYB.mjs +0 -67
- package/dist/chunk-GVMIXMYB.mjs.map +0 -1
- package/dist/chunk-KHFPE566.js +0 -49
- package/dist/chunk-KHFPE566.js.map +0 -1
- package/dist/chunk-KKRIOEXD.mjs +0 -7
- package/dist/chunk-KKRIOEXD.mjs.map +0 -1
- package/dist/chunk-MKJYSWME.mjs +0 -1
- package/dist/chunk-NRH6O4QZ.js.map +0 -1
- package/dist/chunk-OF3TQWGX.js.map +0 -1
- package/dist/chunk-UMKBFFZ5.mjs.map +0 -1
- package/dist/chunk-UVJVONBF.js +0 -126
- package/dist/chunk-UVJVONBF.js.map +0 -1
- package/dist/chunk-VHUU4HEY.js +0 -67
- package/dist/chunk-VHUU4HEY.js.map +0 -1
- package/dist/chunk-VXPVURGH.mjs.map +0 -1
- package/dist/chunk-VZXD5DCQ.js.map +0 -1
- package/dist/chunk-WJRV2JCX.mjs +0 -49
- package/dist/chunk-WJRV2JCX.mjs.map +0 -1
- package/dist/chunk-XUI43LEZ.mjs +0 -30
- package/dist/chunk-Z4BLTVTB.js +0 -30
- package/dist/sdk/authentication-jwt-bearer/constants.js +0 -8
- package/dist/sdk/authentication-jwt-bearer/constants.mjs +0 -8
- package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts +0 -2
- package/dist/types/sdk/authentication-jwt-bearer/constants.d.ts.map +0 -1
- /package/dist/{chunk-MKJYSWME.mjs.map → chunk-26CCETCM.mjs.map} +0 -0
- /package/dist/{chunk-DEATIRII.js.map → chunk-V46WVGWN.js.map} +0 -0
- /package/dist/{chunk-Z4BLTVTB.js.map → controllers/authentication/AuthenticationController.js.map} +0 -0
- /package/dist/{chunk-XUI43LEZ.mjs.map → controllers/authentication/AuthenticationController.mjs.map} +0 -0
- /package/dist/{sdk/authentication-jwt-bearer/constants.js.map → controllers/authentication/auth-snap-requests.js.map} +0 -0
- /package/dist/{sdk/authentication-jwt-bearer/constants.mjs.map → controllers/authentication/auth-snap-requests.mjs.map} +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
var _chunkUAXWZN5Jjs = require('./chunk-UAXWZN5J.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
var _chunkPCOIRDTOjs = require('./chunk-PCOIRDTO.js');
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
var _chunkV46WVGWNjs = require('./chunk-V46WVGWN.js');
|
|
15
|
+
|
|
16
|
+
// src/controllers/user-storage/encryption/encryption.ts
|
|
17
|
+
var _aes = require('@noble/ciphers/aes');
|
|
18
|
+
var _webcrypto = require('@noble/ciphers/webcrypto');
|
|
19
|
+
var _scrypt = require('@noble/hashes/scrypt');
|
|
20
|
+
var _sha256 = require('@noble/hashes/sha256');
|
|
21
|
+
var _utils = require('@noble/hashes/utils');
|
|
22
|
+
var ALGORITHM_NONCE_SIZE = 12;
|
|
23
|
+
var ALGORITHM_KEY_SIZE = 16;
|
|
24
|
+
var SCRYPT_SALT_SIZE = 16;
|
|
25
|
+
var SCRYPT_N = 2 ** 17;
|
|
26
|
+
var SCRYPT_r = 8;
|
|
27
|
+
var SCRYPT_p = 1;
|
|
28
|
+
var _encryptStringV1, encryptStringV1_fn, _decryptStringV1, decryptStringV1_fn, _encrypt, encrypt_fn, _decrypt, decrypt_fn, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn;
|
|
29
|
+
var EncryptorDecryptor = class {
|
|
30
|
+
constructor() {
|
|
31
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _encryptStringV1);
|
|
32
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _decryptStringV1);
|
|
33
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _encrypt);
|
|
34
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _decrypt);
|
|
35
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _getOrGenerateScryptKey);
|
|
36
|
+
}
|
|
37
|
+
encryptString(plaintext, password) {
|
|
38
|
+
try {
|
|
39
|
+
return _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _encryptStringV1, encryptStringV1_fn).call(this, plaintext, password);
|
|
40
|
+
} catch (e) {
|
|
41
|
+
const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
|
|
42
|
+
throw new Error(`Unable to encrypt string - ${errorMessage}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
decryptString(encryptedDataStr, password) {
|
|
46
|
+
try {
|
|
47
|
+
const encryptedData = JSON.parse(encryptedDataStr);
|
|
48
|
+
if (encryptedData.v === "1") {
|
|
49
|
+
if (encryptedData.t === "scrypt") {
|
|
50
|
+
return _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _decryptStringV1, decryptStringV1_fn).call(this, encryptedData, password);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
throw new Error(
|
|
54
|
+
`Unsupported encrypted data payload - ${encryptedDataStr}`
|
|
55
|
+
);
|
|
56
|
+
} catch (e) {
|
|
57
|
+
const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);
|
|
58
|
+
throw new Error(`Unable to decrypt string - ${errorMessage}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
_encryptStringV1 = new WeakSet();
|
|
63
|
+
encryptStringV1_fn = function(plaintext, password) {
|
|
64
|
+
const { key, salt } = _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn).call(this, password, {
|
|
65
|
+
N: SCRYPT_N,
|
|
66
|
+
r: SCRYPT_r,
|
|
67
|
+
p: SCRYPT_p,
|
|
68
|
+
dkLen: ALGORITHM_KEY_SIZE
|
|
69
|
+
});
|
|
70
|
+
const plaintextRaw = _utils.utf8ToBytes.call(void 0, plaintext);
|
|
71
|
+
const ciphertextAndNonceAndSalt = _utils.concatBytes.call(void 0,
|
|
72
|
+
salt,
|
|
73
|
+
_chunkV46WVGWNjs.__privateMethod.call(void 0, this, _encrypt, encrypt_fn).call(this, plaintextRaw, key)
|
|
74
|
+
);
|
|
75
|
+
const encryptedData = _chunkPCOIRDTOjs.byteArrayToBase64.call(void 0, ciphertextAndNonceAndSalt);
|
|
76
|
+
const encryptedPayload = {
|
|
77
|
+
v: "1",
|
|
78
|
+
t: "scrypt",
|
|
79
|
+
d: encryptedData,
|
|
80
|
+
o: {
|
|
81
|
+
N: SCRYPT_N,
|
|
82
|
+
r: SCRYPT_r,
|
|
83
|
+
p: SCRYPT_p,
|
|
84
|
+
dkLen: ALGORITHM_KEY_SIZE
|
|
85
|
+
},
|
|
86
|
+
saltLen: SCRYPT_SALT_SIZE
|
|
87
|
+
};
|
|
88
|
+
return JSON.stringify(encryptedPayload);
|
|
89
|
+
};
|
|
90
|
+
_decryptStringV1 = new WeakSet();
|
|
91
|
+
decryptStringV1_fn = function(data, password) {
|
|
92
|
+
const { o, d: base64CiphertextAndNonceAndSalt, saltLen } = data;
|
|
93
|
+
const ciphertextAndNonceAndSalt = _chunkPCOIRDTOjs.base64ToByteArray.call(void 0,
|
|
94
|
+
base64CiphertextAndNonceAndSalt
|
|
95
|
+
);
|
|
96
|
+
const salt = ciphertextAndNonceAndSalt.slice(0, saltLen);
|
|
97
|
+
const ciphertextAndNonce = ciphertextAndNonceAndSalt.slice(
|
|
98
|
+
saltLen,
|
|
99
|
+
ciphertextAndNonceAndSalt.length
|
|
100
|
+
);
|
|
101
|
+
const { key } = _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getOrGenerateScryptKey, getOrGenerateScryptKey_fn).call(this, password, {
|
|
102
|
+
N: o.N,
|
|
103
|
+
r: o.r,
|
|
104
|
+
p: o.p,
|
|
105
|
+
dkLen: o.dkLen
|
|
106
|
+
}, salt);
|
|
107
|
+
return _chunkPCOIRDTOjs.bytesToUtf8.call(void 0, _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _decrypt, decrypt_fn).call(this, ciphertextAndNonce, key));
|
|
108
|
+
};
|
|
109
|
+
_encrypt = new WeakSet();
|
|
110
|
+
encrypt_fn = function(plaintext, key) {
|
|
111
|
+
const nonce = _webcrypto.randomBytes.call(void 0, ALGORITHM_NONCE_SIZE);
|
|
112
|
+
const ciphertext = _aes.gcm.call(void 0, key, nonce).encrypt(plaintext);
|
|
113
|
+
return _utils.concatBytes.call(void 0, nonce, ciphertext);
|
|
114
|
+
};
|
|
115
|
+
_decrypt = new WeakSet();
|
|
116
|
+
decrypt_fn = function(ciphertextAndNonce, key) {
|
|
117
|
+
const nonce = ciphertextAndNonce.slice(0, ALGORITHM_NONCE_SIZE);
|
|
118
|
+
const ciphertext = ciphertextAndNonce.slice(
|
|
119
|
+
ALGORITHM_NONCE_SIZE,
|
|
120
|
+
ciphertextAndNonce.length
|
|
121
|
+
);
|
|
122
|
+
return _aes.gcm.call(void 0, key, nonce).decrypt(ciphertext);
|
|
123
|
+
};
|
|
124
|
+
_getOrGenerateScryptKey = new WeakSet();
|
|
125
|
+
getOrGenerateScryptKey_fn = function(password, o, salt) {
|
|
126
|
+
const hashedPassword = createSHA256Hash(password);
|
|
127
|
+
const cachedKey = salt ? _chunkUAXWZN5Jjs.getCachedKeyBySalt.call(void 0, hashedPassword, salt) : _chunkUAXWZN5Jjs.getAnyCachedKey.call(void 0, hashedPassword);
|
|
128
|
+
if (cachedKey) {
|
|
129
|
+
return {
|
|
130
|
+
key: cachedKey.key,
|
|
131
|
+
salt: cachedKey.salt
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
const newSalt = salt ?? _webcrypto.randomBytes.call(void 0, SCRYPT_SALT_SIZE);
|
|
135
|
+
const newKey = _scrypt.scrypt.call(void 0, password, newSalt, {
|
|
136
|
+
N: o.N,
|
|
137
|
+
r: o.r,
|
|
138
|
+
p: o.p,
|
|
139
|
+
dkLen: o.dkLen
|
|
140
|
+
});
|
|
141
|
+
_chunkUAXWZN5Jjs.setCachedKey.call(void 0, hashedPassword, newSalt, newKey);
|
|
142
|
+
return {
|
|
143
|
+
key: newKey,
|
|
144
|
+
salt: newSalt
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
var encryption = new EncryptorDecryptor();
|
|
148
|
+
var encryption_default = encryption;
|
|
149
|
+
function createSHA256Hash(data) {
|
|
150
|
+
const hashedData = _sha256.sha256.call(void 0, data);
|
|
151
|
+
return _utils.bytesToHex.call(void 0, hashedData);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
exports.encryption_default = encryption_default; exports.createSHA256Hash = createSHA256Hash;
|
|
158
|
+
//# sourceMappingURL=chunk-JWTNHCVG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/encryption/encryption.ts"],"names":[],"mappings":"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","sourcesContent":["import { gcm } from '@noble/ciphers/aes';\nimport { randomBytes } from '@noble/ciphers/webcrypto';\nimport { scrypt } from '@noble/hashes/scrypt';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { utf8ToBytes, concatBytes, bytesToHex } from '@noble/hashes/utils';\n\nimport { getAnyCachedKey, getCachedKeyBySalt, setCachedKey } from './cache';\nimport { base64ToByteArray, byteArrayToBase64, bytesToUtf8 } from './utils';\n\nexport type EncryptedPayload = {\n // version\n v: '1';\n\n // key derivation function algorithm - scrypt\n t: 'scrypt';\n\n // data\n d: string;\n\n // encryption options - scrypt\n o: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n N: number;\n r: number;\n p: number;\n dkLen: number;\n };\n\n // Salt options\n saltLen: number;\n};\n\n// Nonce/Key Sizes\nconst ALGORITHM_NONCE_SIZE = 12; // 12 bytes\nconst ALGORITHM_KEY_SIZE = 16; // 16 bytes\n\n// Scrypt settings\n// see: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#scrypt\nconst SCRYPT_SALT_SIZE = 16; // 16 bytes\nconst SCRYPT_N = 2 ** 17; // CPU/memory cost parameter (must be a power of 2, > 1)\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst SCRYPT_r = 8; // Block size parameter\n// eslint-disable-next-line @typescript-eslint/naming-convention\nconst SCRYPT_p = 1; // Parallelization parameter\n\nclass EncryptorDecryptor {\n encryptString(plaintext: string, password: string): string {\n try {\n return this.#encryptStringV1(plaintext, password);\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(`Unable to encrypt string - ${errorMessage}`);\n }\n }\n\n decryptString(encryptedDataStr: string, password: string): string {\n try {\n const encryptedData: EncryptedPayload = JSON.parse(encryptedDataStr);\n if (encryptedData.v === '1') {\n if (encryptedData.t === 'scrypt') {\n return this.#decryptStringV1(encryptedData, password);\n }\n }\n throw new Error(\n `Unsupported encrypted data payload - ${encryptedDataStr}`,\n );\n } catch (e) {\n const errorMessage = e instanceof Error ? e.message : JSON.stringify(e);\n throw new Error(`Unable to decrypt string - ${errorMessage}`);\n }\n }\n\n #encryptStringV1(plaintext: string, password: string): string {\n const { key, salt } = this.#getOrGenerateScryptKey(password, {\n N: SCRYPT_N,\n r: SCRYPT_r,\n p: SCRYPT_p,\n dkLen: ALGORITHM_KEY_SIZE,\n });\n\n // Encrypt and prepend salt.\n const plaintextRaw = utf8ToBytes(plaintext);\n const ciphertextAndNonceAndSalt = concatBytes(\n salt,\n this.#encrypt(plaintextRaw, key),\n );\n\n // Convert to Base64\n const encryptedData = byteArrayToBase64(ciphertextAndNonceAndSalt);\n\n const encryptedPayload: EncryptedPayload = {\n v: '1',\n t: 'scrypt',\n d: encryptedData,\n o: {\n N: SCRYPT_N,\n r: SCRYPT_r,\n p: SCRYPT_p,\n dkLen: ALGORITHM_KEY_SIZE,\n },\n saltLen: SCRYPT_SALT_SIZE,\n };\n\n return JSON.stringify(encryptedPayload);\n }\n\n #decryptStringV1(data: EncryptedPayload, password: string): string {\n const { o, d: base64CiphertextAndNonceAndSalt, saltLen } = data;\n\n // Decode the base64.\n const ciphertextAndNonceAndSalt = base64ToByteArray(\n base64CiphertextAndNonceAndSalt,\n );\n\n // Create buffers of salt and ciphertextAndNonce.\n const salt = ciphertextAndNonceAndSalt.slice(0, saltLen);\n const ciphertextAndNonce = ciphertextAndNonceAndSalt.slice(\n saltLen,\n ciphertextAndNonceAndSalt.length,\n );\n\n // Derive the key.\n const { key } = this.#getOrGenerateScryptKey(\n password,\n {\n N: o.N,\n r: o.r,\n p: o.p,\n dkLen: o.dkLen,\n },\n salt,\n );\n\n // Decrypt and return result.\n return bytesToUtf8(this.#decrypt(ciphertextAndNonce, key));\n }\n\n #encrypt(plaintext: Uint8Array, key: Uint8Array): Uint8Array {\n const nonce = randomBytes(ALGORITHM_NONCE_SIZE);\n\n // Encrypt and prepend nonce.\n const ciphertext = gcm(key, nonce).encrypt(plaintext);\n\n return concatBytes(nonce, ciphertext);\n }\n\n #decrypt(ciphertextAndNonce: Uint8Array, key: Uint8Array): Uint8Array {\n // Create buffers of nonce and ciphertext.\n const nonce = ciphertextAndNonce.slice(0, ALGORITHM_NONCE_SIZE);\n const ciphertext = ciphertextAndNonce.slice(\n ALGORITHM_NONCE_SIZE,\n ciphertextAndNonce.length,\n );\n\n // Decrypt and return result.\n return gcm(key, nonce).decrypt(ciphertext);\n }\n\n #getOrGenerateScryptKey(\n password: string,\n o: EncryptedPayload['o'],\n salt?: Uint8Array,\n ) {\n const hashedPassword = createSHA256Hash(password);\n const cachedKey = salt\n ? getCachedKeyBySalt(hashedPassword, salt)\n : getAnyCachedKey(hashedPassword);\n\n if (cachedKey) {\n return {\n key: cachedKey.key,\n salt: cachedKey.salt,\n };\n }\n\n const newSalt = salt ?? randomBytes(SCRYPT_SALT_SIZE);\n const newKey = scrypt(password, newSalt, {\n N: o.N,\n r: o.r,\n p: o.p,\n dkLen: o.dkLen,\n });\n setCachedKey(hashedPassword, newSalt, newKey);\n\n return {\n key: newKey,\n salt: newSalt,\n };\n }\n}\n\nconst encryption = new EncryptorDecryptor();\nexport default encryption;\n\n/**\n * Receive a SHA256 hash from a given string\n * @param data - input\n * @returns sha256 hash\n */\nexport function createSHA256Hash(data: string): string {\n const hashedData = sha256(data);\n return bytesToHex(hashedData);\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
2
|
+
|
|
3
|
+
var _chunk7FCK4BY3js = require('./chunk-7FCK4BY3.js');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkJTDFOATGjs = require('./chunk-JTDFOATG.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunk4OMJ7A6Ajs = require('./chunk-4OMJ7A6A.js');
|
|
10
|
+
|
|
11
|
+
// src/controllers/user-storage/services.ts
|
|
12
|
+
var _loglevel = require('loglevel'); var _loglevel2 = _interopRequireDefault(_loglevel);
|
|
13
|
+
var ENV_URLS = _chunk4OMJ7A6Ajs.getEnvUrls.call(void 0, "prd" /* PRD */);
|
|
14
|
+
var USER_STORAGE_API = ENV_URLS.userStorageApiUrl;
|
|
15
|
+
var USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;
|
|
16
|
+
async function getUserStorage(opts) {
|
|
17
|
+
try {
|
|
18
|
+
const path = _chunk7FCK4BY3js.createEntryPath.call(void 0, opts.entryKey, opts.storageKey);
|
|
19
|
+
const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
|
|
20
|
+
const userStorageResponse = await fetch(url.toString(), {
|
|
21
|
+
headers: {
|
|
22
|
+
"Content-Type": "application/json",
|
|
23
|
+
Authorization: `Bearer ${opts.bearerToken}`
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
if (userStorageResponse.status === 404) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
if (userStorageResponse.status !== 200) {
|
|
30
|
+
throw new Error("Unable to get User Storage");
|
|
31
|
+
}
|
|
32
|
+
const userStorage = await userStorageResponse.json();
|
|
33
|
+
const encryptedData = userStorage?.Data ?? null;
|
|
34
|
+
if (!encryptedData) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const decryptedData = _chunkJTDFOATGjs.encryption_default.decryptString(
|
|
38
|
+
encryptedData,
|
|
39
|
+
opts.storageKey
|
|
40
|
+
);
|
|
41
|
+
return decryptedData;
|
|
42
|
+
} catch (e) {
|
|
43
|
+
_loglevel2.default.error("Failed to get user storage", e);
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function upsertUserStorage(data, opts) {
|
|
48
|
+
const encryptedData = _chunkJTDFOATGjs.encryption_default.encryptString(data, opts.storageKey);
|
|
49
|
+
const path = _chunk7FCK4BY3js.createEntryPath.call(void 0, opts.entryKey, opts.storageKey);
|
|
50
|
+
const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);
|
|
51
|
+
const res = await fetch(url.toString(), {
|
|
52
|
+
method: "PUT",
|
|
53
|
+
headers: {
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
Authorization: `Bearer ${opts.bearerToken}`
|
|
56
|
+
},
|
|
57
|
+
body: JSON.stringify({ data: encryptedData })
|
|
58
|
+
});
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
throw new Error("user-storage - unable to upsert data");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
exports.USER_STORAGE_API = USER_STORAGE_API; exports.USER_STORAGE_ENDPOINT = USER_STORAGE_ENDPOINT; exports.getUserStorage = getUserStorage; exports.upsertUserStorage = upsertUserStorage;
|
|
70
|
+
//# sourceMappingURL=chunk-K6G7X6PX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/controllers/user-storage/services.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,SAAS;AAOhB,IAAM,WAAW,0BAAkB;AAE5B,IAAM,mBAA2B,SAAS;AAC1C,IAAM,wBAAwB,GAAG,gBAAgB;AAwBxD,eAAsB,eACpB,MACwB;AACxB,MAAI;AACF,UAAM,OAAO,gBAAgB,KAAK,UAAU,KAAK,UAAU;AAC3D,UAAM,MAAM,IAAI,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAAE;AAErD,UAAM,sBAAsB,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,MACtD,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,WAAW;AAAA,MAC3C;AAAA,IACF,CAAC;AAGD,QAAI,oBAAoB,WAAW,KAAK;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,WAAW,KAAK;AACtC,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,UAAM,cACJ,MAAM,oBAAoB,KAAK;AACjC,UAAM,gBAAgB,aAAa,QAAQ;AAE3C,QAAI,CAAC,eAAe;AAClB,aAAO;AAAA,IACT;AAEA,UAAM,gBAAgB,mBAAW;AAAA,MAC/B;AAAA,MACA,KAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT,SAAS,GAAG;AACV,QAAI,MAAM,8BAA8B,CAAC;AACzC,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,kBACpB,MACA,MACe;AACf,QAAM,gBAAgB,mBAAW,cAAc,MAAM,KAAK,UAAU;AACpE,QAAM,OAAO,gBAAgB,KAAK,UAAU,KAAK,UAAU;AAC3D,QAAM,MAAM,IAAI,IAAI,GAAG,qBAAqB,GAAG,IAAI,EAAE;AAErD,QAAM,MAAM,MAAM,MAAM,IAAI,SAAS,GAAG;AAAA,IACtC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,KAAK,WAAW;AAAA,IAC3C;AAAA,IACA,MAAM,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAAA,EAC9C,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACF","sourcesContent":["import log from 'loglevel';\n\nimport { Env, getEnvUrls } from '../../sdk';\nimport encryption from './encryption';\nimport type { UserStorageEntryKeys } from './schema';\nimport { createEntryPath } from './schema';\n\nconst ENV_URLS = getEnvUrls(Env.PRD);\n\nexport const USER_STORAGE_API: string = ENV_URLS.userStorageApiUrl;\nexport const USER_STORAGE_ENDPOINT = `${USER_STORAGE_API}/api/v1/userstorage`;\n\n/**\n * This is the Server Response shape\n */\nexport type GetUserStorageResponse = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n HashedKey: string;\n // eslint-disable-next-line @typescript-eslint/naming-convention\n Data: string;\n};\n\nexport type UserStorageOptions = {\n bearerToken: string;\n entryKey: UserStorageEntryKeys;\n storageKey: string;\n};\n\n/**\n * User Storage Service - Get Storage Entry.\n *\n * @param opts - User Storage Options\n * @returns The storage entry, or null if fails to find entry\n */\nexport async function getUserStorage(\n opts: UserStorageOptions,\n): Promise<string | null> {\n try {\n const path = createEntryPath(opts.entryKey, opts.storageKey);\n const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);\n\n const userStorageResponse = await fetch(url.toString(), {\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.bearerToken}`,\n },\n });\n\n // Acceptable error - since indicates entry does not exist.\n if (userStorageResponse.status === 404) {\n return null;\n }\n\n if (userStorageResponse.status !== 200) {\n throw new Error('Unable to get User Storage');\n }\n\n const userStorage: GetUserStorageResponse | null =\n await userStorageResponse.json();\n const encryptedData = userStorage?.Data ?? null;\n\n if (!encryptedData) {\n return null;\n }\n\n const decryptedData = encryption.decryptString(\n encryptedData,\n opts.storageKey,\n );\n\n return decryptedData;\n } catch (e) {\n log.error('Failed to get user storage', e);\n return null;\n }\n}\n\n/**\n * User Storage Service - Set Storage Entry.\n *\n * @param data - data to store\n * @param opts - storage options\n */\nexport async function upsertUserStorage(\n data: string,\n opts: UserStorageOptions,\n): Promise<void> {\n const encryptedData = encryption.encryptString(data, opts.storageKey);\n const path = createEntryPath(opts.entryKey, opts.storageKey);\n const url = new URL(`${USER_STORAGE_ENDPOINT}${path}`);\n\n const res = await fetch(url.toString(), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${opts.bearerToken}`,\n },\n body: JSON.stringify({ data: encryptedData }),\n });\n\n if (!res.ok) {\n throw new Error('user-storage - unable to upsert data');\n }\n}\n"]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkXUPRRLBIjs = require('./chunk-XUPRRLBI.js');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkMBTBE4P5js = require('./chunk-MBTBE4P5.js');
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
var _chunkV46WVGWNjs = require('./chunk-V46WVGWN.js');
|
|
16
|
+
|
|
17
|
+
// src/sdk/authentication-jwt-bearer/flow-siwe.ts
|
|
18
|
+
var _siwe = require('siwe');
|
|
19
|
+
var _config, _options, _signer, _getAuthSession, getAuthSession_fn, _login, login_fn, _createSiWELoginRawMessage, createSiWELoginRawMessage_fn, _assertSigner, assertSigner_fn;
|
|
20
|
+
var SIWEJwtBearerAuth = class {
|
|
21
|
+
constructor(config, options) {
|
|
22
|
+
// convert expiresIn from seconds to milliseconds and use 90% of expiresIn
|
|
23
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _getAuthSession);
|
|
24
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _login);
|
|
25
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _createSiWELoginRawMessage);
|
|
26
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _assertSigner);
|
|
27
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _config, void 0);
|
|
28
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _options, void 0);
|
|
29
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _signer, void 0);
|
|
30
|
+
_chunkV46WVGWNjs.__privateSet.call(void 0, this, _config, config);
|
|
31
|
+
_chunkV46WVGWNjs.__privateSet.call(void 0, this, _options, options);
|
|
32
|
+
}
|
|
33
|
+
async getAccessToken() {
|
|
34
|
+
const session = await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getAuthSession, getAuthSession_fn).call(this);
|
|
35
|
+
if (session) {
|
|
36
|
+
return session.token.accessToken;
|
|
37
|
+
}
|
|
38
|
+
const loginResponse = await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _login, login_fn).call(this);
|
|
39
|
+
return loginResponse.token.accessToken;
|
|
40
|
+
}
|
|
41
|
+
async getUserProfile() {
|
|
42
|
+
const session = await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getAuthSession, getAuthSession_fn).call(this);
|
|
43
|
+
if (session) {
|
|
44
|
+
return session.profile;
|
|
45
|
+
}
|
|
46
|
+
const loginResponse = await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _login, login_fn).call(this);
|
|
47
|
+
return loginResponse.profile;
|
|
48
|
+
}
|
|
49
|
+
async getIdentifier() {
|
|
50
|
+
_chunkV46WVGWNjs.__privateMethod.call(void 0, this, _assertSigner, assertSigner_fn).call(this, _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer));
|
|
51
|
+
return _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer).address;
|
|
52
|
+
}
|
|
53
|
+
async signMessage(message) {
|
|
54
|
+
_chunkV46WVGWNjs.__privateMethod.call(void 0, this, _assertSigner, assertSigner_fn).call(this, _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer));
|
|
55
|
+
return await _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer).signMessage(message);
|
|
56
|
+
}
|
|
57
|
+
prepare(signer) {
|
|
58
|
+
_chunkV46WVGWNjs.__privateSet.call(void 0, this, _signer, signer);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
_config = new WeakMap();
|
|
62
|
+
_options = new WeakMap();
|
|
63
|
+
_signer = new WeakMap();
|
|
64
|
+
_getAuthSession = new WeakSet();
|
|
65
|
+
getAuthSession_fn = async function() {
|
|
66
|
+
const auth = await _chunkV46WVGWNjs.__privateGet.call(void 0, this, _options).storage.getLoginResponse();
|
|
67
|
+
if (!auth) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const currentTime = Date.now();
|
|
71
|
+
const sessionAge = currentTime - auth.token.obtainedAt;
|
|
72
|
+
const refreshThreshold = auth.token.expiresIn * 1e3 * 0.9;
|
|
73
|
+
if (sessionAge < refreshThreshold) {
|
|
74
|
+
return auth;
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
};
|
|
78
|
+
_login = new WeakSet();
|
|
79
|
+
login_fn = async function() {
|
|
80
|
+
_chunkV46WVGWNjs.__privateMethod.call(void 0, this, _assertSigner, assertSigner_fn).call(this, _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer));
|
|
81
|
+
const address = await this.getIdentifier();
|
|
82
|
+
const nonceRes = await _chunkXUPRRLBIjs.getNonce.call(void 0, address, _chunkV46WVGWNjs.__privateGet.call(void 0, this, _config).env);
|
|
83
|
+
const rawMessage = _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _createSiWELoginRawMessage, createSiWELoginRawMessage_fn).call(this, nonceRes.nonce);
|
|
84
|
+
const signature = await this.signMessage(rawMessage);
|
|
85
|
+
const authResponse = await _chunkXUPRRLBIjs.authenticate.call(void 0,
|
|
86
|
+
rawMessage,
|
|
87
|
+
signature,
|
|
88
|
+
_chunkV46WVGWNjs.__privateGet.call(void 0, this, _config).type,
|
|
89
|
+
_chunkV46WVGWNjs.__privateGet.call(void 0, this, _config).env
|
|
90
|
+
);
|
|
91
|
+
const tokenResponse = await _chunkXUPRRLBIjs.authorizeOIDC.call(void 0,
|
|
92
|
+
authResponse.token,
|
|
93
|
+
_chunkV46WVGWNjs.__privateGet.call(void 0, this, _config).env,
|
|
94
|
+
_chunkV46WVGWNjs.__privateGet.call(void 0, this, _config).platform
|
|
95
|
+
);
|
|
96
|
+
const result = {
|
|
97
|
+
profile: authResponse.profile,
|
|
98
|
+
token: tokenResponse
|
|
99
|
+
};
|
|
100
|
+
await _chunkV46WVGWNjs.__privateGet.call(void 0, this, _options).storage.setLoginResponse(result);
|
|
101
|
+
return result;
|
|
102
|
+
};
|
|
103
|
+
_createSiWELoginRawMessage = new WeakSet();
|
|
104
|
+
createSiWELoginRawMessage_fn = function(nonce) {
|
|
105
|
+
_chunkV46WVGWNjs.__privateMethod.call(void 0, this, _assertSigner, assertSigner_fn).call(this, _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer));
|
|
106
|
+
return new (0, _siwe.SiweMessage)({
|
|
107
|
+
domain: _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer)?.domain,
|
|
108
|
+
address: _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer)?.address,
|
|
109
|
+
uri: _chunkXUPRRLBIjs.SIWE_LOGIN_URL.call(void 0, _chunkV46WVGWNjs.__privateGet.call(void 0, this, _config).env),
|
|
110
|
+
version: "1",
|
|
111
|
+
chainId: _chunkV46WVGWNjs.__privateGet.call(void 0, this, _signer)?.chainId,
|
|
112
|
+
nonce,
|
|
113
|
+
issuedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
114
|
+
}).prepareMessage();
|
|
115
|
+
};
|
|
116
|
+
_assertSigner = new WeakSet();
|
|
117
|
+
assertSigner_fn = function(signer) {
|
|
118
|
+
if (!signer) {
|
|
119
|
+
throw new (0, _chunkMBTBE4P5js.ValidationError)(`you must call 'prepare()' before logging in`);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
exports.SIWEJwtBearerAuth = SIWEJwtBearerAuth;
|
|
126
|
+
//# sourceMappingURL=chunk-LHDVZNW5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sdk/authentication-jwt-bearer/flow-siwe.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,mBAAmB;AAA5B;AAiCO,IAAM,oBAAN,MAA6C;AAAA,EAOlD,YACE,QACA,SACA;AAwCF;AAAA,uBAAM;AAgBN,uBAAM;AAmCN;AAcA;AAlHA;AAEA;AAEA;AAME,uBAAK,SAAU;AACf,uBAAK,UAAW;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAkC;AACtC,UAAM,UAAU,MAAM,sBAAK,oCAAL;AACtB,QAAI,SAAS;AACX,aAAO,QAAQ,MAAM;AAAA,IACvB;AAEA,UAAM,gBAAgB,MAAM,sBAAK,kBAAL;AAC5B,WAAO,cAAc,MAAM;AAAA,EAC7B;AAAA,EAEA,MAAM,iBAAuC;AAC3C,UAAM,UAAU,MAAM,sBAAK,oCAAL;AACtB,QAAI,SAAS;AACX,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,gBAAgB,MAAM,sBAAK,kBAAL;AAC5B,WAAO,cAAc;AAAA,EACvB;AAAA,EAEA,MAAM,gBAAiC;AACrC,0BAAK,gCAAL,WAAmB,mBAAK;AACxB,WAAO,mBAAK,SAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,YAAY,SAAkC;AAClD,0BAAK,gCAAL,WAAmB,mBAAK;AACxB,WAAO,MAAM,mBAAK,SAAQ,YAAY,OAAO;AAAA,EAC/C;AAAA,EAEA,QAAQ,QAAmC;AACzC,uBAAK,SAAU;AAAA,EACjB;AA2EF;AAzHE;AAEA;AAEA;AA6CM;AAAA,oBAAe,iBAAkC;AACrD,QAAM,OAAO,MAAM,mBAAK,UAAS,QAAQ,iBAAiB;AAC1D,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,IAAI;AAC7B,QAAM,aAAa,cAAc,KAAK,MAAM;AAC5C,QAAM,mBAAmB,KAAK,MAAM,YAAY,MAAO;AAEvD,MAAI,aAAa,kBAAkB;AACjC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEM;AAAA,WAAM,iBAA2B;AACrC,wBAAK,gCAAL,WAAmB,mBAAK;AAGxB,QAAM,UAAU,MAAM,KAAK,cAAc;AACzC,QAAM,WAAW,MAAM,SAAS,SAAS,mBAAK,SAAQ,GAAG;AACzD,QAAM,aAAa,sBAAK,0DAAL,WAAgC,SAAS;AAC5D,QAAM,YAAY,MAAM,KAAK,YAAY,UAAU;AAGnD,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACA;AAAA,IACA,mBAAK,SAAQ;AAAA,IACb,mBAAK,SAAQ;AAAA,EACf;AAGA,QAAM,gBAAgB,MAAM;AAAA,IAC1B,aAAa;AAAA,IACb,mBAAK,SAAQ;AAAA,IACb,mBAAK,SAAQ;AAAA,EACf;AAGA,QAAM,SAAwB;AAAA,IAC5B,SAAS,aAAa;AAAA,IACtB,OAAO;AAAA,EACT;AAEA,QAAM,mBAAK,UAAS,QAAQ,iBAAiB,MAAM;AAEnD,SAAO;AACT;AAEA;AAAA,+BAA0B,SAAC,OAAuB;AAChD,wBAAK,gCAAL,WAAmB,mBAAK;AAExB,SAAO,IAAI,YAAY;AAAA,IACrB,QAAQ,mBAAK,UAAS;AAAA,IACtB,SAAS,mBAAK,UAAS;AAAA,IACvB,KAAK,eAAe,mBAAK,SAAQ,GAAG;AAAA,IACpC,SAAS;AAAA,IACT,SAAS,mBAAK,UAAS;AAAA,IACvB;AAAA,IACA,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,EACnC,CAAC,EAAE,eAAe;AACpB;AAEA;AAAA,kBAAa,SACX,QAC6C;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,gBAAgB,6CAA6C;AAAA,EACzE;AACF","sourcesContent":["import { SiweMessage } from 'siwe';\n\nimport { ValidationError } from '../errors';\nimport {\n SIWE_LOGIN_URL,\n authenticate,\n authorizeOIDC,\n getNonce,\n} from './services';\nimport type {\n AuthConfig,\n AuthStorageOptions,\n AuthType,\n IBaseAuth,\n LoginResponse,\n UserProfile,\n} from './types';\n\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype JwtBearerAuth_SIWE_Options = {\n storage: AuthStorageOptions;\n};\n\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype JwtBearerAuth_SIWE_Signer = {\n address: string;\n chainId: number;\n signMessage: (message: string) => Promise<string>;\n domain: string;\n};\n\nexport class SIWEJwtBearerAuth implements IBaseAuth {\n #config: AuthConfig;\n\n #options: JwtBearerAuth_SIWE_Options;\n\n #signer: JwtBearerAuth_SIWE_Signer | undefined;\n\n constructor(\n config: AuthConfig & { type: AuthType.SiWE },\n options: JwtBearerAuth_SIWE_Options,\n ) {\n this.#config = config;\n this.#options = options;\n }\n\n async getAccessToken(): Promise<string> {\n const session = await this.#getAuthSession();\n if (session) {\n return session.token.accessToken;\n }\n\n const loginResponse = await this.#login();\n return loginResponse.token.accessToken;\n }\n\n async getUserProfile(): Promise<UserProfile> {\n const session = await this.#getAuthSession();\n if (session) {\n return session.profile;\n }\n\n const loginResponse = await this.#login();\n return loginResponse.profile;\n }\n\n async getIdentifier(): Promise<string> {\n this.#assertSigner(this.#signer);\n return this.#signer.address;\n }\n\n async signMessage(message: string): Promise<string> {\n this.#assertSigner(this.#signer);\n return await this.#signer.signMessage(message);\n }\n\n prepare(signer: JwtBearerAuth_SIWE_Signer) {\n this.#signer = signer;\n }\n\n // convert expiresIn from seconds to milliseconds and use 90% of expiresIn\n async #getAuthSession(): Promise<LoginResponse | null> {\n const auth = await this.#options.storage.getLoginResponse();\n if (!auth) {\n return null;\n }\n\n const currentTime = Date.now();\n const sessionAge = currentTime - auth.token.obtainedAt;\n const refreshThreshold = auth.token.expiresIn * 1000 * 0.9;\n\n if (sessionAge < refreshThreshold) {\n return auth;\n }\n return null;\n }\n\n async #login(): Promise<LoginResponse> {\n this.#assertSigner(this.#signer);\n\n // Nonce\n const address = await this.getIdentifier();\n const nonceRes = await getNonce(address, this.#config.env);\n const rawMessage = this.#createSiWELoginRawMessage(nonceRes.nonce);\n const signature = await this.signMessage(rawMessage);\n\n // Authenticate\n const authResponse = await authenticate(\n rawMessage,\n signature,\n this.#config.type,\n this.#config.env,\n );\n\n // Authorize\n const tokenResponse = await authorizeOIDC(\n authResponse.token,\n this.#config.env,\n this.#config.platform,\n );\n\n // Save\n const result: LoginResponse = {\n profile: authResponse.profile,\n token: tokenResponse,\n };\n\n await this.#options.storage.setLoginResponse(result);\n\n return result;\n }\n\n #createSiWELoginRawMessage(nonce: string): string {\n this.#assertSigner(this.#signer);\n\n return new SiweMessage({\n domain: this.#signer?.domain,\n address: this.#signer?.address,\n uri: SIWE_LOGIN_URL(this.#config.env),\n version: '1',\n chainId: this.#signer?.chainId,\n nonce,\n issuedAt: new Date().toISOString(),\n }).prepareMessage();\n }\n\n #assertSigner(\n signer?: JwtBearerAuth_SIWE_Signer,\n ): asserts signer is JwtBearerAuth_SIWE_Signer {\n if (!signer) {\n throw new ValidationError(`you must call 'prepare()' before logging in`);\n }\n }\n}\n"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
authenticate,
|
|
3
3
|
authorizeOIDC,
|
|
4
4
|
getNonce
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-7VMXBDXN.mjs";
|
|
6
6
|
import {
|
|
7
7
|
getMetaMaskProviderEIP6963
|
|
8
8
|
} from "./chunk-5XSXZTED.mjs";
|
|
@@ -11,16 +11,13 @@ import {
|
|
|
11
11
|
} from "./chunk-5EBUFNAN.mjs";
|
|
12
12
|
import {
|
|
13
13
|
ValidationError
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import {
|
|
16
|
-
SESSION_LIFETIME_MS
|
|
17
|
-
} from "./chunk-KKRIOEXD.mjs";
|
|
14
|
+
} from "./chunk-TFFQFIJV.mjs";
|
|
18
15
|
import {
|
|
19
16
|
__privateAdd,
|
|
20
17
|
__privateGet,
|
|
21
18
|
__privateMethod,
|
|
22
19
|
__privateSet
|
|
23
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-26CCETCM.mjs";
|
|
24
21
|
|
|
25
22
|
// src/sdk/authentication-jwt-bearer/flow-srp.ts
|
|
26
23
|
var defaultEIP6963SigningOptions = {
|
|
@@ -46,6 +43,7 @@ var defaultEIP6963SigningOptions = {
|
|
|
46
43
|
var _config, _options, _getAuthSession, getAuthSession_fn, _login, login_fn, _createSrpLoginRawMessage, createSrpLoginRawMessage_fn;
|
|
47
44
|
var SRPJwtBearerAuth = class {
|
|
48
45
|
constructor(config, options) {
|
|
46
|
+
// convert expiresIn from seconds to milliseconds and use 90% of expiresIn
|
|
49
47
|
__privateAdd(this, _getAuthSession);
|
|
50
48
|
__privateAdd(this, _login);
|
|
51
49
|
__privateAdd(this, _createSrpLoginRawMessage);
|
|
@@ -90,7 +88,8 @@ getAuthSession_fn = async function() {
|
|
|
90
88
|
}
|
|
91
89
|
const currentTime = Date.now();
|
|
92
90
|
const sessionAge = currentTime - auth.token.obtainedAt;
|
|
93
|
-
|
|
91
|
+
const refreshThreshold = auth.token.expiresIn * 1e3 * 0.9;
|
|
92
|
+
if (sessionAge < refreshThreshold) {
|
|
94
93
|
return auth;
|
|
95
94
|
}
|
|
96
95
|
return null;
|
|
@@ -110,7 +109,8 @@ login_fn = async function() {
|
|
|
110
109
|
);
|
|
111
110
|
const tokenResponse = await authorizeOIDC(
|
|
112
111
|
authResponse.token,
|
|
113
|
-
__privateGet(this, _config).env
|
|
112
|
+
__privateGet(this, _config).env,
|
|
113
|
+
__privateGet(this, _config).platform
|
|
114
114
|
);
|
|
115
115
|
const result = {
|
|
116
116
|
profile: authResponse.profile,
|
|
@@ -127,4 +127,4 @@ createSrpLoginRawMessage_fn = function(nonce, publicKey) {
|
|
|
127
127
|
export {
|
|
128
128
|
SRPJwtBearerAuth
|
|
129
129
|
};
|
|
130
|
-
//# sourceMappingURL=chunk-
|
|
130
|
+
//# sourceMappingURL=chunk-LN2BY2QF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sdk/authentication-jwt-bearer/flow-srp.ts"],"sourcesContent":["import { ValidationError } from '../errors';\nimport { getMetaMaskProviderEIP6963 } from '../utils/eip-6963-metamask-provider';\nimport { MESSAGE_SIGNING_SNAP } from '../utils/messaging-signing-snap-requests';\nimport { authenticate, authorizeOIDC, getNonce } from './services';\nimport type {\n AuthConfig,\n AuthSigningOptions,\n AuthStorageOptions,\n AuthType,\n IBaseAuth,\n LoginResponse,\n UserProfile,\n} from './types';\n\n// TODO: Either fix this lint violation or explain why it's necessary to ignore.\n// eslint-disable-next-line @typescript-eslint/naming-convention\ntype JwtBearerAuth_SRP_Options = {\n storage: AuthStorageOptions;\n signing?: AuthSigningOptions;\n};\n\nconst defaultEIP6963SigningOptions: AuthSigningOptions = {\n getIdentifier: async (): Promise<string> => {\n const provider = await getMetaMaskProviderEIP6963();\n if (!provider) {\n throw new ValidationError('No MetaMask wallet connected');\n }\n return await MESSAGE_SIGNING_SNAP.getPublicKey(provider);\n },\n signMessage: async (message: string): Promise<string> => {\n const provider = await getMetaMaskProviderEIP6963();\n if (!provider) {\n throw new ValidationError('No MetaMask wallet connected');\n }\n if (!message.startsWith('metamask:')) {\n throw new ValidationError('message must start with \"metamask:\"');\n }\n const formattedMessage = message as `metamask:${string}`;\n return await MESSAGE_SIGNING_SNAP.signMessage(provider, formattedMessage);\n },\n};\n\nexport class SRPJwtBearerAuth implements IBaseAuth {\n #config: AuthConfig;\n\n #options: Required<JwtBearerAuth_SRP_Options>;\n\n constructor(\n config: AuthConfig & { type: AuthType.SRP },\n options: JwtBearerAuth_SRP_Options,\n ) {\n this.#config = config;\n this.#options = {\n storage: options.storage,\n signing: options.signing ?? defaultEIP6963SigningOptions,\n };\n }\n\n async getAccessToken(): Promise<string> {\n const session = await this.#getAuthSession();\n if (session) {\n return session.token.accessToken;\n }\n\n const loginResponse = await this.#login();\n return loginResponse.token.accessToken;\n }\n\n async getUserProfile(): Promise<UserProfile> {\n const session = await this.#getAuthSession();\n if (session) {\n return session.profile;\n }\n\n const loginResponse = await this.#login();\n return loginResponse.profile;\n }\n\n async getIdentifier(): Promise<string> {\n return await this.#options.signing.getIdentifier();\n }\n\n async signMessage(message: string): Promise<string> {\n return await this.#options.signing.signMessage(message);\n }\n\n // convert expiresIn from seconds to milliseconds and use 90% of expiresIn\n async #getAuthSession(): Promise<LoginResponse | null> {\n const auth = await this.#options.storage.getLoginResponse();\n if (!auth) {\n return null;\n }\n\n const currentTime = Date.now();\n const sessionAge = currentTime - auth.token.obtainedAt;\n const refreshThreshold = auth.token.expiresIn * 1000 * 0.9;\n\n if (sessionAge < refreshThreshold) {\n return auth;\n }\n return null;\n }\n\n async #login(): Promise<LoginResponse> {\n // Nonce\n const address = await this.getIdentifier();\n const nonceRes = await getNonce(address, this.#config.env);\n const publicKey = await this.#options.signing.getIdentifier();\n const rawMessage = this.#createSrpLoginRawMessage(\n nonceRes.nonce,\n publicKey,\n );\n const signature = await this.signMessage(rawMessage);\n\n // Authenticate\n const authResponse = await authenticate(\n rawMessage,\n signature,\n this.#config.type,\n this.#config.env,\n );\n\n // Authorize\n const tokenResponse = await authorizeOIDC(\n authResponse.token,\n this.#config.env,\n this.#config.platform,\n );\n\n // Save\n const result: LoginResponse = {\n profile: authResponse.profile,\n token: tokenResponse,\n };\n\n await this.#options.storage.setLoginResponse(result);\n\n return result;\n }\n\n #createSrpLoginRawMessage(\n nonce: string,\n publicKey: string,\n ): `metamask:${string}:${string}` {\n return `metamask:${nonce}:${publicKey}` as const;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,44 +1,46 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkGLDUXN2Tjs = require('./chunk-GLDUXN2T.js');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunk4OMJ7A6Ajs = require('./chunk-4OMJ7A6A.js');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
var
|
|
12
|
+
var _chunkMBTBE4P5js = require('./chunk-MBTBE4P5.js');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkV46WVGWNjs = require('./chunk-V46WVGWN.js');
|
|
17
17
|
|
|
18
18
|
// src/sdk/user-storage.ts
|
|
19
|
-
var STORAGE_URL = (env, feature, entry) => `${
|
|
19
|
+
var STORAGE_URL = (env, feature, entry) => `${_chunk4OMJ7A6Ajs.getEnvUrls.call(void 0, env).userStorageApiUrl}/api/v1/userstorage/${feature}/${entry}`;
|
|
20
20
|
var _upsertUserStorage, upsertUserStorage_fn, _getUserStorage, getUserStorage_fn, _createEntryKey, createEntryKey_fn, _getAuthorizationHeader, getAuthorizationHeader_fn;
|
|
21
21
|
var UserStorage = class {
|
|
22
22
|
constructor(config, options) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _upsertUserStorage);
|
|
24
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _getUserStorage);
|
|
25
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _createEntryKey);
|
|
26
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
28
|
+
_chunkV46WVGWNjs.__privateAdd.call(void 0, this, _getAuthorizationHeader);
|
|
27
29
|
this.env = config.env;
|
|
28
30
|
this.config = config;
|
|
29
31
|
this.options = options;
|
|
30
32
|
}
|
|
31
33
|
async setItem(feature, key, value) {
|
|
32
34
|
if (!feature.trim() || !key.trim()) {
|
|
33
|
-
throw new (0,
|
|
35
|
+
throw new (0, _chunkMBTBE4P5js.ValidationError)("feature or key cannot be empty strings");
|
|
34
36
|
}
|
|
35
|
-
await
|
|
37
|
+
await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _upsertUserStorage, upsertUserStorage_fn).call(this, feature, key, value);
|
|
36
38
|
}
|
|
37
39
|
async getItem(feature, key) {
|
|
38
40
|
if (!feature.trim() || !key.trim()) {
|
|
39
|
-
throw new (0,
|
|
41
|
+
throw new (0, _chunkMBTBE4P5js.ValidationError)("feature or key cannot be empty strings");
|
|
40
42
|
}
|
|
41
|
-
return
|
|
43
|
+
return _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getUserStorage, getUserStorage_fn).call(this, feature, key);
|
|
42
44
|
}
|
|
43
45
|
async getStorageKey() {
|
|
44
46
|
const storageKey = await this.options.storage?.getStorageKey();
|
|
@@ -49,7 +51,7 @@ var UserStorage = class {
|
|
|
49
51
|
const storageKeySignature = await this.config.auth.signMessage(
|
|
50
52
|
`metamask:${userProfile.profileId}`
|
|
51
53
|
);
|
|
52
|
-
const hashedStorageKeySignature =
|
|
54
|
+
const hashedStorageKeySignature = _chunkGLDUXN2Tjs.createSHA256Hash.call(void 0, storageKeySignature);
|
|
53
55
|
await this.options.storage?.setStorageKey(hashedStorageKeySignature);
|
|
54
56
|
return hashedStorageKeySignature;
|
|
55
57
|
}
|
|
@@ -57,11 +59,11 @@ var UserStorage = class {
|
|
|
57
59
|
_upsertUserStorage = new WeakSet();
|
|
58
60
|
upsertUserStorage_fn = async function(feature, key, data) {
|
|
59
61
|
try {
|
|
60
|
-
const headers = await
|
|
62
|
+
const headers = await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getAuthorizationHeader, getAuthorizationHeader_fn).call(this);
|
|
61
63
|
const storageKey = await this.getStorageKey();
|
|
62
|
-
const encryptedData =
|
|
64
|
+
const encryptedData = _chunkGLDUXN2Tjs.encryption_default.encryptString(data, storageKey);
|
|
63
65
|
const url = new URL(
|
|
64
|
-
STORAGE_URL(this.env, feature,
|
|
66
|
+
STORAGE_URL(this.env, feature, _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _createEntryKey, createEntryKey_fn).call(this, key, storageKey))
|
|
65
67
|
);
|
|
66
68
|
const response = await fetch(url.toString(), {
|
|
67
69
|
method: "PUT",
|
|
@@ -82,7 +84,7 @@ upsertUserStorage_fn = async function(feature, key, data) {
|
|
|
82
84
|
}
|
|
83
85
|
} catch (e) {
|
|
84
86
|
const errorMessage = e instanceof Error ? e.message : JSON.stringify(e ?? "");
|
|
85
|
-
throw new (0,
|
|
87
|
+
throw new (0, _chunkMBTBE4P5js.UserStorageError)(
|
|
86
88
|
`failed to upsert user storage for feature '${feature}' and key '${key}'. ${errorMessage}`
|
|
87
89
|
);
|
|
88
90
|
}
|
|
@@ -90,10 +92,10 @@ upsertUserStorage_fn = async function(feature, key, data) {
|
|
|
90
92
|
_getUserStorage = new WeakSet();
|
|
91
93
|
getUserStorage_fn = async function(feature, key) {
|
|
92
94
|
try {
|
|
93
|
-
const headers = await
|
|
95
|
+
const headers = await _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _getAuthorizationHeader, getAuthorizationHeader_fn).call(this);
|
|
94
96
|
const storageKey = await this.getStorageKey();
|
|
95
97
|
const url = new URL(
|
|
96
|
-
STORAGE_URL(this.env, feature,
|
|
98
|
+
STORAGE_URL(this.env, feature, _chunkV46WVGWNjs.__privateMethod.call(void 0, this, _createEntryKey, createEntryKey_fn).call(this, key, storageKey))
|
|
97
99
|
);
|
|
98
100
|
const response = await fetch(url.toString(), {
|
|
99
101
|
headers: {
|
|
@@ -102,7 +104,7 @@ getUserStorage_fn = async function(feature, key) {
|
|
|
102
104
|
}
|
|
103
105
|
});
|
|
104
106
|
if (response.status === 404) {
|
|
105
|
-
throw new (0,
|
|
107
|
+
throw new (0, _chunkMBTBE4P5js.NotFoundError)(
|
|
106
108
|
`feature/key set not found for feature '${feature}' and key '${key}'.`
|
|
107
109
|
);
|
|
108
110
|
}
|
|
@@ -113,20 +115,20 @@ getUserStorage_fn = async function(feature, key) {
|
|
|
113
115
|
);
|
|
114
116
|
}
|
|
115
117
|
const { Data: encryptedData } = await response.json();
|
|
116
|
-
return
|
|
118
|
+
return _chunkGLDUXN2Tjs.encryption_default.decryptString(encryptedData, storageKey);
|
|
117
119
|
} catch (e) {
|
|
118
|
-
if (e instanceof
|
|
120
|
+
if (e instanceof _chunkMBTBE4P5js.NotFoundError) {
|
|
119
121
|
throw e;
|
|
120
122
|
}
|
|
121
123
|
const errorMessage = e instanceof Error ? e.message : JSON.stringify(e ?? "");
|
|
122
|
-
throw new (0,
|
|
124
|
+
throw new (0, _chunkMBTBE4P5js.UserStorageError)(
|
|
123
125
|
`failed to get user storage for feature '${feature}' and key '${key}'. ${errorMessage}`
|
|
124
126
|
);
|
|
125
127
|
}
|
|
126
128
|
};
|
|
127
129
|
_createEntryKey = new WeakSet();
|
|
128
130
|
createEntryKey_fn = function(key, storageKey) {
|
|
129
|
-
const hashedKey =
|
|
131
|
+
const hashedKey = _chunkGLDUXN2Tjs.createSHA256Hash.call(void 0, key + storageKey);
|
|
130
132
|
return hashedKey;
|
|
131
133
|
};
|
|
132
134
|
_getAuthorizationHeader = new WeakSet();
|
|
@@ -139,4 +141,4 @@ getAuthorizationHeader_fn = async function() {
|
|
|
139
141
|
|
|
140
142
|
|
|
141
143
|
exports.STORAGE_URL = STORAGE_URL; exports.UserStorage = UserStorage;
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
144
|
+
//# sourceMappingURL=chunk-LUKNP4HM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/sdk/user-storage.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IBaseAuth } from './authentication-jwt-bearer/types';\nimport encryption, { createSHA256Hash } from './encryption';\nimport type { Env } from './env';\nimport { getEnvUrls } from './env';\nimport { NotFoundError, UserStorageError, ValidationError } from './errors';\n\nexport const STORAGE_URL = (env: Env, feature: string, entry: string) =>\n `${getEnvUrls(env).userStorageApiUrl}/api/v1/userstorage/${feature}/${entry}`;\n\nexport type UserStorageConfig = {\n env: Env;\n auth: Pick<IBaseAuth, 'getAccessToken' | 'getUserProfile' | 'signMessage'>;\n};\n\nexport type StorageOptions = {\n getStorageKey: () => Promise<string | null>;\n setStorageKey: (val: string) => Promise<void>;\n};\n\nexport type UserStorageOptions = {\n storage?: StorageOptions;\n};\n\ntype ErrorMessage = {\n message: string;\n error: string;\n};\n\nexport class UserStorage {\n protected config: UserStorageConfig;\n\n protected options: UserStorageOptions;\n\n protected env: Env;\n\n constructor(config: UserStorageConfig, options: UserStorageOptions) {\n this.env = config.env;\n this.config = config;\n this.options = options;\n }\n\n async setItem(feature: string, key: string, value: string): Promise<void> {\n if (!feature.trim() || !key.trim()) {\n throw new ValidationError('feature or key cannot be empty strings');\n }\n await this.#upsertUserStorage(feature, key, value);\n }\n\n async getItem(feature: string, key: string): Promise<string> {\n if (!feature.trim() || !key.trim()) {\n throw new ValidationError('feature or key cannot be empty strings');\n }\n return this.#getUserStorage(feature, key);\n }\n\n async getStorageKey(): Promise<string> {\n const storageKey = await this.options.storage?.getStorageKey();\n if (storageKey) {\n return storageKey;\n }\n\n const userProfile = await this.config.auth.getUserProfile();\n const storageKeySignature = await this.config.auth.signMessage(\n `metamask:${userProfile.profileId}`,\n );\n const hashedStorageKeySignature = createSHA256Hash(storageKeySignature);\n await this.options.storage?.setStorageKey(hashedStorageKeySignature);\n return hashedStorageKeySignature;\n }\n\n async #upsertUserStorage(\n feature: string,\n key: string,\n data: string,\n ): Promise<void> {\n try {\n const headers = await this.#getAuthorizationHeader();\n const storageKey = await this.getStorageKey();\n const encryptedData = encryption.encryptString(data, storageKey);\n const url = new URL(\n STORAGE_URL(this.env, feature, this.#createEntryKey(key, storageKey)),\n );\n\n const response = await fetch(url.toString(), {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({ data: encryptedData }),\n });\n\n if (!response.ok) {\n const responseBody: ErrorMessage = await response.json().catch(() => ({\n message: 'unknown',\n error: 'unknown',\n }));\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n } catch (e) {\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n throw new UserStorageError(\n `failed to upsert user storage for feature '${feature}' and key '${key}'. ${errorMessage}`,\n );\n }\n }\n\n async #getUserStorage(feature: string, key: string): Promise<string> {\n try {\n const headers = await this.#getAuthorizationHeader();\n const storageKey = await this.getStorageKey();\n const url = new URL(\n STORAGE_URL(this.env, feature, this.#createEntryKey(key, storageKey)),\n );\n\n const response = await fetch(url.toString(), {\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n });\n\n if (response.status === 404) {\n throw new NotFoundError(\n `feature/key set not found for feature '${feature}' and key '${key}'.`,\n );\n }\n\n if (!response.ok) {\n const responseBody = (await response.json()) as ErrorMessage;\n throw new Error(\n `HTTP error message: ${responseBody.message}, error: ${responseBody.error}`,\n );\n }\n\n const { Data: encryptedData } = await response.json();\n return encryption.decryptString(encryptedData, storageKey);\n } catch (e) {\n if (e instanceof NotFoundError) {\n throw e;\n }\n\n /* istanbul ignore next */\n const errorMessage =\n e instanceof Error ? e.message : JSON.stringify(e ?? '');\n\n throw new UserStorageError(\n `failed to get user storage for feature '${feature}' and key '${key}'. ${errorMessage}`,\n );\n }\n }\n\n #createEntryKey(key: string, storageKey: string): string {\n const hashedKey = createSHA256Hash(key + storageKey);\n return hashedKey;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n async #getAuthorizationHeader(): Promise<{ Authorization: string }> {\n const accessToken = await this.config.auth.getAccessToken();\n return { Authorization: `Bearer ${accessToken}` };\n }\n}\n"]}
|