@tdxvolt/volt-client-grpc 0.20.10 → 0.20.12

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/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.20.10",
6
+ "version": "0.20.12",
7
7
  "description": "tdx Volt library for nodejs clients",
8
8
  "type": "module",
9
9
  "exports": {
@@ -43,4 +43,4 @@
43
43
  "protobufjs": "^7.4.0",
44
44
  "uuid": "^8.1.0"
45
45
  }
46
- }
46
+ }
package/src/grpc-call.js CHANGED
@@ -361,11 +361,6 @@ export default class GRPCCall extends EventEmitter {
361
361
  );
362
362
 
363
363
  this._call.on("data", (streamResponse) => {
364
- if (this._ended) {
365
- log("ignoring data after end on %s", this._methodName);
366
- return;
367
- }
368
-
369
364
  try {
370
365
  const parsedResponse = _parseResponse.call(
371
366
  this,
@@ -373,6 +368,13 @@ export default class GRPCCall extends EventEmitter {
373
368
  this._initialRequest.meta,
374
369
  streamResponse
375
370
  );
371
+
372
+ if (this._ended && !parsedResponse.ended) {
373
+ log("ignoring data after end on %s", this._methodName);
374
+ log(parsedResponse);
375
+ return;
376
+ }
377
+
376
378
  if (parsedResponse.key_exchange) {
377
379
  const peerKey = keyFromPem(
378
380
  parsedResponse.key_exchange.encryption_key
@@ -404,9 +406,6 @@ export default class GRPCCall extends EventEmitter {
404
406
  } else if (parsedResponse.ended) {
405
407
  if (parsedResponse.error) {
406
408
  this.emit("error", new Error(parsedResponse.error));
407
- } else {
408
- // Not sure this is necessary - we should receive "end" from grpc soon...
409
- this.emit("end");
410
409
  }
411
410
  } else {
412
411
  log("method id is %s", parsedResponse.methodId);
@@ -265,18 +265,18 @@ export function connectInternal(helloPayload) {
265
265
  this._voltConnection.on("connected", (session) => {
266
266
  this._session = session;
267
267
  this._connected = !!session;
268
+ this.emit("connected", session);
268
269
  if (!this._connected) {
269
270
  onDisconnected();
270
271
  }
271
- this.emit("connected", session);
272
272
  });
273
273
 
274
274
  this._voltConnection.on("error", (err) => {
275
275
  // Should auto-reconnect.
276
276
  log("Volt connection error [%s]", err.message);
277
277
  if (this._connected) {
278
- onDisconnected();
279
278
  this.emit("connected", false);
279
+ onDisconnected();
280
280
  }
281
281
 
282
282
  if (err.message.endsWith("session invalid")) {
@@ -1,3 +1,4 @@
1
+ import { resolveVoltConfig } from "@tdxvolt/volt-utility";
1
2
  import debug from "debug";
2
3
  import EventEmitter from "events";
3
4
  import fs from "fs";
@@ -11,7 +12,6 @@ import {
11
12
  unaryCallInternal
12
13
  } from "./volt-client-internal.js";
13
14
  import { VoltCredential } from "./volt-credential.js";
14
- import { resolveVoltConfig } from "@tdxvolt/volt-utility";
15
15
 
16
16
  const { readFile } = fs.promises;
17
17
  const log = debug("volt-client-grpc:volt-client");
@@ -86,12 +86,19 @@ export class VoltClient extends EventEmitter {
86
86
  * instead of a DID-based authentication session.
87
87
  * @param {string} [options.exchangeToken] - optional token to exchange in return for an authenticated session.
88
88
  * @param {boolean} [options.waitForAuth] - whether to block and poll on 'prompt' authenticate decisions. Default is true.
89
+ * @param {boolean} [options.noResolve] - whether to skip resolving the Volt configuration. Default is false.
89
90
  */
90
91
  async initialise(config, options = {}) {
91
92
  log("initialise ", config, options);
92
93
 
93
- const { ownDID, noDID, didRegistryList, exchangeToken, extraConfig } =
94
- options;
94
+ const {
95
+ ownDID,
96
+ noDID,
97
+ didRegistryList,
98
+ exchangeToken,
99
+ extraConfig,
100
+ noResolve
101
+ } = options;
95
102
  const waitForAuth =
96
103
  options.waitForAuth === undefined ? true : !!options.waitForAuth;
97
104
 
@@ -141,10 +148,12 @@ export class VoltClient extends EventEmitter {
141
148
  throw new Error("client_name property required in config");
142
149
  }
143
150
 
144
- this._config.volt = await resolveVoltConfig(
145
- this._config.volt,
146
- didRegistryList
147
- );
151
+ if (!noResolve) {
152
+ this._config.volt = await resolveVoltConfig(
153
+ this._config.volt,
154
+ didRegistryList
155
+ );
156
+ }
148
157
 
149
158
  this._voltConfig = this._config.volt;
150
159
 
@@ -207,7 +216,7 @@ export class VoltClient extends EventEmitter {
207
216
  this._credential.saveCache();
208
217
  }
209
218
 
210
- return Promise.resolve(this._config);
219
+ return Promise.resolve(this.credential.config);
211
220
  } catch (err) {
212
221
  log("failure starting Volt client [%s]", err.message);
213
222
  throw err;
@@ -322,10 +331,18 @@ export class VoltClient extends EventEmitter {
322
331
  * VoltAPI - resource management
323
332
  */
324
333
 
334
+ AddRelay(request) {
335
+ return unaryCallInternal.call(this, "AddRelay", request);
336
+ }
337
+
325
338
  CanAccessResource(request) {
326
339
  return unaryCallInternal.call(this, "CanAccessResource", request);
327
340
  }
328
341
 
342
+ CopyResource(request) {
343
+ return unaryCallInternal.call(this, "CopyResource", request);
344
+ }
345
+
329
346
  DeleteResource(request) {
330
347
  return unaryCallInternal.call(this, "DeleteResource", request);
331
348
  }
@@ -350,6 +367,10 @@ export class VoltClient extends EventEmitter {
350
367
  return unaryCallInternal.call(this, "GetResourceDescendants", request);
351
368
  }
352
369
 
370
+ MoveResource(request) {
371
+ return unaryCallInternal.call(this, "MoveResource", request);
372
+ }
373
+
353
374
  RequestAccess(request) {
354
375
  return unaryCallInternal.call(this, "RequestAccess", request);
355
376
  }
@@ -358,8 +379,44 @@ export class VoltClient extends EventEmitter {
358
379
  return unaryCallInternal.call(this, "SaveResource", request);
359
380
  }
360
381
 
361
- SaveResourceAttribute(request) {
362
- return unaryCallInternal.call(this, "SaveResourceAttribute", request);
382
+ SaveDatabase(request) {
383
+ return unaryCallInternal.call(this, "SaveDatabase", request);
384
+ }
385
+
386
+ SaveHttpFileServer(request) {
387
+ return unaryCallInternal.call(this, "SaveHttpFileServer", request);
388
+ }
389
+
390
+ SaveHttpForwarder(request) {
391
+ return unaryCallInternal.call(this, "SaveHttpForwarder", request);
392
+ }
393
+
394
+ SaveHttpRestApiServer(request) {
395
+ return unaryCallInternal.call(this, "SaveHttpRestApiServer", request);
396
+ }
397
+
398
+ SaveHttpRestApiNode(request) {
399
+ return unaryCallInternal.call(this, "SaveHttpRestApiNode", request);
400
+ }
401
+
402
+ SaveMirroredLink(request) {
403
+ return unaryCallInternal.call(this, "SaveMirroredLink", request);
404
+ }
405
+
406
+ SaveSyncDatabase(request) {
407
+ return unaryCallInternal.call(this, "SaveSyncDatabase", request);
408
+ }
409
+
410
+ SaveSynapse(request) {
411
+ return unaryCallInternal.call(this, "SaveSynapse", request);
412
+ }
413
+
414
+ CreateSynapseConnection(request) {
415
+ return unaryCallInternal.call(this, "CreateSynapseConnection", request);
416
+ }
417
+
418
+ SaveSymbolicLink(request) {
419
+ return unaryCallInternal.call(this, "SaveSymbolicLink", request);
363
420
  }
364
421
 
365
422
  SetServiceStatus(request) {
@@ -374,26 +431,18 @@ export class VoltClient extends EventEmitter {
374
431
  return unaryCallInternal.call(this, "Authenticate", request);
375
432
  }
376
433
 
377
- Bind(request) {
378
- return unaryCallInternal.call(this, "Bind", request);
434
+ CheckCompatibility(request) {
435
+ return unaryCallInternal.call(this, "CheckCompatibility", request);
379
436
  }
380
437
 
381
438
  DeleteAccess(request) {
382
439
  return unaryCallInternal.call(this, "DeleteAccess", request);
383
440
  }
384
441
 
385
- DeleteVolt(request) {
386
- return unaryCallInternal.call(this, "DeleteVolt", request);
387
- }
388
-
389
442
  GetAccess(request) {
390
443
  return unaryCallInternal.call(this, "GetAccess", request);
391
444
  }
392
445
 
393
- GetBindings(request) {
394
- return unaryCallInternal.call(this, "GetBindings", request);
395
- }
396
-
397
446
  GetIdentities(request) {
398
447
  return unaryCallInternal.call(this, "GetIdentities", request);
399
448
  }
@@ -402,40 +451,44 @@ export class VoltClient extends EventEmitter {
402
451
  return unaryCallInternal.call(this, "GetIdentity", request);
403
452
  }
404
453
 
405
- GetIdentityToken(request) {
406
- return unaryCallInternal.call(this, "GetIdentityToken", request);
454
+ GetOneTimeToken(request) {
455
+ return unaryCallInternal.call(this, "GetOneTimeToken", request);
456
+ }
457
+
458
+ GetParameters(request) {
459
+ return unaryCallInternal.call(this, "GetParameters", request);
407
460
  }
408
461
 
409
462
  GetPolicy(request) {
410
463
  return unaryCallInternal.call(this, "GetPolicy", request);
411
464
  }
412
465
 
413
- GetSettings(request) {
414
- return unaryCallInternal.call(this, "GetSettings", request);
466
+ GetSessions(request) {
467
+ return unaryCallInternal.call(this, "GetSessions", request);
415
468
  }
416
469
 
417
470
  SaveAccess(request) {
418
471
  return unaryCallInternal.call(this, "SaveAccess", request);
419
472
  }
420
473
 
421
- SaveCloudConnection(request) {
422
- return unaryCallInternal.call(this, "SaveCloudConnection", request);
423
- }
424
-
425
474
  SaveIdentity(request) {
426
475
  return unaryCallInternal.call(this, "SaveIdentity", request);
427
476
  }
428
477
 
429
- SaveSettings(request) {
430
- return unaryCallInternal.call(this, "SaveSettings", request);
478
+ SaveParameters(request) {
479
+ return unaryCallInternal.call(this, "SaveParameters", request);
480
+ }
481
+
482
+ SaveSession(request) {
483
+ return unaryCallInternal.call(this, "SaveSession", request);
431
484
  }
432
485
 
433
486
  SetAccessRequestDecision(request) {
434
487
  return unaryCallInternal.call(this, "SetAccessRequestDecision", request);
435
488
  }
436
489
 
437
- SetBindingDecision(request) {
438
- return unaryCallInternal.call(this, "SetBindingDecision", request);
490
+ SetPolicy(request) {
491
+ return unaryCallInternal.call(this, "SetPolicy", request);
439
492
  }
440
493
 
441
494
  Shutdown(request) {
@@ -446,6 +499,16 @@ export class VoltClient extends EventEmitter {
446
499
  return unaryCallInternal.call(this, "SignVerify", request);
447
500
  }
448
501
 
502
+ /**
503
+ * VoltAPI - streaming (bidi). Use connect() for Connect stream.
504
+ * Invoke is for relay proxying; returns a duplex stream of InvokeRequest/InvokeResponse.
505
+ */
506
+ Invoke(request) {
507
+ const grpcClient = this.getVoltAPIClient();
508
+ const invokeCall = new GRPCCall(this, "Invoke", "METHOD_TYPE_BIDI");
509
+ return invokeCall.start(grpcClient, request);
510
+ }
511
+
449
512
  /**
450
513
  * FileAPI
451
514
  */
@@ -662,6 +725,9 @@ export class VoltClient extends EventEmitter {
662
725
  return subscribeCall.start(grpcClient, request);
663
726
  }
664
727
 
728
+ /**
729
+ * SyncAPI
730
+ */
665
731
  SyncDocument(request) {
666
732
  const grpcClient = this.getVoltAPIClient();
667
733
 
@@ -672,4 +738,23 @@ export class VoltClient extends EventEmitter {
672
738
  );
673
739
  return syncDocumentCall.start(grpcClient, request);
674
740
  }
741
+
742
+ SetSynapseDocumentMetadata(request) {
743
+ return unaryCallInternal.call(this, "SetSynapseDocumentMetadata", request);
744
+ }
745
+
746
+ WatchSynapsePath(request) {
747
+ const grpcClient = this.getVoltAPIClient();
748
+
749
+ const watchPathCall = new GRPCCall(
750
+ this,
751
+ "WatchSynapsePath",
752
+ "METHOD_TYPE_BIDI"
753
+ );
754
+ return watchPathCall.start(grpcClient, request);
755
+ }
756
+
757
+ WriteSynapsePath(request) {
758
+ return unaryCallInternal.call(this, "WriteSynapsePath", request);
759
+ }
675
760
  }
@@ -20,6 +20,7 @@ function _cleanUp(immediateReconnect) {
20
20
  }
21
21
 
22
22
  if (this._dying) {
23
+ log("dying - clearing reconnect timer");
23
24
  clearTimeout(this._reconnectTimer);
24
25
  } else if (immediateReconnect || (this._autoRetry && !this._reconnectTimer)) {
25
26
  this._reconnectTimer = setTimeout(
@@ -32,6 +33,7 @@ function _cleanUp(immediateReconnect) {
32
33
  }
33
34
 
34
35
  if (this.call?.writable) {
36
+ log("ending Connect call");
35
37
  this.call.end();
36
38
  }
37
39
  }
@@ -122,9 +124,7 @@ function _doConnect(connectHello) {
122
124
  });
123
125
 
124
126
  this.call.on("end", () => {
125
- if (this._connectionId) {
126
- this.emit("connected", false);
127
- }
127
+ this.emit("connected", false);
128
128
  _cleanUp.call(this);
129
129
  });
130
130