@docknetwork/wallet-sdk-core 0.4.19
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/LICENSE +39 -0
- package/babel.config.js +16 -0
- package/jest.config.ts +39 -0
- package/lib/account-provider.d.ts +8 -0
- package/lib/account-provider.d.ts.map +1 -0
- package/lib/account-provider.js +15 -0
- package/lib/account-provider.js.map +1 -0
- package/lib/biometric-provider.d.ts +29 -0
- package/lib/biometric-provider.d.ts.map +1 -0
- package/lib/biometric-provider.js +54 -0
- package/lib/biometric-provider.js.map +1 -0
- package/lib/credential-provider.d.ts +58 -0
- package/lib/credential-provider.d.ts.map +1 -0
- package/lib/credential-provider.js +198 -0
- package/lib/credential-provider.js.map +1 -0
- package/lib/did-provider.d.ts +79 -0
- package/lib/did-provider.d.ts.map +1 -0
- package/lib/did-provider.js +215 -0
- package/lib/did-provider.js.map +1 -0
- package/lib/ecosystem-tools.d.ts +11 -0
- package/lib/ecosystem-tools.d.ts.map +1 -0
- package/lib/ecosystem-tools.js +33 -0
- package/lib/ecosystem-tools.js.map +1 -0
- package/lib/helpers.d.ts +8 -0
- package/lib/helpers.d.ts.map +1 -0
- package/lib/helpers.js +63 -0
- package/lib/helpers.js.map +1 -0
- package/lib/message-provider.d.ts +36 -0
- package/lib/message-provider.d.ts.map +1 -0
- package/lib/message-provider.js +172 -0
- package/lib/message-provider.js.map +1 -0
- package/lib/messages/message-helpers.d.ts +110 -0
- package/lib/messages/message-helpers.d.ts.map +1 -0
- package/lib/messages/message-helpers.js +106 -0
- package/lib/messages/message-helpers.js.map +1 -0
- package/lib/network-resolver.d.ts +19 -0
- package/lib/network-resolver.d.ts.map +1 -0
- package/lib/network-resolver.js +80 -0
- package/lib/network-resolver.js.map +1 -0
- package/lib/types.d.ts +63 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +3 -0
- package/lib/types.js.map +1 -0
- package/lib/v1-helpers.d.ts +20 -0
- package/lib/v1-helpers.d.ts.map +1 -0
- package/lib/v1-helpers.js +147 -0
- package/lib/v1-helpers.js.map +1 -0
- package/lib/verification-controller.d.ts +48 -0
- package/lib/verification-controller.d.ts.map +1 -0
- package/lib/verification-controller.js +219 -0
- package/lib/verification-controller.js.map +1 -0
- package/lib/wallet-to-wallet-verification/walletToWalletVerificationProvider.d.ts +20 -0
- package/lib/wallet-to-wallet-verification/walletToWalletVerificationProvider.d.ts.map +1 -0
- package/lib/wallet-to-wallet-verification/walletToWalletVerificationProvider.js +140 -0
- package/lib/wallet-to-wallet-verification/walletToWalletVerificationProvider.js.map +1 -0
- package/lib/wallet-wasm.d.ts +10 -0
- package/lib/wallet-wasm.d.ts.map +1 -0
- package/lib/wallet-wasm.js +62 -0
- package/lib/wallet-wasm.js.map +1 -0
- package/lib/wallet.d.ts +11 -0
- package/lib/wallet.d.ts.map +1 -0
- package/lib/wallet.js +173 -0
- package/lib/wallet.js.map +1 -0
- package/package.json +34 -0
- package/setup-tests.ts +1 -0
- package/src/account-provider.ts +18 -0
- package/src/biometric-provider.ts +82 -0
- package/src/credential-provider.test.ts +164 -0
- package/src/credential-provider.ts +272 -0
- package/src/did-provider.test.ts +203 -0
- package/src/did-provider.ts +263 -0
- package/src/ecosystem-tools.ts +37 -0
- package/src/fixtures/any-credential-proof-request.json +30 -0
- package/src/fixtures/biometrics-credential-bbs-revocation.json +62 -0
- package/src/fixtures/customer-credential.json +39 -0
- package/src/fixtures/iiw-credential.json +59 -0
- package/src/fixtures/iiw-template.json +33 -0
- package/src/fixtures/university-degree-bbs.json +57 -0
- package/src/fixtures/university-degree-proof-request.json +32 -0
- package/src/helpers.ts +61 -0
- package/src/message-provider.test.ts +115 -0
- package/src/message-provider.ts +221 -0
- package/src/messages/message-helpers.ts +125 -0
- package/src/messages/relay-service-mocks/demo-app-messages.json +450 -0
- package/src/network-resolver.test.ts +142 -0
- package/src/network-resolver.ts +122 -0
- package/src/types.ts +75 -0
- package/src/v1-helpers.ts +160 -0
- package/src/verification-controller.test.ts +149 -0
- package/src/verification-controller.ts +276 -0
- package/src/wallet-to-wallet-verification/walletToWalletVerificationProvider.ts +216 -0
- package/src/wallet-wasm.ts +74 -0
- package/src/wallet.test.ts +72 -0
- package/src/wallet.ts +211 -0
- package/tsconfig.build.json +26 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +30 -0
package/lib/wallet.js
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createWallet = exports.ensureDocumentContext = void 0;
|
|
4
|
+
const src_1 = require("@docknetwork/wallet-sdk-data-store/src");
|
|
5
|
+
const document_1 = require("@docknetwork/wallet-sdk-data-store/src/entities/document");
|
|
6
|
+
const v1_helpers_1 = require("./v1-helpers");
|
|
7
|
+
const wallet_wasm_1 = require("./wallet-wasm");
|
|
8
|
+
const events_1 = require("events");
|
|
9
|
+
const wallet_1 = require("@docknetwork/wallet-sdk-wasm/src/modules/wallet");
|
|
10
|
+
const wallet_2 = require("@docknetwork/wallet-sdk-wasm/src/services/wallet");
|
|
11
|
+
const migrate_v1_data_1 = require("@docknetwork/wallet-sdk-data-store/src/migration/migration1/migrate-v1-data");
|
|
12
|
+
const did_provider_1 = require("./did-provider");
|
|
13
|
+
function once(emitter, eventName) {
|
|
14
|
+
return new Promise(resolve => emitter.once(eventName, resolve));
|
|
15
|
+
}
|
|
16
|
+
function ensureDocumentContext(document) {
|
|
17
|
+
if (document['@context']) {
|
|
18
|
+
return document;
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...document,
|
|
22
|
+
'@context': ['https://w3id.org/wallet/v1'],
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
exports.ensureDocumentContext = ensureDocumentContext;
|
|
26
|
+
/**
|
|
27
|
+
* Create wallet
|
|
28
|
+
*
|
|
29
|
+
* @param createWalletProps
|
|
30
|
+
* @returns {Promise<IWallet>}
|
|
31
|
+
*/
|
|
32
|
+
async function createWallet(createWalletProps) {
|
|
33
|
+
const dataStore = await (0, src_1.createDataStore)(createWalletProps);
|
|
34
|
+
let status;
|
|
35
|
+
const eventEmitter = new events_1.EventEmitter();
|
|
36
|
+
const wallet = {
|
|
37
|
+
eventManager: eventEmitter,
|
|
38
|
+
waitForEvent: (eventName) => once(eventEmitter, eventName),
|
|
39
|
+
dataStore,
|
|
40
|
+
getStatus() {
|
|
41
|
+
return status;
|
|
42
|
+
},
|
|
43
|
+
resolveDocumentNetwork: async (document) => {
|
|
44
|
+
return dataStore.resolveDocumentNetwork({
|
|
45
|
+
document,
|
|
46
|
+
dataStore,
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
deleteWallet: async () => {
|
|
50
|
+
await (0, document_1.removeAllDocuments)({
|
|
51
|
+
dataStore,
|
|
52
|
+
});
|
|
53
|
+
eventEmitter.emit(wallet_1.WalletEvents.walletDeleted);
|
|
54
|
+
},
|
|
55
|
+
setStatus(newStatus) {
|
|
56
|
+
status = newStatus;
|
|
57
|
+
},
|
|
58
|
+
setNetwork: async (networkId) => {
|
|
59
|
+
await dataStore.setNetwork(networkId);
|
|
60
|
+
eventEmitter.emit(wallet_1.WalletEvents.networkUpdated, networkId);
|
|
61
|
+
},
|
|
62
|
+
getNetworkId: () => {
|
|
63
|
+
return dataStore.networkId;
|
|
64
|
+
},
|
|
65
|
+
getDocumentById: id => (0, document_1.getDocumentById)({
|
|
66
|
+
dataStore,
|
|
67
|
+
id,
|
|
68
|
+
}),
|
|
69
|
+
getAllDocuments: () => {
|
|
70
|
+
return (0, document_1.getAllDocuments)({
|
|
71
|
+
dataStore,
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
getDocumentsById: idList => (0, document_1.getDocumentsById)({
|
|
75
|
+
dataStore,
|
|
76
|
+
idList,
|
|
77
|
+
}),
|
|
78
|
+
getDocumentsByType: type => (0, document_1.getDocumentsByType)({
|
|
79
|
+
dataStore,
|
|
80
|
+
type,
|
|
81
|
+
}),
|
|
82
|
+
addDocument: (json) => {
|
|
83
|
+
return (0, document_1.createDocument)({
|
|
84
|
+
dataStore,
|
|
85
|
+
json,
|
|
86
|
+
}).then(result => {
|
|
87
|
+
eventEmitter.emit(wallet_1.WalletEvents.documentAdded, result);
|
|
88
|
+
return result;
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
updateDocument: (document) => {
|
|
92
|
+
return (0, document_1.updateDocument)({
|
|
93
|
+
dataStore,
|
|
94
|
+
document,
|
|
95
|
+
}).then(result => {
|
|
96
|
+
eventEmitter.emit(wallet_1.WalletEvents.documentUpdated, result);
|
|
97
|
+
return result;
|
|
98
|
+
});
|
|
99
|
+
},
|
|
100
|
+
removeDocument: async (id) => {
|
|
101
|
+
const document = await wallet.getDocumentById(id);
|
|
102
|
+
return (0, document_1.removeDocument)({
|
|
103
|
+
dataStore,
|
|
104
|
+
id,
|
|
105
|
+
}).then(result => {
|
|
106
|
+
eventEmitter.emit(wallet_1.WalletEvents.documentRemoved, document);
|
|
107
|
+
return result;
|
|
108
|
+
});
|
|
109
|
+
},
|
|
110
|
+
getDocumentCorrelations: (documentId) => {
|
|
111
|
+
return (0, document_1.getDocumentCorrelations)({
|
|
112
|
+
dataStore,
|
|
113
|
+
documentId,
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
getAccountKeyPair: async (accountId) => {
|
|
117
|
+
const correlations = await (0, document_1.getDocumentCorrelations)({
|
|
118
|
+
dataStore,
|
|
119
|
+
documentId: accountId,
|
|
120
|
+
});
|
|
121
|
+
const keyPair = correlations.find(correlation => correlation.type === 'KeyringPair');
|
|
122
|
+
return keyPair?.value;
|
|
123
|
+
},
|
|
124
|
+
getDocumentsFromEncryptedWallet: async (json, password) => {
|
|
125
|
+
return wallet_2.walletService.getDocumentsFromEncryptedWallet({
|
|
126
|
+
encryptedJSONWallet: json,
|
|
127
|
+
password,
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
importUniversalWalletJSON: async (json, password) => {
|
|
131
|
+
const documents = await wallet_2.walletService.getDocumentsFromEncryptedWallet({
|
|
132
|
+
encryptedJSONWallet: json,
|
|
133
|
+
password,
|
|
134
|
+
});
|
|
135
|
+
await (0, migrate_v1_data_1.importUniversalWalletDocuments)({
|
|
136
|
+
documents,
|
|
137
|
+
dataStore,
|
|
138
|
+
});
|
|
139
|
+
return documents;
|
|
140
|
+
},
|
|
141
|
+
exportDocuments: async (params) => {
|
|
142
|
+
const documents = params.documents.map(ensureDocumentContext);
|
|
143
|
+
return wallet_2.walletService.exportDocuments({
|
|
144
|
+
documents,
|
|
145
|
+
password: params.password,
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
exportUniversalWalletJSON: async (password) => {
|
|
149
|
+
let documents = await (0, document_1.getAllDocuments)({
|
|
150
|
+
dataStore,
|
|
151
|
+
allNetworks: true,
|
|
152
|
+
});
|
|
153
|
+
const result = await wallet.exportDocuments({
|
|
154
|
+
documents,
|
|
155
|
+
password,
|
|
156
|
+
});
|
|
157
|
+
return result;
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
const v1Wallet = await (0, v1_helpers_1.toV1Wallet)(wallet);
|
|
161
|
+
await (0, wallet_wasm_1.initWalletWasm)(v1Wallet);
|
|
162
|
+
await (0, did_provider_1.ensureDID)({
|
|
163
|
+
wallet: v1Wallet,
|
|
164
|
+
});
|
|
165
|
+
[wallet_1.WalletEvents.networkUpdated, wallet_1.WalletEvents.walletDeleted].forEach((event) => eventEmitter.on(event, () => {
|
|
166
|
+
(0, did_provider_1.ensureDID)({
|
|
167
|
+
wallet: v1Wallet,
|
|
168
|
+
});
|
|
169
|
+
}));
|
|
170
|
+
return v1Wallet;
|
|
171
|
+
}
|
|
172
|
+
exports.createWallet = createWallet;
|
|
173
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@docknetwork/wallet-sdk-core",
|
|
3
|
+
"version": "0.4.19",
|
|
4
|
+
"license": "LicenseRef-LICENSE",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/docknetwork/react-native-sdk",
|
|
8
|
+
"directory": "packages/core"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"test": "jest",
|
|
12
|
+
"prepublishOnly": "npm run build",
|
|
13
|
+
"build": "tsc -p tsconfig.build.json"
|
|
14
|
+
},
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"typeorm": "^0.3.15",
|
|
17
|
+
"reflect-metadata": "^0.1.13",
|
|
18
|
+
"sqlite3": "^5.0.2",
|
|
19
|
+
"@docknetwork/wallet-sdk-data-store": "^0.4.0"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@docknetwork/wallet-sdk-wasm": "^0.4.3"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@docknetwork/wallet-sdk-data-store": "^0.4.0",
|
|
26
|
+
"jest": "29.1.0",
|
|
27
|
+
"ts-jest": "29.1.0",
|
|
28
|
+
"ts-node": "^10.9.1",
|
|
29
|
+
"typescript": "^5.0.4",
|
|
30
|
+
"typeorm": "^0.3.15",
|
|
31
|
+
"sqlite3": "^5.0.2",
|
|
32
|
+
"reflect-metadata": "^0.1.13"
|
|
33
|
+
}
|
|
34
|
+
}
|
package/setup-tests.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@docknetwork/wallet-sdk-wasm/src/setup-tests';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {IWallet} from './types';
|
|
2
|
+
import {Accounts} from '@docknetwork/wallet-sdk-wasm/src/modules/accounts';
|
|
3
|
+
import {toV1WalletService} from './v1-helpers';
|
|
4
|
+
|
|
5
|
+
interface ICreateAccountsProvider {
|
|
6
|
+
wallet: IWallet;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function createAccountProvider({wallet}: ICreateAccountsProvider) {
|
|
10
|
+
const accountsModule = new Accounts({
|
|
11
|
+
wallet: wallet,
|
|
12
|
+
walletService: toV1WalletService(wallet),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
(Accounts as any).instance = accountsModule;
|
|
16
|
+
|
|
17
|
+
return accountsModule;
|
|
18
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {WalletDocument} from '@docknetwork/wallet-sdk-wasm/src/types';
|
|
2
|
+
import {IWallet} from './types';
|
|
3
|
+
import {createCredentialProvider} from './credential-provider';
|
|
4
|
+
import assert from 'assert';
|
|
5
|
+
|
|
6
|
+
export type BiometricsPluginIssuerConfig = {
|
|
7
|
+
networkId: string;
|
|
8
|
+
did: string;
|
|
9
|
+
apiKey: string;
|
|
10
|
+
apiUrl: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type BiometricsPluginConfigs = {
|
|
14
|
+
enrollmentCredentialType: string;
|
|
15
|
+
biometricMatchCredentialType: string;
|
|
16
|
+
biometricMatchExpirationMinutes: number;
|
|
17
|
+
issuerConfigs:BiometricsPluginIssuerConfig[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let configs: BiometricsPluginConfigs = null;
|
|
21
|
+
|
|
22
|
+
export function setBiometricConfigs(_configs: BiometricsPluginConfigs) {
|
|
23
|
+
configs = _configs;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export function assertConfigs() {
|
|
27
|
+
assert(!!configs, 'Biometrics plugin not configured');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function getBiometricConfigs() {
|
|
31
|
+
return configs;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function getIssuerConfigsForNetwork(networkId): BiometricsPluginIssuerConfig {
|
|
35
|
+
return getBiometricConfigs()?.issuerConfigs.find(config => config.networkId === networkId);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createBiometricBindingProvider({
|
|
39
|
+
wallet,
|
|
40
|
+
onEnroll,
|
|
41
|
+
onMatch,
|
|
42
|
+
onCheckBiometryRequired,
|
|
43
|
+
}: {
|
|
44
|
+
wallet: IWallet;
|
|
45
|
+
onEnroll: () => Promise<WalletDocument>;
|
|
46
|
+
onMatch: (biometricTemplate: WalletDocument) => Promise<WalletDocument>;
|
|
47
|
+
onCheckBiometryRequired: (request) => boolean;
|
|
48
|
+
}) {
|
|
49
|
+
const credentialProvider = createCredentialProvider({wallet});
|
|
50
|
+
return {
|
|
51
|
+
enrollBiometry: async () => {
|
|
52
|
+
const enrollmentCredential = await onEnroll();
|
|
53
|
+
return await credentialProvider.addCredential(enrollmentCredential);
|
|
54
|
+
},
|
|
55
|
+
matchBiometry: async () => {
|
|
56
|
+
const CREDENTIAL_TYPE = configs.enrollmentCredentialType;
|
|
57
|
+
const enrollmentCredentials = await wallet.getDocumentsByType(
|
|
58
|
+
CREDENTIAL_TYPE,
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
if (!enrollmentCredentials.length) {
|
|
62
|
+
throw new Error('Enrollment credential not found');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const matchConfirmationCredential = await onMatch(
|
|
66
|
+
enrollmentCredentials[0],
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
if (matchConfirmationCredential) {
|
|
70
|
+
const biometricMatchCredentials = await wallet.getDocumentsByType(configs.biometricMatchCredentialType);
|
|
71
|
+
for (let i = 0; i < biometricMatchCredentials.length; i++) {
|
|
72
|
+
await wallet.removeDocument(biometricMatchCredentials[0].id);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
await wallet.addDocument(matchConfirmationCredential);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return matchConfirmationCredential;
|
|
79
|
+
},
|
|
80
|
+
checkIsBiometryRequired: onCheckBiometryRequired,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ACUMM_WITNESS_PROP_KEY,
|
|
3
|
+
CredentialStatus,
|
|
4
|
+
ICredentialProvider,
|
|
5
|
+
createCredentialProvider,
|
|
6
|
+
} from './credential-provider';
|
|
7
|
+
import {IWallet, createWallet} from './wallet';
|
|
8
|
+
|
|
9
|
+
import biometricsBBSRevocation from './fixtures/biometrics-credential-bbs-revocation.json';
|
|
10
|
+
import customerCredential from './fixtures/customer-credential.json';
|
|
11
|
+
import {credentialServiceRPC} from '@docknetwork/wallet-sdk-wasm/src/services/credential';
|
|
12
|
+
|
|
13
|
+
describe('CredentialProvider', () => {
|
|
14
|
+
let wallet: IWallet;
|
|
15
|
+
let provider: ICredentialProvider;
|
|
16
|
+
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
wallet = await createWallet({
|
|
19
|
+
databasePath: ':memory:',
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
provider = createCredentialProvider({wallet});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('addCredential', () => {
|
|
26
|
+
it('should add a credential to the wallet', async () => {
|
|
27
|
+
await provider.addCredential({
|
|
28
|
+
...biometricsBBSRevocation,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const cred = await provider.getById(biometricsBBSRevocation.id);
|
|
32
|
+
|
|
33
|
+
expect(cred.id).toBe(biometricsBBSRevocation.id);
|
|
34
|
+
|
|
35
|
+
const witness = await provider.getMembershipWitness(cred.id);
|
|
36
|
+
|
|
37
|
+
expect(witness).toBe(biometricsBBSRevocation[ACUMM_WITNESS_PROP_KEY]);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe('syncCredentialStatus', () => {
|
|
42
|
+
beforeEach(async () => {
|
|
43
|
+
await provider.addCredential({
|
|
44
|
+
...customerCredential,
|
|
45
|
+
});
|
|
46
|
+
await provider.addCredential({
|
|
47
|
+
...biometricsBBSRevocation,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('should create credential status doc with verified status', async () => {
|
|
52
|
+
const mockFn = jest
|
|
53
|
+
.spyOn(credentialServiceRPC, 'verifyCredential')
|
|
54
|
+
.mockImplementation(async () => {
|
|
55
|
+
return {
|
|
56
|
+
verified: true,
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const statusDocs = await provider.syncCredentialStatus({});
|
|
61
|
+
|
|
62
|
+
expect(statusDocs.length).toBe(2);
|
|
63
|
+
|
|
64
|
+
for (const statusDoc of statusDocs) {
|
|
65
|
+
expect(statusDoc.status).toBe(CredentialStatus.Verified);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('should create credential status doc with revoked status', async () => {
|
|
70
|
+
jest
|
|
71
|
+
.spyOn(credentialServiceRPC, 'verifyCredential')
|
|
72
|
+
.mockImplementation(async () => {
|
|
73
|
+
return {
|
|
74
|
+
verified: false,
|
|
75
|
+
error: 'Revocation check failed',
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const statusDocs = await provider.syncCredentialStatus({});
|
|
80
|
+
|
|
81
|
+
expect(statusDocs.length).toBe(2);
|
|
82
|
+
|
|
83
|
+
for (const statusDoc of statusDocs) {
|
|
84
|
+
expect(statusDoc.status).toBe(CredentialStatus.Revoked);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('should not call verifyCredential twice', async () => {
|
|
89
|
+
jest
|
|
90
|
+
.spyOn(credentialServiceRPC, 'verifyCredential')
|
|
91
|
+
.mockImplementation(async () => {
|
|
92
|
+
return {
|
|
93
|
+
verified: true,
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// first call will do actual fetch
|
|
98
|
+
await provider.syncCredentialStatus({});
|
|
99
|
+
// additional calls will use cached data
|
|
100
|
+
const statusDocs = await provider.syncCredentialStatus({});
|
|
101
|
+
|
|
102
|
+
expect(statusDocs.length).toBe(2);
|
|
103
|
+
expect(credentialServiceRPC.verifyCredential).toHaveBeenCalledTimes(2);
|
|
104
|
+
|
|
105
|
+
for (const statusDoc of statusDocs) {
|
|
106
|
+
expect(statusDoc.status).toBe(CredentialStatus.Verified);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it('should update cache after 24 hours', async () => {
|
|
111
|
+
jest
|
|
112
|
+
.spyOn(credentialServiceRPC, 'verifyCredential')
|
|
113
|
+
.mockImplementation(async () => {
|
|
114
|
+
return {
|
|
115
|
+
verified: true,
|
|
116
|
+
};
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// load data into cache
|
|
120
|
+
await provider.syncCredentialStatus({});
|
|
121
|
+
|
|
122
|
+
// update statusDoc updateAt to 25 hours ago
|
|
123
|
+
const statusDoc = await wallet.getDocumentById(`${customerCredential.id}#status`);
|
|
124
|
+
statusDoc.updatedAt = new Date(Date.now() - 25 * 60 * 60 * 1000).toISOString();
|
|
125
|
+
await wallet.updateDocument(statusDoc);
|
|
126
|
+
|
|
127
|
+
const statusDocs = await provider.syncCredentialStatus({});
|
|
128
|
+
|
|
129
|
+
expect(statusDocs.length).toBe(2);
|
|
130
|
+
|
|
131
|
+
// Expect to have a second status fetch for the customerCredential
|
|
132
|
+
expect(credentialServiceRPC.verifyCredential).toHaveBeenCalledTimes(3);
|
|
133
|
+
|
|
134
|
+
for (const statusDoc of statusDocs) {
|
|
135
|
+
expect(statusDoc.status).toBe(CredentialStatus.Verified);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('should create status only for selected credential', async () => {
|
|
140
|
+
const mockFn = jest
|
|
141
|
+
.spyOn(credentialServiceRPC, 'verifyCredential')
|
|
142
|
+
.mockImplementation(async () => {
|
|
143
|
+
return {
|
|
144
|
+
verified: true,
|
|
145
|
+
};
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const statusDocs = await provider.syncCredentialStatus({
|
|
149
|
+
credentialIds: [customerCredential.id],
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
expect(statusDocs.length).toBe(1);
|
|
153
|
+
|
|
154
|
+
for (const statusDoc of statusDocs) {
|
|
155
|
+
expect(statusDoc.status).toBe(CredentialStatus.Verified);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
afterEach(() => {
|
|
161
|
+
(credentialServiceRPC.verifyCredential as any).mockReset();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|