@docknetwork/wallet-sdk-wasm 1.5.14 → 1.7.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/generate-docs.js +49 -0
- package/jsdoc.conf.json +29 -6
- package/lib/index.js +8 -1
- package/lib/index.mjs +8 -1
- package/lib/rpc-server.js +10 -1
- package/lib/rpc-server.mjs +10 -1
- package/lib/services/blockchain/cached-did-resolver.js +113 -0
- package/lib/services/blockchain/cached-did-resolver.mjs +109 -0
- package/lib/services/blockchain/index.js +11 -0
- package/lib/services/blockchain/index.mjs +11 -0
- package/lib/services/blockchain/service-rpc.js +12 -0
- package/lib/services/blockchain/service-rpc.mjs +12 -0
- package/lib/services/blockchain/service.js +140 -11
- package/lib/services/blockchain/service.mjs +140 -11
- package/lib/services/credential/bbs-revocation.js +11 -0
- package/lib/services/credential/bbs-revocation.mjs +11 -0
- package/lib/services/credential/config.js +4 -1
- package/lib/services/credential/config.mjs +4 -1
- package/lib/services/credential/index.js +14 -0
- package/lib/services/credential/index.mjs +14 -0
- package/lib/services/credential/sd-jwt.js +214 -0
- package/lib/services/credential/sd-jwt.mjs +200 -0
- package/lib/services/credential/service-rpc.js +9 -0
- package/lib/services/credential/service-rpc.mjs +9 -0
- package/lib/services/credential/service.js +324 -7
- package/lib/services/credential/service.mjs +324 -7
- package/lib/services/edv/service.js +145 -1
- package/lib/services/edv/service.mjs +145 -1
- package/lib/services/index.js +13 -0
- package/lib/services/index.mjs +13 -0
- package/lib/services/relay-service/service.js +124 -1
- package/lib/services/relay-service/service.mjs +124 -1
- package/lib/services/rpc-service-client.js +0 -3
- package/lib/services/rpc-service-client.mjs +0 -3
- package/lib/services/storage/index.js +19 -2
- package/lib/services/storage/index.mjs +24 -1
- package/lib/services/storage/service-rpc.js +7 -3
- package/lib/services/storage/service-rpc.mjs +7 -3
- package/lib/services/storage/service.js +4 -0
- package/lib/services/storage/service.mjs +4 -0
- package/lib/setup-nodejs.js +8 -1
- package/lib/setup-nodejs.mjs +8 -1
- package/lib/setup-tests.js +8 -1
- package/lib/setup-tests.mjs +8 -1
- package/lib/src/services/blockchain/cached-did-resolver.d.ts +28 -0
- package/lib/src/services/blockchain/cached-did-resolver.d.ts.map +1 -0
- package/lib/src/services/blockchain/cached-did-resolver.test.d.ts +2 -0
- package/lib/src/services/blockchain/cached-did-resolver.test.d.ts.map +1 -0
- package/lib/src/services/blockchain/service.d.ts +114 -17
- package/lib/src/services/blockchain/service.d.ts.map +1 -1
- package/lib/src/services/credential/config.d.ts.map +1 -1
- package/lib/src/services/credential/index.d.ts +3 -0
- package/lib/src/services/credential/index.d.ts.map +1 -1
- package/lib/src/services/credential/sd-jwt.test.d.ts +2 -0
- package/lib/src/services/credential/sd-jwt.test.d.ts.map +1 -0
- package/lib/src/services/credential/service.d.ts +274 -4
- package/lib/src/services/credential/service.d.ts.map +1 -1
- package/lib/src/services/edv/service.d.ts +151 -1
- package/lib/src/services/edv/service.d.ts.map +1 -1
- package/lib/src/services/relay-service/service.d.ts +129 -1
- package/lib/src/services/relay-service/service.d.ts.map +1 -1
- package/lib/src/services/rpc-service-client.d.ts +2 -2
- package/lib/src/services/rpc-service-client.d.ts.map +1 -1
- package/lib/src/services/storage/index.d.ts +1 -1
- package/lib/src/services/storage/index.d.ts.map +1 -1
- package/lib/src/services/storage/service-rpc.d.ts +9 -0
- package/lib/src/services/storage/service-rpc.d.ts.map +1 -0
- package/lib/src/services/storage/service.d.ts +1 -0
- package/lib/src/services/storage/service.d.ts.map +1 -1
- package/lib/src/services/util-crypto/service.d.ts +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/wallet/rpc-storage-interface.js +13 -3
- package/lib/wallet/rpc-storage-interface.mjs +11 -1
- package/lib/wallet/rpc-storage-wallet.js +10 -0
- package/lib/wallet/rpc-storage-wallet.mjs +10 -0
- package/package.json +13 -8
- package/src/services/blockchain/cached-did-resolver.test.ts +288 -0
- package/src/services/blockchain/cached-did-resolver.ts +126 -0
- package/src/services/blockchain/service-rpc.js +12 -0
- package/src/services/blockchain/service.ts +142 -11
- package/src/services/credential/config.ts +7 -1
- package/src/services/credential/sd-jwt.test.ts +718 -0
- package/src/services/credential/sd-jwt.ts +231 -0
- package/src/services/credential/service-rpc.js +9 -0
- package/src/services/credential/service.ts +328 -7
- package/src/services/edv/service.ts +153 -1
- package/src/services/relay-service/service.ts +130 -1
- package/src/services/rpc-service-client.js +0 -3
- package/src/services/storage/index.js +15 -1
- package/src/services/storage/service-rpc.js +7 -3
- package/src/services/storage/service.ts +5 -0
package/generate-docs.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const jsdoc2md = require('jsdoc-to-markdown');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
|
|
7
|
+
async function generateMarkdownDocs() {
|
|
8
|
+
console.log('Generating markdown documentation...');
|
|
9
|
+
|
|
10
|
+
const outputDir = path.resolve('../../docs/api');
|
|
11
|
+
if (!fs.existsSync(outputDir)) {
|
|
12
|
+
fs.mkdirSync(outputDir, {recursive: true});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const outputFile = path.join(outputDir, 'wasm.md');
|
|
16
|
+
|
|
17
|
+
// Get all source files - focusing on main service modules
|
|
18
|
+
const sourceFiles = [
|
|
19
|
+
'./src/services/blockchain/*.js',
|
|
20
|
+
'./src/services/credential/*.js',
|
|
21
|
+
'./src/services/dids/*.js',
|
|
22
|
+
'./src/services/relay-service/*.js',
|
|
23
|
+
'./src/services/wallet/*.js',
|
|
24
|
+
'./src/services/pex/*.js',
|
|
25
|
+
'./src/services/util-crypto/*.js',
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
console.log('Processing source files from packages/wasm...');
|
|
29
|
+
|
|
30
|
+
const output = await jsdoc2md.render({
|
|
31
|
+
files: sourceFiles,
|
|
32
|
+
configure: './jsdoc.conf.json',
|
|
33
|
+
'no-cache': true,
|
|
34
|
+
template: `# Wallet SDK WASM API Documentation
|
|
35
|
+
|
|
36
|
+
{{>main}}
|
|
37
|
+
`,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Ensure we have substantial content
|
|
41
|
+
fs.writeFileSync(outputFile, output);
|
|
42
|
+
console.log(`✅ API documentation generated successfully: ${outputFile}`);
|
|
43
|
+
console.log(`📄 Generated ${output.length} characters of documentation`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
generateMarkdownDocs().catch(error => {
|
|
47
|
+
console.error('Error generating documentation:', error);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
});
|
package/jsdoc.conf.json
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
"
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
"source": {
|
|
3
|
+
"includePattern": ".+\\.(js|ts)$",
|
|
4
|
+
"exclude": ["node_modules", "lib", "fixtures", "test", "__tests__"]
|
|
5
|
+
},
|
|
6
|
+
"opts": {
|
|
7
|
+
"destination": "./jsdocs/",
|
|
8
|
+
"recurse": true
|
|
9
|
+
},
|
|
10
|
+
"plugins": [
|
|
11
|
+
"plugins/markdown",
|
|
12
|
+
"jsdoc-babel"
|
|
13
|
+
],
|
|
14
|
+
"babel": {
|
|
15
|
+
"extensions": ["js", "ts"],
|
|
16
|
+
"ignore": ["**/*.(test|spec).(js|ts)"],
|
|
17
|
+
"babelrc": false,
|
|
18
|
+
"presets": [
|
|
19
|
+
["@babel/preset-env", { "targets": { "node": "current" } }],
|
|
20
|
+
["@babel/preset-typescript", { "allExtensions": true }]
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
"templates": {
|
|
24
|
+
"cleverLinks": false,
|
|
25
|
+
"monospaceLinks": false
|
|
26
|
+
},
|
|
27
|
+
"tags": {
|
|
28
|
+
"allowUnknownTags": true,
|
|
29
|
+
"dictionaries": ["jsdoc", "closure"]
|
|
30
|
+
}
|
|
8
31
|
}
|
package/lib/index.js
CHANGED
|
@@ -26,6 +26,11 @@ require('@scure/bip39');
|
|
|
26
26
|
require('@scure/bip39/wordlists/english');
|
|
27
27
|
require('./services/util-crypto/configs.js');
|
|
28
28
|
require('@docknetwork/credential-sdk/types');
|
|
29
|
+
require('./services/blockchain/cached-did-resolver.js');
|
|
30
|
+
require('./services/storage/index.js');
|
|
31
|
+
require('./services/storage/service.js');
|
|
32
|
+
require('./services/storage/service-rpc.js');
|
|
33
|
+
require('./services/rpc-service-client.js');
|
|
29
34
|
require('./services/wallet/service.js');
|
|
30
35
|
require('./wallet/memory-storage-wallet.js');
|
|
31
36
|
require('@docknetwork/universal-wallet/storage-wallet');
|
|
@@ -34,7 +39,6 @@ require('@docknetwork/universal-wallet/storage/storage-interface');
|
|
|
34
39
|
require('./services/wallet/configs.js');
|
|
35
40
|
require('./core/validation.js');
|
|
36
41
|
require('./types.js');
|
|
37
|
-
require('./services/storage/service.js');
|
|
38
42
|
require('./services/dids/service.js');
|
|
39
43
|
require('@docknetwork/wallet-sdk-dids/lib');
|
|
40
44
|
require('./services/dids/config.js');
|
|
@@ -61,6 +65,9 @@ require('@docknetwork/crypto-wasm-ts/lib/legosnark');
|
|
|
61
65
|
require('./services/credential/pex-helpers.js');
|
|
62
66
|
require('@astronautlabs/jsonpath');
|
|
63
67
|
require('./services/credential/bbs-revocation.js');
|
|
68
|
+
require('./services/credential/sd-jwt.js');
|
|
69
|
+
require('@sd-jwt/sd-jwt-vc');
|
|
70
|
+
require('@sd-jwt/crypto-nodejs');
|
|
64
71
|
require('./services/relay-service/service.js');
|
|
65
72
|
require('./services/relay-service/configs.js');
|
|
66
73
|
require('@docknetwork/wallet-sdk-relay-service/lib');
|
package/lib/index.mjs
CHANGED
|
@@ -24,6 +24,11 @@ import '@scure/bip39';
|
|
|
24
24
|
import '@scure/bip39/wordlists/english';
|
|
25
25
|
import './services/util-crypto/configs.mjs';
|
|
26
26
|
import '@docknetwork/credential-sdk/types';
|
|
27
|
+
import './services/blockchain/cached-did-resolver.mjs';
|
|
28
|
+
import './services/storage/index.mjs';
|
|
29
|
+
import './services/storage/service.mjs';
|
|
30
|
+
import './services/storage/service-rpc.mjs';
|
|
31
|
+
import './services/rpc-service-client.mjs';
|
|
27
32
|
import './services/wallet/service.mjs';
|
|
28
33
|
import './wallet/memory-storage-wallet.mjs';
|
|
29
34
|
import '@docknetwork/universal-wallet/storage-wallet';
|
|
@@ -32,7 +37,6 @@ import '@docknetwork/universal-wallet/storage/storage-interface';
|
|
|
32
37
|
import './services/wallet/configs.mjs';
|
|
33
38
|
import './core/validation.mjs';
|
|
34
39
|
import './types.mjs';
|
|
35
|
-
import './services/storage/service.mjs';
|
|
36
40
|
import './services/dids/service.mjs';
|
|
37
41
|
import '@docknetwork/wallet-sdk-dids/lib';
|
|
38
42
|
import './services/dids/config.mjs';
|
|
@@ -59,6 +63,9 @@ import '@docknetwork/crypto-wasm-ts/lib/legosnark';
|
|
|
59
63
|
import './services/credential/pex-helpers.mjs';
|
|
60
64
|
import '@astronautlabs/jsonpath';
|
|
61
65
|
import './services/credential/bbs-revocation.mjs';
|
|
66
|
+
import './services/credential/sd-jwt.mjs';
|
|
67
|
+
import '@sd-jwt/sd-jwt-vc';
|
|
68
|
+
import '@sd-jwt/crypto-nodejs';
|
|
62
69
|
import './services/relay-service/service.mjs';
|
|
63
70
|
import './services/relay-service/configs.mjs';
|
|
64
71
|
import '@docknetwork/wallet-sdk-relay-service/lib';
|
package/lib/rpc-server.js
CHANGED
|
@@ -22,6 +22,13 @@ require('@scure/bip39');
|
|
|
22
22
|
require('@scure/bip39/wordlists/english');
|
|
23
23
|
require('./services/util-crypto/configs.js');
|
|
24
24
|
require('@docknetwork/credential-sdk/types');
|
|
25
|
+
require('./services/blockchain/cached-did-resolver.js');
|
|
26
|
+
require('./services/storage/index.js');
|
|
27
|
+
require('./services/storage/service.js');
|
|
28
|
+
require('./services/storage/service-rpc.js');
|
|
29
|
+
require('./services/rpc-service-client.js');
|
|
30
|
+
require('./rpc-client.js');
|
|
31
|
+
require('./logger.js');
|
|
25
32
|
require('./services/wallet/service.js');
|
|
26
33
|
require('./wallet/memory-storage-wallet.js');
|
|
27
34
|
require('@docknetwork/universal-wallet/storage-wallet');
|
|
@@ -30,7 +37,6 @@ require('@docknetwork/universal-wallet/storage/storage-interface');
|
|
|
30
37
|
require('./services/wallet/configs.js');
|
|
31
38
|
require('./core/validation.js');
|
|
32
39
|
require('./types.js');
|
|
33
|
-
require('./services/storage/service.js');
|
|
34
40
|
require('./services/dids/service.js');
|
|
35
41
|
require('@docknetwork/wallet-sdk-dids/lib');
|
|
36
42
|
require('./services/dids/config.js');
|
|
@@ -57,6 +63,9 @@ require('@docknetwork/crypto-wasm-ts/lib/legosnark');
|
|
|
57
63
|
require('./services/credential/pex-helpers.js');
|
|
58
64
|
require('@astronautlabs/jsonpath');
|
|
59
65
|
require('./services/credential/bbs-revocation.js');
|
|
66
|
+
require('./services/credential/sd-jwt.js');
|
|
67
|
+
require('@sd-jwt/sd-jwt-vc');
|
|
68
|
+
require('@sd-jwt/crypto-nodejs');
|
|
60
69
|
require('./services/relay-service/service.js');
|
|
61
70
|
require('./services/relay-service/configs.js');
|
|
62
71
|
require('@docknetwork/wallet-sdk-relay-service/lib');
|
package/lib/rpc-server.mjs
CHANGED
|
@@ -20,6 +20,13 @@ import '@scure/bip39';
|
|
|
20
20
|
import '@scure/bip39/wordlists/english';
|
|
21
21
|
import './services/util-crypto/configs.mjs';
|
|
22
22
|
import '@docknetwork/credential-sdk/types';
|
|
23
|
+
import './services/blockchain/cached-did-resolver.mjs';
|
|
24
|
+
import './services/storage/index.mjs';
|
|
25
|
+
import './services/storage/service.mjs';
|
|
26
|
+
import './services/storage/service-rpc.mjs';
|
|
27
|
+
import './services/rpc-service-client.mjs';
|
|
28
|
+
import './rpc-client.mjs';
|
|
29
|
+
import './logger.mjs';
|
|
23
30
|
import './services/wallet/service.mjs';
|
|
24
31
|
import './wallet/memory-storage-wallet.mjs';
|
|
25
32
|
import '@docknetwork/universal-wallet/storage-wallet';
|
|
@@ -28,7 +35,6 @@ import '@docknetwork/universal-wallet/storage/storage-interface';
|
|
|
28
35
|
import './services/wallet/configs.mjs';
|
|
29
36
|
import './core/validation.mjs';
|
|
30
37
|
import './types.mjs';
|
|
31
|
-
import './services/storage/service.mjs';
|
|
32
38
|
import './services/dids/service.mjs';
|
|
33
39
|
import '@docknetwork/wallet-sdk-dids/lib';
|
|
34
40
|
import './services/dids/config.mjs';
|
|
@@ -55,6 +61,9 @@ import '@docknetwork/crypto-wasm-ts/lib/legosnark';
|
|
|
55
61
|
import './services/credential/pex-helpers.mjs';
|
|
56
62
|
import '@astronautlabs/jsonpath';
|
|
57
63
|
import './services/credential/bbs-revocation.mjs';
|
|
64
|
+
import './services/credential/sd-jwt.mjs';
|
|
65
|
+
import '@sd-jwt/sd-jwt-vc';
|
|
66
|
+
import '@sd-jwt/crypto-nodejs';
|
|
58
67
|
import './services/relay-service/service.mjs';
|
|
59
68
|
import './services/relay-service/configs.mjs';
|
|
60
69
|
import '@docknetwork/wallet-sdk-relay-service/lib';
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var services_storage_index = require('../storage/index.js');
|
|
6
|
+
require('../storage/service.js');
|
|
7
|
+
require('../storage/service-rpc.js');
|
|
8
|
+
require('../rpc-service-client.js');
|
|
9
|
+
require('assert');
|
|
10
|
+
require('../../rpc-client.js');
|
|
11
|
+
require('json-rpc-2.0');
|
|
12
|
+
require('../../core/crypto.js');
|
|
13
|
+
require('crypto');
|
|
14
|
+
require('../../core/logger.js');
|
|
15
|
+
require('../../logger.js');
|
|
16
|
+
require('../../rpc-util.js');
|
|
17
|
+
|
|
18
|
+
class CachedDIDResolver {
|
|
19
|
+
router;
|
|
20
|
+
ttl;
|
|
21
|
+
CACHE_PREFIX = 'did-cache:';
|
|
22
|
+
constructor(router, cacheOptions = {}) {
|
|
23
|
+
this.router = router;
|
|
24
|
+
// 1 hour default
|
|
25
|
+
this.ttl = cacheOptions.ttl || 60 * 60 * 1000;
|
|
26
|
+
}
|
|
27
|
+
getCacheKey(did) {
|
|
28
|
+
return `${this.CACHE_PREFIX}${did}`;
|
|
29
|
+
}
|
|
30
|
+
async getCacheEntry(did) {
|
|
31
|
+
const key = this.getCacheKey(did);
|
|
32
|
+
const data = await services_storage_index.storageService.getItem(key);
|
|
33
|
+
try {
|
|
34
|
+
return data ? JSON.parse(data) : null;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error('Error parsing cache entry:', error);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async setCacheEntry(did, entry) {
|
|
42
|
+
const key = this.getCacheKey(did);
|
|
43
|
+
await services_storage_index.storageService.setItem(key, JSON.stringify(entry));
|
|
44
|
+
}
|
|
45
|
+
async getCachedDIDs() {
|
|
46
|
+
const allKeys = await services_storage_index.storageService.getAllKeys();
|
|
47
|
+
const cachedDIDs = [];
|
|
48
|
+
allKeys.forEach(key => {
|
|
49
|
+
if (key.startsWith(this.CACHE_PREFIX)) {
|
|
50
|
+
cachedDIDs.push(key.replace(this.CACHE_PREFIX, ''));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
return cachedDIDs;
|
|
54
|
+
}
|
|
55
|
+
async resolve(did) {
|
|
56
|
+
const cached = await this.getCacheEntry(did);
|
|
57
|
+
if (cached) {
|
|
58
|
+
if (Date.now() - cached.timestamp < this.ttl) {
|
|
59
|
+
console.log('Cache hit for:', did);
|
|
60
|
+
return cached.value;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log('Cache expired for:', did, 'returning stale value and refreshing in background');
|
|
64
|
+
this.refreshInBackground(did);
|
|
65
|
+
return cached.value;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
console.log('Cache miss, resolving:', did);
|
|
69
|
+
const result = await this.router.resolve(did);
|
|
70
|
+
await this.setCacheEntry(result.id, {
|
|
71
|
+
value: result,
|
|
72
|
+
id: result.id,
|
|
73
|
+
timestamp: Date.now()
|
|
74
|
+
});
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
async refreshInBackground(did) {
|
|
78
|
+
try {
|
|
79
|
+
console.log('Refreshing cache in background for:', did);
|
|
80
|
+
const result = await this.router.resolve(did);
|
|
81
|
+
await this.setCacheEntry(did, {
|
|
82
|
+
value: result,
|
|
83
|
+
id: did,
|
|
84
|
+
timestamp: Date.now()
|
|
85
|
+
});
|
|
86
|
+
console.log('Background refresh completed for:', did);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.warn('Background refresh failed for:', did, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* if the did is provided, it will remove the specific did from the cache
|
|
94
|
+
* otherwise, it will clear the entire cache
|
|
95
|
+
* @param did
|
|
96
|
+
*/
|
|
97
|
+
async clearCache(did) {
|
|
98
|
+
if (did) {
|
|
99
|
+
const key = this.getCacheKey(did);
|
|
100
|
+
await services_storage_index.storageService.removeItem(key);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const allKeys = await services_storage_index.storageService.getAllKeys();
|
|
104
|
+
const cacheKeys = allKeys.filter(key => key.startsWith(this.CACHE_PREFIX));
|
|
105
|
+
await Promise.all(cacheKeys.map(key => services_storage_index.storageService.removeItem(key)));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
supports(id) {
|
|
109
|
+
return this.router.supports(id);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
exports.CachedDIDResolver = CachedDIDResolver;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { storageService } from '../storage/index.mjs';
|
|
2
|
+
import '../storage/service.mjs';
|
|
3
|
+
import '../storage/service-rpc.mjs';
|
|
4
|
+
import '../rpc-service-client.mjs';
|
|
5
|
+
import 'assert';
|
|
6
|
+
import '../../rpc-client.mjs';
|
|
7
|
+
import 'json-rpc-2.0';
|
|
8
|
+
import '../../core/crypto.mjs';
|
|
9
|
+
import 'crypto';
|
|
10
|
+
import '../../core/logger.mjs';
|
|
11
|
+
import '../../logger.mjs';
|
|
12
|
+
import '../../rpc-util.mjs';
|
|
13
|
+
|
|
14
|
+
class CachedDIDResolver {
|
|
15
|
+
router;
|
|
16
|
+
ttl;
|
|
17
|
+
CACHE_PREFIX = 'did-cache:';
|
|
18
|
+
constructor(router, cacheOptions = {}) {
|
|
19
|
+
this.router = router;
|
|
20
|
+
// 1 hour default
|
|
21
|
+
this.ttl = cacheOptions.ttl || 60 * 60 * 1000;
|
|
22
|
+
}
|
|
23
|
+
getCacheKey(did) {
|
|
24
|
+
return `${this.CACHE_PREFIX}${did}`;
|
|
25
|
+
}
|
|
26
|
+
async getCacheEntry(did) {
|
|
27
|
+
const key = this.getCacheKey(did);
|
|
28
|
+
const data = await storageService.getItem(key);
|
|
29
|
+
try {
|
|
30
|
+
return data ? JSON.parse(data) : null;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Error parsing cache entry:', error);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async setCacheEntry(did, entry) {
|
|
38
|
+
const key = this.getCacheKey(did);
|
|
39
|
+
await storageService.setItem(key, JSON.stringify(entry));
|
|
40
|
+
}
|
|
41
|
+
async getCachedDIDs() {
|
|
42
|
+
const allKeys = await storageService.getAllKeys();
|
|
43
|
+
const cachedDIDs = [];
|
|
44
|
+
allKeys.forEach(key => {
|
|
45
|
+
if (key.startsWith(this.CACHE_PREFIX)) {
|
|
46
|
+
cachedDIDs.push(key.replace(this.CACHE_PREFIX, ''));
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return cachedDIDs;
|
|
50
|
+
}
|
|
51
|
+
async resolve(did) {
|
|
52
|
+
const cached = await this.getCacheEntry(did);
|
|
53
|
+
if (cached) {
|
|
54
|
+
if (Date.now() - cached.timestamp < this.ttl) {
|
|
55
|
+
console.log('Cache hit for:', did);
|
|
56
|
+
return cached.value;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log('Cache expired for:', did, 'returning stale value and refreshing in background');
|
|
60
|
+
this.refreshInBackground(did);
|
|
61
|
+
return cached.value;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
console.log('Cache miss, resolving:', did);
|
|
65
|
+
const result = await this.router.resolve(did);
|
|
66
|
+
await this.setCacheEntry(result.id, {
|
|
67
|
+
value: result,
|
|
68
|
+
id: result.id,
|
|
69
|
+
timestamp: Date.now()
|
|
70
|
+
});
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
async refreshInBackground(did) {
|
|
74
|
+
try {
|
|
75
|
+
console.log('Refreshing cache in background for:', did);
|
|
76
|
+
const result = await this.router.resolve(did);
|
|
77
|
+
await this.setCacheEntry(did, {
|
|
78
|
+
value: result,
|
|
79
|
+
id: did,
|
|
80
|
+
timestamp: Date.now()
|
|
81
|
+
});
|
|
82
|
+
console.log('Background refresh completed for:', did);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.warn('Background refresh failed for:', did, error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* if the did is provided, it will remove the specific did from the cache
|
|
90
|
+
* otherwise, it will clear the entire cache
|
|
91
|
+
* @param did
|
|
92
|
+
*/
|
|
93
|
+
async clearCache(did) {
|
|
94
|
+
if (did) {
|
|
95
|
+
const key = this.getCacheKey(did);
|
|
96
|
+
await storageService.removeItem(key);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
const allKeys = await storageService.getAllKeys();
|
|
100
|
+
const cacheKeys = allKeys.filter(key => key.startsWith(this.CACHE_PREFIX));
|
|
101
|
+
await Promise.all(cacheKeys.map(key => storageService.removeItem(key)));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
supports(id) {
|
|
105
|
+
return this.router.supports(id);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export { CachedDIDResolver };
|
|
@@ -19,6 +19,17 @@ require('@scure/bip39');
|
|
|
19
19
|
require('@scure/bip39/wordlists/english');
|
|
20
20
|
require('../util-crypto/configs.js');
|
|
21
21
|
require('@docknetwork/credential-sdk/types');
|
|
22
|
+
require('./cached-did-resolver.js');
|
|
23
|
+
require('../storage/index.js');
|
|
24
|
+
require('../storage/service.js');
|
|
25
|
+
require('../storage/service-rpc.js');
|
|
26
|
+
require('../rpc-service-client.js');
|
|
27
|
+
require('../../rpc-client.js');
|
|
28
|
+
require('json-rpc-2.0');
|
|
29
|
+
require('../../core/crypto.js');
|
|
30
|
+
require('crypto');
|
|
31
|
+
require('../../logger.js');
|
|
32
|
+
require('../../rpc-util.js');
|
|
22
33
|
|
|
23
34
|
|
|
24
35
|
|
|
@@ -15,3 +15,14 @@ import '@scure/bip39';
|
|
|
15
15
|
import '@scure/bip39/wordlists/english';
|
|
16
16
|
import '../util-crypto/configs.mjs';
|
|
17
17
|
import '@docknetwork/credential-sdk/types';
|
|
18
|
+
import './cached-did-resolver.mjs';
|
|
19
|
+
import '../storage/index.mjs';
|
|
20
|
+
import '../storage/service.mjs';
|
|
21
|
+
import '../storage/service-rpc.mjs';
|
|
22
|
+
import '../rpc-service-client.mjs';
|
|
23
|
+
import '../../rpc-client.mjs';
|
|
24
|
+
import 'json-rpc-2.0';
|
|
25
|
+
import '../../core/crypto.mjs';
|
|
26
|
+
import 'crypto';
|
|
27
|
+
import '../../logger.mjs';
|
|
28
|
+
import '../../rpc-util.mjs';
|
|
@@ -55,6 +55,18 @@ class BlockchainServiceRpc extends services_rpcServiceClient.RpcService {
|
|
|
55
55
|
resolveDID(did ) {
|
|
56
56
|
return this.call('resolveDID', did);
|
|
57
57
|
}
|
|
58
|
+
|
|
59
|
+
getCachedDIDs() {
|
|
60
|
+
return this.call('getCachedDIDs');
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getCacheEntry(did ) {
|
|
64
|
+
return this.call('getCacheEntry', did);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
clearCache(did ) {
|
|
68
|
+
return this.call('clearCache', did);
|
|
69
|
+
}
|
|
58
70
|
}
|
|
59
71
|
|
|
60
72
|
exports.BlockchainServiceRpc = BlockchainServiceRpc;
|
|
@@ -51,6 +51,18 @@ class BlockchainServiceRpc extends RpcService {
|
|
|
51
51
|
resolveDID(did ) {
|
|
52
52
|
return this.call('resolveDID', did);
|
|
53
53
|
}
|
|
54
|
+
|
|
55
|
+
getCachedDIDs() {
|
|
56
|
+
return this.call('getCachedDIDs');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
getCacheEntry(did ) {
|
|
60
|
+
return this.call('getCacheEntry', did);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
clearCache(did ) {
|
|
64
|
+
return this.call('clearCache', did);
|
|
65
|
+
}
|
|
54
66
|
}
|
|
55
67
|
|
|
56
68
|
export { BlockchainServiceRpc };
|