@milaboratories/pl-client 2.16.11 → 2.16.13

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.
Files changed (54) hide show
  1. package/dist/core/driver.cjs +1 -1
  2. package/dist/core/driver.cjs.map +1 -1
  3. package/dist/core/driver.js +1 -1
  4. package/dist/core/driver.js.map +1 -1
  5. package/dist/core/errors.cjs +2 -0
  6. package/dist/core/errors.cjs.map +1 -1
  7. package/dist/core/errors.d.ts.map +1 -1
  8. package/dist/core/errors.js +2 -0
  9. package/dist/core/errors.js.map +1 -1
  10. package/dist/core/ll_client.cjs +32 -9
  11. package/dist/core/ll_client.cjs.map +1 -1
  12. package/dist/core/ll_client.d.ts.map +1 -1
  13. package/dist/core/ll_client.js +32 -9
  14. package/dist/core/ll_client.js.map +1 -1
  15. package/dist/core/ll_transaction.cjs +10 -0
  16. package/dist/core/ll_transaction.cjs.map +1 -1
  17. package/dist/core/ll_transaction.d.ts +1 -0
  18. package/dist/core/ll_transaction.d.ts.map +1 -1
  19. package/dist/core/ll_transaction.js +10 -0
  20. package/dist/core/ll_transaction.js.map +1 -1
  21. package/dist/core/websocket_stream.cjs +330 -0
  22. package/dist/core/websocket_stream.cjs.map +1 -0
  23. package/dist/core/websocket_stream.d.ts +67 -0
  24. package/dist/core/websocket_stream.d.ts.map +1 -0
  25. package/dist/core/websocket_stream.js +328 -0
  26. package/dist/core/websocket_stream.js.map +1 -0
  27. package/dist/helpers/retry_strategy.cjs +92 -0
  28. package/dist/helpers/retry_strategy.cjs.map +1 -0
  29. package/dist/helpers/retry_strategy.d.ts +24 -0
  30. package/dist/helpers/retry_strategy.d.ts.map +1 -0
  31. package/dist/helpers/retry_strategy.js +89 -0
  32. package/dist/helpers/retry_strategy.js.map +1 -0
  33. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +136 -0
  34. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
  35. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +75 -1
  36. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +1 -1
  37. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +135 -1
  38. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
  39. package/dist/proto-rest/index.cjs +16 -2
  40. package/dist/proto-rest/index.cjs.map +1 -1
  41. package/dist/proto-rest/index.d.ts.map +1 -1
  42. package/dist/proto-rest/index.js +16 -2
  43. package/dist/proto-rest/index.js.map +1 -1
  44. package/package.json +6 -6
  45. package/src/core/driver.ts +1 -1
  46. package/src/core/errors.ts +1 -0
  47. package/src/core/ll_client.ts +42 -9
  48. package/src/core/ll_transaction.test.ts +18 -0
  49. package/src/core/ll_transaction.ts +12 -0
  50. package/src/core/websocket_stream.test.ts +423 -0
  51. package/src/core/websocket_stream.ts +400 -0
  52. package/src/helpers/retry_strategy.ts +123 -0
  53. package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.ts +179 -1
  54. package/src/proto-rest/index.ts +17 -2
@@ -39,8 +39,11 @@ import { Status } from "../../../../googleapis/googleapis/google/rpc/status";
39
39
  * - client reads server responses for each messages sent. Client can batch
40
40
  * writes and reads: e.g. send 3 messages, read 2 responses, send one
41
41
  * more, read 2;
42
- * - to finish communication client sends 'commit' message and reads last
42
+ * - to finish communication client sends 'commit' or 'discard' message and reads last
43
43
  * response;
44
+ * - to make server interrupt communication, client sends 'stream_close' message and reads to the last
45
+ * server response. This allows graceful stream close, waiting for all queued server responses
46
+ * to be sent before closing the stream.
44
47
  *
45
48
  * Detailed description of the process.
46
49
  *
@@ -117,6 +120,10 @@ import { Status } from "../../../../googleapis/googleapis/google/rpc/status";
117
120
  * - server stops reading client stream and does the commit/discard action.
118
121
  * - once transaction is closed, server sends the result to client and
119
122
  * closes server stream.
123
+ * - client stream reading may be interrupted by special 'stream_close' message, which
124
+ * causes transaction automatic discard and does not produce additional reply message.
125
+ * This 'stream_close' message also does not require any 'request_id' value and does not
126
+ * produce any response from server side.
120
127
  *
121
128
  * At this point the transaction over gRPC is considered as finalized, all
122
129
  * local IDs generated within the transaction are no longer valid.
@@ -171,6 +178,22 @@ export interface TxAPI_ClientMessage {
171
178
  * @generated from protobuf field: MiLaboratories.PL.API.TxAPI.Discard.Request tx_discard = 13
172
179
  */
173
180
  txDiscard: TxAPI_Discard_Request; // discard the transaction and close the stream
181
+ } | {
182
+ oneofKind: "streamClose";
183
+ /**
184
+ * Interrupt the transaction network stream on server side.
185
+ *
186
+ * This allows to gracefully close network connection and discard the associated transaction,
187
+ * ensuring all pending server responses are sent to the client before closing.
188
+ * We use this in RO transactions to imitate the feature of 'half-open' connection
189
+ * available in pure gRPC, when we work with WebSockets.
190
+ * Pure gRPC uses 'end of client messages stream' as a criteria for graceful discard.
191
+ * Pure WebSocket does not allow this, breaking entire connection at once. stream_close helps to get
192
+ * behaviour as we have for gRPC.
193
+ *
194
+ * @generated from protobuf field: MiLaboratories.PL.API.TxAPI.CloseStream.Request stream_close = 14
195
+ */
196
+ streamClose: TxAPI_CloseStream_Request; // ask server to send all pending messages and close the stream
174
197
  } | {
175
198
  oneofKind: "resourceCreateRoot";
176
199
  /**
@@ -535,6 +558,12 @@ export interface TxAPI_ServerMessage {
535
558
  * @generated from protobuf field: MiLaboratories.PL.API.TxAPI.Discard.Response tx_discard = 13
536
559
  */
537
560
  txDiscard: TxAPI_Discard_Response;
561
+ } | {
562
+ oneofKind: "streamClose";
563
+ /**
564
+ * @generated from protobuf field: MiLaboratories.PL.API.TxAPI.CloseStream.Response stream_close = 14
565
+ */
566
+ streamClose: TxAPI_CloseStream_Response;
538
567
  } | {
539
568
  oneofKind: "resourceCreateRoot";
540
569
  /**
@@ -979,6 +1008,21 @@ export interface TxAPI_Discard_Request {
979
1008
  */
980
1009
  export interface TxAPI_Discard_Response {
981
1010
  }
1011
+ /**
1012
+ * @generated from protobuf message MiLaboratories.PL.API.TxAPI.CloseStream
1013
+ */
1014
+ export interface TxAPI_CloseStream {
1015
+ }
1016
+ /**
1017
+ * @generated from protobuf message MiLaboratories.PL.API.TxAPI.CloseStream.Request
1018
+ */
1019
+ export interface TxAPI_CloseStream_Request {
1020
+ }
1021
+ /**
1022
+ * @generated from protobuf message MiLaboratories.PL.API.TxAPI.CloseStream.Response
1023
+ */
1024
+ export interface TxAPI_CloseStream_Response {
1025
+ }
982
1026
  /**
983
1027
  * @generated from protobuf message MiLaboratories.PL.API.TxAPI.Sync
984
1028
  */
@@ -3152,6 +3196,7 @@ class TxAPI_ClientMessage$Type extends MessageType<TxAPI_ClientMessage> {
3152
3196
  { no: 11, name: "tx_open", kind: "message", oneof: "request", T: () => TxAPI_Open_Request },
3153
3197
  { no: 12, name: "tx_commit", kind: "message", oneof: "request", T: () => TxAPI_Commit_Request },
3154
3198
  { no: 13, name: "tx_discard", kind: "message", oneof: "request", T: () => TxAPI_Discard_Request },
3199
+ { no: 14, name: "stream_close", kind: "message", oneof: "request", T: () => TxAPI_CloseStream_Request },
3155
3200
  { no: 58, name: "resource_create_root", kind: "message", oneof: "request", T: () => ResourceAPI_CreateRoot_Request },
3156
3201
  { no: 57, name: "resource_remove", kind: "message", oneof: "request", T: () => ResourceAPI_Remove_Request },
3157
3202
  { no: 51, name: "resource_create_struct", kind: "message", oneof: "request", T: () => ResourceAPI_CreateStruct_Request },
@@ -3242,6 +3287,12 @@ class TxAPI_ClientMessage$Type extends MessageType<TxAPI_ClientMessage> {
3242
3287
  txDiscard: TxAPI_Discard_Request.internalBinaryRead(reader, reader.uint32(), options, (message.request as any).txDiscard)
3243
3288
  };
3244
3289
  break;
3290
+ case /* MiLaboratories.PL.API.TxAPI.CloseStream.Request stream_close */ 14:
3291
+ message.request = {
3292
+ oneofKind: "streamClose",
3293
+ streamClose: TxAPI_CloseStream_Request.internalBinaryRead(reader, reader.uint32(), options, (message.request as any).streamClose)
3294
+ };
3295
+ break;
3245
3296
  case /* MiLaboratories.PL.API.ResourceAPI.CreateRoot.Request resource_create_root */ 58:
3246
3297
  message.request = {
3247
3298
  oneofKind: "resourceCreateRoot",
@@ -3590,6 +3641,9 @@ class TxAPI_ClientMessage$Type extends MessageType<TxAPI_ClientMessage> {
3590
3641
  /* MiLaboratories.PL.API.TxAPI.Discard.Request tx_discard = 13; */
3591
3642
  if (message.request.oneofKind === "txDiscard")
3592
3643
  TxAPI_Discard_Request.internalBinaryWrite(message.request.txDiscard, writer.tag(13, WireType.LengthDelimited).fork(), options).join();
3644
+ /* MiLaboratories.PL.API.TxAPI.CloseStream.Request stream_close = 14; */
3645
+ if (message.request.oneofKind === "streamClose")
3646
+ TxAPI_CloseStream_Request.internalBinaryWrite(message.request.streamClose, writer.tag(14, WireType.LengthDelimited).fork(), options).join();
3593
3647
  /* MiLaboratories.PL.API.ResourceAPI.CreateStruct.Request resource_create_struct = 51; */
3594
3648
  if (message.request.oneofKind === "resourceCreateStruct")
3595
3649
  ResourceAPI_CreateStruct_Request.internalBinaryWrite(message.request.resourceCreateStruct, writer.tag(51, WireType.LengthDelimited).fork(), options).join();
@@ -3771,6 +3825,7 @@ class TxAPI_ServerMessage$Type extends MessageType<TxAPI_ServerMessage> {
3771
3825
  { no: 11, name: "tx_open", kind: "message", oneof: "response", T: () => TxAPI_Open_Response },
3772
3826
  { no: 12, name: "tx_commit", kind: "message", oneof: "response", T: () => TxAPI_Commit_Response },
3773
3827
  { no: 13, name: "tx_discard", kind: "message", oneof: "response", T: () => TxAPI_Discard_Response },
3828
+ { no: 14, name: "stream_close", kind: "message", oneof: "response", T: () => TxAPI_CloseStream_Response },
3774
3829
  { no: 58, name: "resource_create_root", kind: "message", oneof: "response", T: () => ResourceAPI_CreateRoot_Response },
3775
3830
  { no: 57, name: "resource_remove", kind: "message", oneof: "response", T: () => ResourceAPI_Remove_Response },
3776
3831
  { no: 51, name: "resource_create_struct", kind: "message", oneof: "response", T: () => ResourceAPI_CreateStruct_Response },
@@ -3865,6 +3920,12 @@ class TxAPI_ServerMessage$Type extends MessageType<TxAPI_ServerMessage> {
3865
3920
  txDiscard: TxAPI_Discard_Response.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).txDiscard)
3866
3921
  };
3867
3922
  break;
3923
+ case /* MiLaboratories.PL.API.TxAPI.CloseStream.Response stream_close */ 14:
3924
+ message.response = {
3925
+ oneofKind: "streamClose",
3926
+ streamClose: TxAPI_CloseStream_Response.internalBinaryRead(reader, reader.uint32(), options, (message.response as any).streamClose)
3927
+ };
3928
+ break;
3868
3929
  case /* MiLaboratories.PL.API.ResourceAPI.CreateRoot.Response resource_create_root */ 58:
3869
3930
  message.response = {
3870
3931
  oneofKind: "resourceCreateRoot",
@@ -4222,6 +4283,9 @@ class TxAPI_ServerMessage$Type extends MessageType<TxAPI_ServerMessage> {
4222
4283
  /* MiLaboratories.PL.API.TxAPI.Discard.Response tx_discard = 13; */
4223
4284
  if (message.response.oneofKind === "txDiscard")
4224
4285
  TxAPI_Discard_Response.internalBinaryWrite(message.response.txDiscard, writer.tag(13, WireType.LengthDelimited).fork(), options).join();
4286
+ /* MiLaboratories.PL.API.TxAPI.CloseStream.Response stream_close = 14; */
4287
+ if (message.response.oneofKind === "streamClose")
4288
+ TxAPI_CloseStream_Response.internalBinaryWrite(message.response.streamClose, writer.tag(14, WireType.LengthDelimited).fork(), options).join();
4225
4289
  /* MiLaboratories.PL.API.ResourceAPI.CreateStruct.Response resource_create_struct = 51; */
4226
4290
  if (message.response.oneofKind === "resourceCreateStruct")
4227
4291
  ResourceAPI_CreateStruct_Response.internalBinaryWrite(message.response.resourceCreateStruct, writer.tag(51, WireType.LengthDelimited).fork(), options).join();
@@ -4842,6 +4906,120 @@ class TxAPI_Discard_Response$Type extends MessageType<TxAPI_Discard_Response> {
4842
4906
  */
4843
4907
  export const TxAPI_Discard_Response = new TxAPI_Discard_Response$Type();
4844
4908
  // @generated message type with reflection information, may provide speed optimized methods
4909
+ class TxAPI_CloseStream$Type extends MessageType<TxAPI_CloseStream> {
4910
+ constructor() {
4911
+ super("MiLaboratories.PL.API.TxAPI.CloseStream", []);
4912
+ }
4913
+ create(value?: PartialMessage<TxAPI_CloseStream>): TxAPI_CloseStream {
4914
+ const message = globalThis.Object.create((this.messagePrototype!));
4915
+ if (value !== undefined)
4916
+ reflectionMergePartial<TxAPI_CloseStream>(this, message, value);
4917
+ return message;
4918
+ }
4919
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TxAPI_CloseStream): TxAPI_CloseStream {
4920
+ let message = target ?? this.create(), end = reader.pos + length;
4921
+ while (reader.pos < end) {
4922
+ let [fieldNo, wireType] = reader.tag();
4923
+ switch (fieldNo) {
4924
+ default:
4925
+ let u = options.readUnknownField;
4926
+ if (u === "throw")
4927
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
4928
+ let d = reader.skip(wireType);
4929
+ if (u !== false)
4930
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
4931
+ }
4932
+ }
4933
+ return message;
4934
+ }
4935
+ internalBinaryWrite(message: TxAPI_CloseStream, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
4936
+ let u = options.writeUnknownFields;
4937
+ if (u !== false)
4938
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
4939
+ return writer;
4940
+ }
4941
+ }
4942
+ /**
4943
+ * @generated MessageType for protobuf message MiLaboratories.PL.API.TxAPI.CloseStream
4944
+ */
4945
+ export const TxAPI_CloseStream = new TxAPI_CloseStream$Type();
4946
+ // @generated message type with reflection information, may provide speed optimized methods
4947
+ class TxAPI_CloseStream_Request$Type extends MessageType<TxAPI_CloseStream_Request> {
4948
+ constructor() {
4949
+ super("MiLaboratories.PL.API.TxAPI.CloseStream.Request", []);
4950
+ }
4951
+ create(value?: PartialMessage<TxAPI_CloseStream_Request>): TxAPI_CloseStream_Request {
4952
+ const message = globalThis.Object.create((this.messagePrototype!));
4953
+ if (value !== undefined)
4954
+ reflectionMergePartial<TxAPI_CloseStream_Request>(this, message, value);
4955
+ return message;
4956
+ }
4957
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TxAPI_CloseStream_Request): TxAPI_CloseStream_Request {
4958
+ let message = target ?? this.create(), end = reader.pos + length;
4959
+ while (reader.pos < end) {
4960
+ let [fieldNo, wireType] = reader.tag();
4961
+ switch (fieldNo) {
4962
+ default:
4963
+ let u = options.readUnknownField;
4964
+ if (u === "throw")
4965
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
4966
+ let d = reader.skip(wireType);
4967
+ if (u !== false)
4968
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
4969
+ }
4970
+ }
4971
+ return message;
4972
+ }
4973
+ internalBinaryWrite(message: TxAPI_CloseStream_Request, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
4974
+ let u = options.writeUnknownFields;
4975
+ if (u !== false)
4976
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
4977
+ return writer;
4978
+ }
4979
+ }
4980
+ /**
4981
+ * @generated MessageType for protobuf message MiLaboratories.PL.API.TxAPI.CloseStream.Request
4982
+ */
4983
+ export const TxAPI_CloseStream_Request = new TxAPI_CloseStream_Request$Type();
4984
+ // @generated message type with reflection information, may provide speed optimized methods
4985
+ class TxAPI_CloseStream_Response$Type extends MessageType<TxAPI_CloseStream_Response> {
4986
+ constructor() {
4987
+ super("MiLaboratories.PL.API.TxAPI.CloseStream.Response", []);
4988
+ }
4989
+ create(value?: PartialMessage<TxAPI_CloseStream_Response>): TxAPI_CloseStream_Response {
4990
+ const message = globalThis.Object.create((this.messagePrototype!));
4991
+ if (value !== undefined)
4992
+ reflectionMergePartial<TxAPI_CloseStream_Response>(this, message, value);
4993
+ return message;
4994
+ }
4995
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: TxAPI_CloseStream_Response): TxAPI_CloseStream_Response {
4996
+ let message = target ?? this.create(), end = reader.pos + length;
4997
+ while (reader.pos < end) {
4998
+ let [fieldNo, wireType] = reader.tag();
4999
+ switch (fieldNo) {
5000
+ default:
5001
+ let u = options.readUnknownField;
5002
+ if (u === "throw")
5003
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
5004
+ let d = reader.skip(wireType);
5005
+ if (u !== false)
5006
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
5007
+ }
5008
+ }
5009
+ return message;
5010
+ }
5011
+ internalBinaryWrite(message: TxAPI_CloseStream_Response, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
5012
+ let u = options.writeUnknownFields;
5013
+ if (u !== false)
5014
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
5015
+ return writer;
5016
+ }
5017
+ }
5018
+ /**
5019
+ * @generated MessageType for protobuf message MiLaboratories.PL.API.TxAPI.CloseStream.Response
5020
+ */
5021
+ export const TxAPI_CloseStream_Response = new TxAPI_CloseStream_Response$Type();
5022
+ // @generated message type with reflection information, may provide speed optimized methods
4845
5023
  class TxAPI_Sync$Type extends MessageType<TxAPI_Sync> {
4846
5024
  constructor() {
4847
5025
  super("MiLaboratories.PL.API.TxAPI.Sync", []);
@@ -25,9 +25,24 @@ export function createClient<Paths extends {}>(opts: RestClientConfig): Client<P
25
25
  const client = createOpenApiClient<Paths>({
26
26
  baseUrl: `${scheme}${opts.hostAndPort}`,
27
27
  fetch: (input: Request): Promise<Response> => {
28
- return undiciFetch(input.url, {
29
- ...input,
28
+ // If body has already been consumed, clone the request
29
+ const request = input.bodyUsed ? input.clone() : input;
30
+
31
+ return undiciFetch(request.url, {
32
+ body: request.body,
33
+ cache: request.cache,
34
+ credentials: request.credentials,
30
35
  dispatcher: opts.dispatcher,
36
+ duplex: request.duplex,
37
+ headers: request.headers,
38
+ integrity: request.integrity,
39
+ keepalive: request.keepalive,
40
+ method: request.method,
41
+ mode: request.mode,
42
+ redirect: request.redirect,
43
+ referrer: request.referrer,
44
+ referrerPolicy: request.referrerPolicy,
45
+ signal: request.signal,
31
46
  });
32
47
  },
33
48
  });