Skip to content

Commit bd7a07c

Browse files
authored
fix(js): several fixes for js wrapper (#170)
Signed-off-by: Timo Glastra <[email protected]>
1 parent 329661d commit bd7a07c

File tree

15 files changed

+571
-446
lines changed

15 files changed

+571
-446
lines changed

wrappers/javascript/indy-vdr-nodejs/src/NodeJSIndyVdr.ts

+63-35
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ import type {
3535
Verifiers,
3636
} from '@hyperledger/indy-vdr-shared'
3737

38+
import { handleInvalidNullResponse, IndyVdrError } from '@hyperledger/indy-vdr-shared'
39+
3840
import { handleError } from './error'
3941
import {
4042
deallocateCallback,
@@ -46,6 +48,14 @@ import {
4648
} from './ffi'
4749
import { nativeIndyVdr } from './library'
4850

51+
function handleReturnPointer<Return>(returnValue: Buffer): Return {
52+
if (returnValue.address() === 0) {
53+
throw IndyVdrError.customError({ message: 'Unexpected null pointer' })
54+
}
55+
56+
return returnValue.deref() as Return
57+
}
58+
4959
export class NodeJSIndyVdr implements IndyVdr {
5060
private promisify = async (method: (nativeCallbackPtr: Buffer, id: number) => void): Promise<void> => {
5161
return new Promise((resolve, reject) => {
@@ -65,10 +75,10 @@ export class NodeJSIndyVdr implements IndyVdr {
6575
})
6676
}
6777

68-
private promisifyWithResponse = async <T>(
78+
private promisifyWithResponse = async <Return>(
6979
method: (nativeCallbackWithResponsePtr: Buffer, id: number) => void,
7080
isStream = false
71-
): Promise<T> => {
81+
): Promise<Return | null> => {
7282
return new Promise((resolve, reject) => {
7383
const cb: NativeCallbackWithResponse = (id, errorCode, response) => {
7484
deallocateCallback(id)
@@ -83,7 +93,9 @@ export class NodeJSIndyVdr implements IndyVdr {
8393
//this is required to add array brackets, and commas, to an invalid json object that
8494
// should be a list
8595
const mappedResponse = isStream ? '[' + response.replace(/\n/g, ',') + ']' : response
86-
resolve(JSON.parse(mappedResponse) as T)
96+
97+
if (mappedResponse.length === 0) return resolve(null)
98+
resolve(JSON.parse(mappedResponse) as Return)
8799
} catch (error) {
88100
reject(error)
89101
}
@@ -96,7 +108,8 @@ export class NodeJSIndyVdr implements IndyVdr {
96108
public getCurrentError(): string {
97109
const error = allocateString()
98110
handleError(nativeIndyVdr.indy_vdr_get_current_error(error))
99-
return error.deref() as string
111+
112+
return handleReturnPointer<string>(error)
100113
}
101114

102115
public version(): string {
@@ -130,7 +143,7 @@ export class NodeJSIndyVdr implements IndyVdr {
130143
nativeIndyVdr.indy_vdr_build_acceptance_mechanisms_request(submitterDid, aml, version, amlContext, requestHandle)
131144
)
132145

133-
return requestHandle.deref() as number
146+
return handleReturnPointer<number>(requestHandle)
134147
}
135148

136149
public buildGetAcceptanceMechanismsRequest(options: GetAcceptanceMechanismsRequestOptions): number {
@@ -149,7 +162,7 @@ export class NodeJSIndyVdr implements IndyVdr {
149162
)
150163
)
151164

152-
return requestHandle.deref() as number
165+
return handleReturnPointer<number>(requestHandle)
153166
}
154167

155168
public buildAttribRequest(options: AttribRequestOptions): number {
@@ -158,7 +171,7 @@ export class NodeJSIndyVdr implements IndyVdr {
158171

159172
handleError(nativeIndyVdr.indy_vdr_build_attrib_request(submitterDid, targetDid, hash, raw, enc, requestHandle))
160173

161-
return requestHandle.deref() as number
174+
return handleReturnPointer<number>(requestHandle)
162175
}
163176

164177
public buildGetAttribRequest(options: GetAttribRequestOptions): number {
@@ -167,7 +180,7 @@ export class NodeJSIndyVdr implements IndyVdr {
167180

168181
handleError(nativeIndyVdr.indy_vdr_build_get_attrib_request(submitterDid, targetDid, raw, hash, enc, requestHandle))
169182

170-
return requestHandle.deref() as number
183+
return handleReturnPointer<number>(requestHandle)
171184
}
172185

173186
public buildCredDefRequest(options: CredentialDefinitionRequestOptions): number {
@@ -176,7 +189,7 @@ export class NodeJSIndyVdr implements IndyVdr {
176189

177190
handleError(nativeIndyVdr.indy_vdr_build_cred_def_request(submitterDid, credentialDefinition, requestHandle))
178191

179-
return requestHandle.deref() as number
192+
return handleReturnPointer<number>(requestHandle)
180193
}
181194

182195
public buildGetCredDefRequest(options: GetCredentialDefinitionRequestOptions): number {
@@ -185,7 +198,7 @@ export class NodeJSIndyVdr implements IndyVdr {
185198

186199
handleError(nativeIndyVdr.indy_vdr_build_get_cred_def_request(submitterDid, credentialDefinitionId, requestHandle))
187200

188-
return requestHandle.deref() as number
201+
return handleReturnPointer<number>(requestHandle)
189202
}
190203

191204
public buildGetRevocRegDefRequest(options: GetRevocationRegistryDefinitionRequestOptions): number {
@@ -196,7 +209,7 @@ export class NodeJSIndyVdr implements IndyVdr {
196209
nativeIndyVdr.indy_vdr_build_get_revoc_reg_def_request(submitterDid, revocationRegistryId, requestHandle)
197210
)
198211

199-
return requestHandle.deref() as number
212+
return handleReturnPointer<number>(requestHandle)
200213
}
201214

202215
public buildGetRevocRegRequest(options: GetRevocationRegistryRequestOptions): number {
@@ -207,7 +220,7 @@ export class NodeJSIndyVdr implements IndyVdr {
207220
nativeIndyVdr.indy_vdr_build_get_revoc_reg_request(submitterDid, revocationRegistryId, timestamp, requestHandle)
208221
)
209222

210-
return requestHandle.deref() as number
223+
return handleReturnPointer<number>(requestHandle)
211224
}
212225

213226
public buildGetRevocRegDeltaRequest(options: GetRevocationRegistryDeltaRequestOptions): number {
@@ -226,7 +239,7 @@ export class NodeJSIndyVdr implements IndyVdr {
226239
)
227240
)
228241

229-
return requestHandle.deref() as number
242+
return handleReturnPointer<number>(requestHandle)
230243
}
231244

232245
public buildRevocRegDefRequest(options: RevocationRegistryDefinitionRequestOptions): number {
@@ -237,7 +250,7 @@ export class NodeJSIndyVdr implements IndyVdr {
237250
nativeIndyVdr.indy_vdr_build_revoc_reg_def_request(submitterDid, revocationRegistryDefinition, requestHandle)
238251
)
239252

240-
return requestHandle.deref() as number
253+
return handleReturnPointer<number>(requestHandle)
241254
}
242255

243256
public buildCustomRequest(options: CustomRequestOptions): number {
@@ -246,7 +259,7 @@ export class NodeJSIndyVdr implements IndyVdr {
246259

247260
handleError(nativeIndyVdr.indy_vdr_build_custom_request(customRequest, requestHandle))
248261

249-
return requestHandle.deref() as number
262+
return handleReturnPointer<number>(requestHandle)
250263
}
251264

252265
public buildDisableAllTxnAuthorAgreementsRequest(
@@ -257,7 +270,7 @@ export class NodeJSIndyVdr implements IndyVdr {
257270

258271
handleError(nativeIndyVdr.indy_vdr_build_disable_all_txn_author_agreements_request(submitterDid, requestHandle))
259272

260-
return requestHandle.deref() as number
273+
return handleReturnPointer<number>(requestHandle)
261274
}
262275

263276
public buildGetNymRequest(options: GetNymRequestOptions): number {
@@ -266,7 +279,7 @@ export class NodeJSIndyVdr implements IndyVdr {
266279

267280
handleError(nativeIndyVdr.indy_vdr_build_get_nym_request(submitterDid, dest, requestHandle))
268281

269-
return requestHandle.deref() as number
282+
return handleReturnPointer<number>(requestHandle)
270283
}
271284

272285
public buildGetSchemaRequest(options: GetSchemaRequestOptions): number {
@@ -275,7 +288,7 @@ export class NodeJSIndyVdr implements IndyVdr {
275288

276289
handleError(nativeIndyVdr.indy_vdr_build_get_schema_request(submitterDid, schemaId, requestHandle))
277290

278-
return requestHandle.deref() as number
291+
return handleReturnPointer<number>(requestHandle)
279292
}
280293

281294
public buildGetTxnAuthorAgreementRequest(options: GetTransactionAuthorAgreementRequestOptions): number {
@@ -284,7 +297,7 @@ export class NodeJSIndyVdr implements IndyVdr {
284297

285298
handleError(nativeIndyVdr.indy_vdr_build_get_txn_author_agreement_request(submitterDid, data, requestHandle))
286299

287-
return requestHandle.deref() as number
300+
return handleReturnPointer<number>(requestHandle)
288301
}
289302

290303
public buildGetTxnRequest(options: GetTransactionRequestOptions): number {
@@ -293,7 +306,7 @@ export class NodeJSIndyVdr implements IndyVdr {
293306

294307
handleError(nativeIndyVdr.indy_vdr_build_get_txn_request(submitterDid, ledgerType, seqNo, requestHandle))
295308

296-
return requestHandle.deref() as number
309+
return handleReturnPointer<number>(requestHandle)
297310
}
298311

299312
public buildGetValidatorInfoRequest(options: GetValidatorInfoActionOptions): number {
@@ -302,7 +315,7 @@ export class NodeJSIndyVdr implements IndyVdr {
302315

303316
handleError(nativeIndyVdr.indy_vdr_build_get_validator_info_request(submitterDid, requestHandle))
304317

305-
return requestHandle.deref() as number
318+
return handleReturnPointer<number>(requestHandle)
306319
}
307320

308321
public buildNymRequest(options: NymRequestOptions): number {
@@ -311,7 +324,7 @@ export class NodeJSIndyVdr implements IndyVdr {
311324

312325
handleError(nativeIndyVdr.indy_vdr_build_nym_request(submitterDid, dest, verkey, alias, role, requestHandle))
313326

314-
return requestHandle.deref() as number
327+
return handleReturnPointer<number>(requestHandle)
315328
}
316329

317330
public buildRevocRegEntryRequest(options: RevocationRegistryEntryRequestOptions): number {
@@ -329,7 +342,7 @@ export class NodeJSIndyVdr implements IndyVdr {
329342
)
330343
)
331344

332-
return requestHandle.deref() as number
345+
return handleReturnPointer<number>(requestHandle)
333346
}
334347

335348
public buildSchemaRequest(options: SchemaRequestOptions): number {
@@ -338,7 +351,7 @@ export class NodeJSIndyVdr implements IndyVdr {
338351

339352
handleError(nativeIndyVdr.indy_vdr_build_schema_request(submitterDid, schema, requestHandle))
340353

341-
return requestHandle.deref() as number
354+
return handleReturnPointer<number>(requestHandle)
342355
}
343356

344357
public buildTxnAuthorAgreementRequest(options: TransactionAuthorAgreementRequestOptions): number {
@@ -359,7 +372,7 @@ export class NodeJSIndyVdr implements IndyVdr {
359372
)
360373
)
361374

362-
return requestHandle.deref() as number
375+
return handleReturnPointer<number>(requestHandle)
363376
}
364377

365378
public poolCreate(options: PoolCreateOptions): number {
@@ -368,7 +381,7 @@ export class NodeJSIndyVdr implements IndyVdr {
368381

369382
handleError(nativeIndyVdr.indy_vdr_pool_create(parameters, poolHandle))
370383

371-
return poolHandle.deref() as number
384+
return handleReturnPointer<number>(poolHandle)
372385
}
373386

374387
public async poolRefresh(options: { poolHandle: number }): Promise<void> {
@@ -377,41 +390,55 @@ export class NodeJSIndyVdr implements IndyVdr {
377390
return this.promisify((cbPtr, id) => nativeIndyVdr.indy_vdr_pool_refresh(poolHandle, cbPtr, id))
378391
}
379392

380-
public poolGetStatus(options: { poolHandle: number }): Promise<PoolStatus> {
393+
public async poolGetStatus(options: { poolHandle: number }): Promise<PoolStatus> {
381394
const { poolHandle } = serializeArguments(options)
382395

383-
return this.promisifyWithResponse((cbPtr, id) => nativeIndyVdr.indy_vdr_pool_get_status(poolHandle, cbPtr, id))
396+
const poolStatus = await this.promisifyWithResponse<PoolStatus>((cbPtr, id) =>
397+
nativeIndyVdr.indy_vdr_pool_get_status(poolHandle, cbPtr, id)
398+
)
399+
400+
return handleInvalidNullResponse(poolStatus)
384401
}
385402

386403
public async poolGetTransactions(options: { poolHandle: number }): Promise<Transactions> {
387404
const { poolHandle } = serializeArguments(options)
388405

389-
return this.promisifyWithResponse<Transactions>(
406+
const transactions = await this.promisifyWithResponse<Transactions>(
390407
(cbPtr, id) => nativeIndyVdr.indy_vdr_pool_get_transactions(poolHandle, cbPtr, id),
391408
true
392409
)
410+
411+
return handleInvalidNullResponse(transactions)
393412
}
394413

395414
public async poolGetVerifiers(options: { poolHandle: number }): Promise<Verifiers> {
396415
const { poolHandle } = serializeArguments(options)
397416

398-
return this.promisifyWithResponse((cbPtr, id) => nativeIndyVdr.indy_vdr_pool_get_verifiers(poolHandle, cbPtr, id))
417+
const verifiers = await this.promisifyWithResponse<Verifiers>((cbPtr, id) =>
418+
nativeIndyVdr.indy_vdr_pool_get_verifiers(poolHandle, cbPtr, id)
419+
)
420+
421+
return handleInvalidNullResponse(verifiers)
399422
}
400423

401424
public async poolSubmitAction<T>(options: PoolSubmitActionOptions & { poolHandle: number }): Promise<T> {
402425
const { requestHandle, poolHandle, nodes, timeout } = serializeArguments(options)
403426

404-
return this.promisifyWithResponse((cbPtr, id) =>
427+
const response = await this.promisifyWithResponse<T>((cbPtr, id) =>
405428
nativeIndyVdr.indy_vdr_pool_submit_action(poolHandle, requestHandle, nodes, timeout, cbPtr, id)
406429
)
430+
431+
return handleInvalidNullResponse(response)
407432
}
408433

409434
public async poolSubmitRequest<T>(options: PoolSubmitRequestOptions & { poolHandle: number }): Promise<T> {
410435
const { requestHandle, poolHandle } = serializeArguments(options)
411436

412-
return this.promisifyWithResponse((cbPtr, id) =>
437+
const response = await this.promisifyWithResponse<T>((cbPtr, id) =>
413438
nativeIndyVdr.indy_vdr_pool_submit_request(poolHandle, requestHandle, cbPtr, id)
414439
)
440+
441+
return handleInvalidNullResponse(response)
415442
}
416443

417444
public poolClose(options: { poolHandle: number }): void {
@@ -435,7 +462,7 @@ export class NodeJSIndyVdr implements IndyVdr {
435462
)
436463
)
437464

438-
return output.deref() as string
465+
return handleReturnPointer<string>(output)
439466
}
440467

441468
public requestFree(options: { requestHandle: number }): void {
@@ -450,7 +477,8 @@ export class NodeJSIndyVdr implements IndyVdr {
450477

451478
handleError(nativeIndyVdr.indy_vdr_request_get_body(requestHandle, output))
452479

453-
return JSON.parse(output.deref() as string) as T
480+
const outputString = handleReturnPointer<string>(output)
481+
return JSON.parse(outputString) as T
454482
}
455483

456484
public requestGetSignatureInput(options: { requestHandle: number }): string {
@@ -459,7 +487,7 @@ export class NodeJSIndyVdr implements IndyVdr {
459487

460488
handleError(nativeIndyVdr.indy_vdr_request_get_signature_input(requestHandle, output))
461489

462-
return output.deref() as string
490+
return handleReturnPointer<string>(output)
463491
}
464492

465493
public requestSetEndorser(options: RequestSetEndorserOptions & { requestHandle: number }): void {

0 commit comments

Comments
 (0)