@milaboratories/pl-client 2.16.26 → 2.16.28

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 (212) hide show
  1. package/README.md +2 -1
  2. package/dist/core/PromiseTracker.cjs +1 -3
  3. package/dist/core/PromiseTracker.cjs.map +1 -1
  4. package/dist/core/PromiseTracker.d.ts.map +1 -1
  5. package/dist/core/PromiseTracker.js +1 -3
  6. package/dist/core/PromiseTracker.js.map +1 -1
  7. package/dist/core/StatefulPromise.cjs +4 -4
  8. package/dist/core/StatefulPromise.cjs.map +1 -1
  9. package/dist/core/StatefulPromise.d.ts +1 -1
  10. package/dist/core/StatefulPromise.d.ts.map +1 -1
  11. package/dist/core/StatefulPromise.js +4 -4
  12. package/dist/core/StatefulPromise.js.map +1 -1
  13. package/dist/core/advisory_locks.cjs +1 -1
  14. package/dist/core/advisory_locks.cjs.map +1 -1
  15. package/dist/core/advisory_locks.js +1 -1
  16. package/dist/core/advisory_locks.js.map +1 -1
  17. package/dist/core/auth.cjs.map +1 -1
  18. package/dist/core/auth.d.ts +1 -1
  19. package/dist/core/auth.js.map +1 -1
  20. package/dist/core/cache.d.ts +1 -1
  21. package/dist/core/client.cjs +14 -14
  22. package/dist/core/client.cjs.map +1 -1
  23. package/dist/core/client.d.ts +11 -11
  24. package/dist/core/client.d.ts.map +1 -1
  25. package/dist/core/client.js +14 -14
  26. package/dist/core/client.js.map +1 -1
  27. package/dist/core/config.cjs +39 -39
  28. package/dist/core/config.cjs.map +1 -1
  29. package/dist/core/config.d.ts +5 -5
  30. package/dist/core/config.js +39 -39
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/default_client.cjs +23 -23
  33. package/dist/core/default_client.cjs.map +1 -1
  34. package/dist/core/default_client.d.ts +3 -3
  35. package/dist/core/default_client.js +23 -23
  36. package/dist/core/default_client.js.map +1 -1
  37. package/dist/core/driver.cjs +1 -1
  38. package/dist/core/driver.cjs.map +1 -1
  39. package/dist/core/driver.d.ts +5 -5
  40. package/dist/core/driver.js +1 -1
  41. package/dist/core/driver.js.map +1 -1
  42. package/dist/core/error_resource.cjs +2 -2
  43. package/dist/core/error_resource.cjs.map +1 -1
  44. package/dist/core/error_resource.d.ts +1 -1
  45. package/dist/core/error_resource.js +2 -2
  46. package/dist/core/error_resource.js.map +1 -1
  47. package/dist/core/errors.cjs +24 -24
  48. package/dist/core/errors.cjs.map +1 -1
  49. package/dist/core/errors.d.ts +1 -1
  50. package/dist/core/errors.d.ts.map +1 -1
  51. package/dist/core/errors.js +24 -24
  52. package/dist/core/errors.js.map +1 -1
  53. package/dist/core/final.cjs +43 -43
  54. package/dist/core/final.cjs.map +1 -1
  55. package/dist/core/final.d.ts +3 -3
  56. package/dist/core/final.d.ts.map +1 -1
  57. package/dist/core/final.js +43 -43
  58. package/dist/core/final.js.map +1 -1
  59. package/dist/core/ll_client.cjs +50 -43
  60. package/dist/core/ll_client.cjs.map +1 -1
  61. package/dist/core/ll_client.d.ts +9 -9
  62. package/dist/core/ll_client.d.ts.map +1 -1
  63. package/dist/core/ll_client.js +50 -43
  64. package/dist/core/ll_client.js.map +1 -1
  65. package/dist/core/ll_transaction.cjs +9 -9
  66. package/dist/core/ll_transaction.cjs.map +1 -1
  67. package/dist/core/ll_transaction.d.ts +7 -7
  68. package/dist/core/ll_transaction.d.ts.map +1 -1
  69. package/dist/core/ll_transaction.js +9 -9
  70. package/dist/core/ll_transaction.js.map +1 -1
  71. package/dist/core/stat.cjs.map +1 -1
  72. package/dist/core/stat.d.ts +1 -1
  73. package/dist/core/stat.js.map +1 -1
  74. package/dist/core/transaction.cjs +46 -46
  75. package/dist/core/transaction.cjs.map +1 -1
  76. package/dist/core/transaction.d.ts +7 -7
  77. package/dist/core/transaction.d.ts.map +1 -1
  78. package/dist/core/transaction.js +46 -46
  79. package/dist/core/transaction.js.map +1 -1
  80. package/dist/core/type_conversion.cjs +22 -22
  81. package/dist/core/type_conversion.cjs.map +1 -1
  82. package/dist/core/type_conversion.d.ts +3 -3
  83. package/dist/core/type_conversion.d.ts.map +1 -1
  84. package/dist/core/type_conversion.js +22 -22
  85. package/dist/core/type_conversion.js.map +1 -1
  86. package/dist/core/types.cjs +25 -25
  87. package/dist/core/types.cjs.map +1 -1
  88. package/dist/core/types.d.ts +7 -7
  89. package/dist/core/types.js +25 -25
  90. package/dist/core/types.js.map +1 -1
  91. package/dist/core/unauth_client.cjs +6 -4
  92. package/dist/core/unauth_client.cjs.map +1 -1
  93. package/dist/core/unauth_client.d.ts +4 -4
  94. package/dist/core/unauth_client.d.ts.map +1 -1
  95. package/dist/core/unauth_client.js +6 -4
  96. package/dist/core/unauth_client.js.map +1 -1
  97. package/dist/core/websocket_stream.cjs +22 -20
  98. package/dist/core/websocket_stream.cjs.map +1 -1
  99. package/dist/core/websocket_stream.d.ts +3 -3
  100. package/dist/core/websocket_stream.d.ts.map +1 -1
  101. package/dist/core/websocket_stream.js +22 -20
  102. package/dist/core/websocket_stream.js.map +1 -1
  103. package/dist/core/wire.d.ts +6 -6
  104. package/dist/core/wire.d.ts.map +1 -1
  105. package/dist/helpers/pl.cjs +19 -19
  106. package/dist/helpers/pl.cjs.map +1 -1
  107. package/dist/helpers/pl.d.ts +2 -2
  108. package/dist/helpers/pl.js +19 -19
  109. package/dist/helpers/pl.js.map +1 -1
  110. package/dist/helpers/poll.cjs +6 -6
  111. package/dist/helpers/poll.cjs.map +1 -1
  112. package/dist/helpers/poll.d.ts +4 -4
  113. package/dist/helpers/poll.d.ts.map +1 -1
  114. package/dist/helpers/poll.js +6 -6
  115. package/dist/helpers/poll.js.map +1 -1
  116. package/dist/helpers/retry_strategy.cjs +1 -1
  117. package/dist/helpers/retry_strategy.cjs.map +1 -1
  118. package/dist/helpers/retry_strategy.d.ts.map +1 -1
  119. package/dist/helpers/retry_strategy.js +1 -1
  120. package/dist/helpers/retry_strategy.js.map +1 -1
  121. package/dist/helpers/state_helpers.d.ts +2 -2
  122. package/dist/helpers/tx_helpers.cjs +2 -2
  123. package/dist/helpers/tx_helpers.cjs.map +1 -1
  124. package/dist/helpers/tx_helpers.d.ts +2 -2
  125. package/dist/helpers/tx_helpers.d.ts.map +1 -1
  126. package/dist/helpers/tx_helpers.js +2 -2
  127. package/dist/helpers/tx_helpers.js.map +1 -1
  128. package/dist/index.d.ts +16 -16
  129. package/dist/proto-grpc/google/protobuf/struct.d.ts +1 -1
  130. package/dist/proto-grpc/google/protobuf/struct.d.ts.map +1 -1
  131. package/dist/proto-rest/index.cjs +4 -5
  132. package/dist/proto-rest/index.cjs.map +1 -1
  133. package/dist/proto-rest/index.d.ts +4 -4
  134. package/dist/proto-rest/index.d.ts.map +1 -1
  135. package/dist/proto-rest/index.js +4 -5
  136. package/dist/proto-rest/index.js.map +1 -1
  137. package/dist/proto-rest/plapi.d.ts.map +1 -1
  138. package/dist/test/tcp-proxy.cjs +11 -10
  139. package/dist/test/tcp-proxy.cjs.map +1 -1
  140. package/dist/test/tcp-proxy.d.ts +1 -1
  141. package/dist/test/tcp-proxy.d.ts.map +1 -1
  142. package/dist/test/tcp-proxy.js +11 -10
  143. package/dist/test/tcp-proxy.js.map +1 -1
  144. package/dist/test/test_config.cjs +21 -17
  145. package/dist/test/test_config.cjs.map +1 -1
  146. package/dist/test/test_config.d.ts +6 -6
  147. package/dist/test/test_config.d.ts.map +1 -1
  148. package/dist/test/test_config.js +21 -17
  149. package/dist/test/test_config.js.map +1 -1
  150. package/dist/util/pl.cjs +1 -1
  151. package/dist/util/pl.cjs.map +1 -1
  152. package/dist/util/pl.js +1 -1
  153. package/dist/util/pl.js.map +1 -1
  154. package/dist/util/util.cjs +1 -1
  155. package/dist/util/util.cjs.map +1 -1
  156. package/dist/util/util.js +1 -1
  157. package/dist/util/util.js.map +1 -1
  158. package/package.json +23 -23
  159. package/src/core/PromiseTracker.ts +3 -4
  160. package/src/core/StatefulPromise.ts +17 -8
  161. package/src/core/abstract_stream.ts +3 -4
  162. package/src/core/advisory_locks.ts +1 -1
  163. package/src/core/auth.ts +2 -2
  164. package/src/core/cache.ts +1 -1
  165. package/src/core/client.test.ts +25 -21
  166. package/src/core/client.ts +54 -45
  167. package/src/core/config.test.ts +44 -44
  168. package/src/core/config.ts +49 -49
  169. package/src/core/connectivity.test.ts +69 -63
  170. package/src/core/default_client.ts +46 -46
  171. package/src/core/driver.ts +6 -6
  172. package/src/core/error.test.ts +5 -5
  173. package/src/core/error_resource.ts +3 -3
  174. package/src/core/errors.ts +39 -31
  175. package/src/core/final.ts +48 -55
  176. package/src/core/ll_client.test.ts +53 -36
  177. package/src/core/ll_client.ts +125 -81
  178. package/src/core/ll_transaction.test.ts +75 -49
  179. package/src/core/ll_transaction.ts +37 -35
  180. package/src/core/stat.ts +1 -1
  181. package/src/core/transaction.test.ts +65 -65
  182. package/src/core/transaction.ts +91 -84
  183. package/src/core/type_conversion.ts +30 -31
  184. package/src/core/types.test.ts +6 -6
  185. package/src/core/types.ts +35 -35
  186. package/src/core/unauth_client.test.ts +18 -14
  187. package/src/core/unauth_client.ts +14 -12
  188. package/src/core/websocket_stream.test.ts +52 -52
  189. package/src/core/websocket_stream.ts +41 -37
  190. package/src/core/wire.ts +10 -8
  191. package/src/helpers/pl.ts +22 -22
  192. package/src/helpers/poll.ts +13 -27
  193. package/src/helpers/retry_strategy.ts +2 -4
  194. package/src/helpers/rich_resource_types.test.ts +2 -2
  195. package/src/helpers/state_helpers.ts +3 -3
  196. package/src/helpers/tx_helpers.ts +9 -7
  197. package/src/index.ts +16 -16
  198. package/src/proto-grpc/google/protobuf/struct.ts +1 -1
  199. package/src/proto-rest/index.ts +17 -18
  200. package/src/proto-rest/plapi.ts +1472 -1472
  201. package/src/test/tcp-proxy.ts +55 -54
  202. package/src/test/test_config.test.ts +3 -3
  203. package/src/test/test_config.ts +51 -46
  204. package/src/util/pl.ts +1 -1
  205. package/src/util/util.test.ts +5 -5
  206. package/src/util/util.ts +1 -1
  207. package/dist/helpers/rich_resource_types.d.ts +0 -2
  208. package/dist/helpers/rich_resource_types.d.ts.map +0 -1
  209. package/dist/helpers/smart_accessors.d.ts +0 -2
  210. package/dist/helpers/smart_accessors.d.ts.map +0 -1
  211. package/src/helpers/rich_resource_types.ts +0 -84
  212. package/src/helpers/smart_accessors.ts +0 -146
@@ -1,57 +1,75 @@
1
- import { getTestLLClient } from '../test/test_config';
2
- import { TxAPI_Open_Request_WritableTx } from '../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api';
3
- import { createLocalResourceId } from './types';
4
- import { test, expect } from 'vitest';
1
+ import { getTestLLClient } from "../test/test_config";
2
+ import { TxAPI_Open_Request_WritableTx } from "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api";
3
+ import { createLocalResourceId } from "./types";
4
+ import { test, expect } from "vitest";
5
5
 
6
- import { isTimeoutOrCancelError } from './errors';
7
- import { Aborted } from '@milaboratories/ts-helpers';
6
+ import { isTimeoutOrCancelError } from "./errors";
7
+ import { Aborted } from "@milaboratories/ts-helpers";
8
8
 
9
- test('check successful transaction', async () => {
9
+ test("check successful transaction", async () => {
10
10
  const client = await getTestLLClient();
11
11
  const tx = client.createTx(true);
12
12
 
13
- const openResp = await tx.send({
14
- oneofKind: 'txOpen',
15
- txOpen: { name: 'test', writable: TxAPI_Open_Request_WritableTx.WRITABLE, enableFormattedErrors: false }
16
- }, false);
17
- const commitResp = await tx.send({
18
- oneofKind: 'txCommit',
19
- txCommit: {}
20
- }, false);
13
+ const openResp = await tx.send(
14
+ {
15
+ oneofKind: "txOpen",
16
+ txOpen: {
17
+ name: "test",
18
+ writable: TxAPI_Open_Request_WritableTx.WRITABLE,
19
+ enableFormattedErrors: false,
20
+ },
21
+ },
22
+ false,
23
+ );
24
+ const commitResp = await tx.send(
25
+ {
26
+ oneofKind: "txCommit",
27
+ txCommit: {},
28
+ },
29
+ false,
30
+ );
21
31
 
22
32
  expect(openResp.txOpen.tx?.isValid).toBeTruthy();
23
33
  expect(commitResp.txCommit.success).toBeTruthy();
24
34
  await tx.await();
25
35
  });
26
36
 
27
- test('transaction timeout test', async () => {
37
+ test("transaction timeout test", async () => {
28
38
  const client = await getTestLLClient();
29
39
  const tx = client.createTx(true, { timeout: 500 });
30
40
 
31
41
  await expect(async () => {
32
42
  const response = await tx.send(
33
43
  {
34
- oneofKind: 'txOpen',
35
- txOpen: { name: 'test', writable: TxAPI_Open_Request_WritableTx.WRITABLE, enableFormattedErrors: false }
44
+ oneofKind: "txOpen",
45
+ txOpen: {
46
+ name: "test",
47
+ writable: TxAPI_Open_Request_WritableTx.WRITABLE,
48
+ enableFormattedErrors: false,
49
+ },
36
50
  },
37
- false
51
+ false,
38
52
  );
39
53
  expect(response.txOpen.tx?.isValid).toBeTruthy();
40
54
  await tx.await();
41
55
  }).rejects.toThrow(Aborted);
42
56
  });
43
57
 
44
- test('check timeout error type (passive)', async () => {
58
+ test("check timeout error type (passive)", async () => {
45
59
  const client = await getTestLLClient();
46
60
  const tx = client.createTx(true, { timeout: 500 });
47
61
 
48
62
  try {
49
63
  const response = await tx.send(
50
64
  {
51
- oneofKind: 'txOpen',
52
- txOpen: { name: 'test', writable: TxAPI_Open_Request_WritableTx.WRITABLE, enableFormattedErrors: false }
65
+ oneofKind: "txOpen",
66
+ txOpen: {
67
+ name: "test",
68
+ writable: TxAPI_Open_Request_WritableTx.WRITABLE,
69
+ enableFormattedErrors: false,
70
+ },
53
71
  },
54
- false
72
+ false,
55
73
  );
56
74
  expect(response.txOpen.tx?.isValid).toBeTruthy();
57
75
  await tx.await();
@@ -60,17 +78,21 @@ test('check timeout error type (passive)', async () => {
60
78
  }
61
79
  });
62
80
 
63
- test('check timeout error type (active)', async () => {
81
+ test("check timeout error type (active)", async () => {
64
82
  const client = await getTestLLClient();
65
83
  const tx = client.createTx(true, { timeout: 500 });
66
84
 
67
85
  try {
68
86
  const openResponse = await tx.send(
69
87
  {
70
- oneofKind: 'txOpen',
71
- txOpen: { name: 'test', writable: TxAPI_Open_Request_WritableTx.WRITABLE, enableFormattedErrors: false }
88
+ oneofKind: "txOpen",
89
+ txOpen: {
90
+ name: "test",
91
+ writable: TxAPI_Open_Request_WritableTx.WRITABLE,
92
+ enableFormattedErrors: false,
93
+ },
72
94
  },
73
- false
95
+ false,
74
96
  );
75
97
  expect(openResponse.txOpen.tx?.isValid).toBeTruthy();
76
98
 
@@ -82,30 +104,30 @@ test('check timeout error type (active)', async () => {
82
104
  (Math.random() * 256) & 0xff,
83
105
  (Math.random() * 256) & 0xff,
84
106
  (Math.random() * 256) & 0xff,
85
- (Math.random() * 256) & 0xff
107
+ (Math.random() * 256) & 0xff,
86
108
  ]);
87
109
 
88
110
  const createResponse = await tx.send(
89
111
  {
90
- oneofKind: 'resourceCreateValue',
112
+ oneofKind: "resourceCreateValue",
91
113
  resourceCreateValue: {
92
114
  id: createLocalResourceId(false, 1, 1),
93
- type: { name: 'TestValue', version: '1' },
115
+ type: { name: "TestValue", version: "1" },
94
116
  data: rData,
95
- errorIfExists: false
96
- }
117
+ errorIfExists: false,
118
+ },
97
119
  },
98
- false
120
+ false,
99
121
  );
100
122
  const id = (await createResponse).resourceCreateValue.resourceId;
101
123
 
102
124
  while (true) {
103
125
  const vr = await tx.send(
104
126
  {
105
- oneofKind: 'resourceGet',
106
- resourceGet: { resourceId: id, loadFields: false }
127
+ oneofKind: "resourceGet",
128
+ resourceGet: { resourceId: id, loadFields: false },
107
129
  },
108
- false
130
+ false,
109
131
  );
110
132
 
111
133
  expect(Buffer.compare(vr.resourceGet.resource!.data, rData)).toBe(0);
@@ -115,17 +137,21 @@ test('check timeout error type (active)', async () => {
115
137
  }
116
138
  });
117
139
 
118
- test('check is abort error (active)', async () => {
140
+ test("check is abort error (active)", async () => {
119
141
  const client = await getTestLLClient();
120
142
  const tx = client.createTx(true, { abortSignal: AbortSignal.timeout(100) });
121
143
 
122
144
  try {
123
145
  const openResponse = await tx.send(
124
146
  {
125
- oneofKind: 'txOpen',
126
- txOpen: { name: 'test', writable: TxAPI_Open_Request_WritableTx.WRITABLE, enableFormattedErrors: false }
147
+ oneofKind: "txOpen",
148
+ txOpen: {
149
+ name: "test",
150
+ writable: TxAPI_Open_Request_WritableTx.WRITABLE,
151
+ enableFormattedErrors: false,
152
+ },
127
153
  },
128
- false
154
+ false,
129
155
  );
130
156
  expect(openResponse.txOpen.tx?.isValid).toBeTruthy();
131
157
 
@@ -137,30 +163,30 @@ test('check is abort error (active)', async () => {
137
163
  Math.random() & 0xff,
138
164
  Math.random() & 0xff,
139
165
  Math.random() & 0xff,
140
- Math.random() & 0xff
166
+ Math.random() & 0xff,
141
167
  ]);
142
168
 
143
169
  const createResponse = await tx.send(
144
170
  {
145
- oneofKind: 'resourceCreateValue',
171
+ oneofKind: "resourceCreateValue",
146
172
  resourceCreateValue: {
147
173
  id: createLocalResourceId(false, 1, 1),
148
- type: { name: 'TestValue', version: '1' },
174
+ type: { name: "TestValue", version: "1" },
149
175
  data: rData,
150
- errorIfExists: false
151
- }
176
+ errorIfExists: false,
177
+ },
152
178
  },
153
- false
179
+ false,
154
180
  );
155
181
  const id = (await createResponse).resourceCreateValue.resourceId;
156
182
 
157
183
  while (true) {
158
184
  const vr = await tx.send(
159
185
  {
160
- oneofKind: 'resourceGet',
161
- resourceGet: { resourceId: id, loadFields: false }
186
+ oneofKind: "resourceGet",
187
+ resourceGet: { resourceId: id, loadFields: false },
162
188
  },
163
- false
189
+ false,
164
190
  );
165
191
 
166
192
  expect(Buffer.compare(vr.resourceGet.resource!.data, rData)).toBe(0);
@@ -1,52 +1,52 @@
1
1
  import type {
2
2
  TxAPI_ClientMessage,
3
3
  TxAPI_ServerMessage,
4
- } from '../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api';
5
- import type { BiDiStream } from './abstract_stream';
6
- import Denque from 'denque';
7
- import type { Status } from '../proto-grpc/github.com/googleapis/googleapis/google/rpc/status';
4
+ } from "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api";
5
+ import type { BiDiStream } from "./abstract_stream";
6
+ import Denque from "denque";
7
+ import type { Status } from "../proto-grpc/github.com/googleapis/googleapis/google/rpc/status";
8
8
  import {
9
9
  PlErrorCodeNotFound,
10
10
  RecoverablePlError,
11
11
  rethrowMeaningfulError,
12
12
  UnrecoverablePlError,
13
- } from './errors';
14
- import { StatefulPromise } from './StatefulPromise';
13
+ } from "./errors";
14
+ import { StatefulPromise } from "./StatefulPromise";
15
15
 
16
- export type ClientMessageRequest = TxAPI_ClientMessage['request'];
16
+ export type ClientMessageRequest = TxAPI_ClientMessage["request"];
17
17
 
18
- export type ServerMessageResponse = TxAPI_ServerMessage['response'];
18
+ export type ServerMessageResponse = TxAPI_ServerMessage["response"];
19
19
 
20
20
  type TxStream = BiDiStream<TxAPI_ClientMessage, TxAPI_ServerMessage>;
21
21
 
22
- export type OneOfKind<T extends { oneofKind: unknown }, Kind extends T['oneofKind']> = Extract<
22
+ export type OneOfKind<T extends { oneofKind: unknown }, Kind extends T["oneofKind"]> = Extract<
23
23
  T,
24
24
  { oneofKind: Kind }
25
25
  >;
26
26
 
27
- interface SingleResponseHandler<Kind extends ServerMessageResponse['oneofKind']> {
27
+ interface SingleResponseHandler<Kind extends ServerMessageResponse["oneofKind"]> {
28
28
  kind: Kind;
29
29
  expectMultiResponse: false;
30
30
  resolve: (v: OneOfKind<ServerMessageResponse, Kind>) => void;
31
31
  reject: (e: Error) => void;
32
32
  }
33
33
 
34
- interface MultiResponseHandler<Kind extends ServerMessageResponse['oneofKind']> {
34
+ interface MultiResponseHandler<Kind extends ServerMessageResponse["oneofKind"]> {
35
35
  kind: Kind;
36
36
  expectMultiResponse: true;
37
37
  resolve: (v: OneOfKind<ServerMessageResponse, Kind>[]) => void;
38
38
  reject: (e: Error) => void;
39
39
  }
40
40
 
41
- type AnySingleResponseHandler = SingleResponseHandler<ServerMessageResponse['oneofKind']>;
41
+ type AnySingleResponseHandler = SingleResponseHandler<ServerMessageResponse["oneofKind"]>;
42
42
 
43
- type AnyMultiResponseHandler = MultiResponseHandler<ServerMessageResponse['oneofKind']>;
43
+ type AnyMultiResponseHandler = MultiResponseHandler<ServerMessageResponse["oneofKind"]>;
44
44
 
45
45
  type AnyResponseHandler =
46
- | SingleResponseHandler<ServerMessageResponse['oneofKind']>
47
- | MultiResponseHandler<ServerMessageResponse['oneofKind']>;
46
+ | SingleResponseHandler<ServerMessageResponse["oneofKind"]>
47
+ | MultiResponseHandler<ServerMessageResponse["oneofKind"]>;
48
48
 
49
- function createResponseHandler<Kind extends ServerMessageResponse['oneofKind']>(
49
+ function createResponseHandler<Kind extends ServerMessageResponse["oneofKind"]>(
50
50
  kind: Kind,
51
51
  expectMultiResponse: boolean,
52
52
  resolve:
@@ -62,9 +62,9 @@ function isRecoverable(status: Status): boolean {
62
62
  }
63
63
 
64
64
  export class RethrowError extends Error {
65
- name = 'RethrowError';
65
+ name = "RethrowError";
66
66
  constructor(public readonly rethrowLambda: () => never) {
67
- super('Rethrow error, you should never see this one.');
67
+ super("Rethrow error, you should never see this one.");
68
68
  }
69
69
  }
70
70
 
@@ -166,7 +166,7 @@ export class LLPlTransaction {
166
166
 
167
167
  if (message.multiMessage !== undefined && !message.multiMessage.isLast) {
168
168
  this.assignErrorFactoryIfNotSet(() => {
169
- throw new Error('Unexpected message sequence.');
169
+ throw new Error("Unexpected message sequence.");
170
170
  });
171
171
  break;
172
172
  }
@@ -185,8 +185,8 @@ export class LLPlTransaction {
185
185
  }
186
186
 
187
187
  if (
188
- currentHandler.kind !== message.response.oneofKind
189
- && message?.multiMessage?.isEmpty !== true
188
+ currentHandler.kind !== message.response.oneofKind &&
189
+ message?.multiMessage?.isEmpty !== true
190
190
  ) {
191
191
  const errorMessage = `inconsistent request response types: ${currentHandler.kind} !== ${message.response.oneofKind}`;
192
192
 
@@ -266,7 +266,7 @@ export class LLPlTransaction {
266
266
  const handler = this.responseHandlerQueue.shift();
267
267
  if (!handler) break;
268
268
  if (this.errorFactory) handler.reject(new RethrowError(this.errorFactory));
269
- else handler.reject(new Error('no reply'));
269
+ else handler.reject(new Error("no reply"));
270
270
  }
271
271
 
272
272
  // closing outgoing stream
@@ -292,29 +292,31 @@ export class LLPlTransaction {
292
292
  if (processingResult !== null) processingResult();
293
293
  }
294
294
 
295
- public async send<Kind extends ClientMessageRequest['oneofKind']>(
295
+ public async send<Kind extends ClientMessageRequest["oneofKind"]>(
296
296
  r: OneOfKind<ClientMessageRequest, Kind>,
297
- expectMultiResponse: false
297
+ expectMultiResponse: false,
298
298
  ): Promise<OneOfKind<ServerMessageResponse, Kind>>;
299
- public async send<Kind extends ClientMessageRequest['oneofKind']>(
299
+ public async send<Kind extends ClientMessageRequest["oneofKind"]>(
300
300
  r: OneOfKind<ClientMessageRequest, Kind>,
301
- expectMultiResponse: true
301
+ expectMultiResponse: true,
302
302
  ): Promise<OneOfKind<ServerMessageResponse, Kind>[]>;
303
303
  /** Generate proper client message and send it to the server, and returns a promise of future response. */
304
- public async send<Kind extends ClientMessageRequest['oneofKind']>(
304
+ public async send<Kind extends ClientMessageRequest["oneofKind"]>(
305
305
  r: OneOfKind<ClientMessageRequest, Kind>,
306
306
  expectMultiResponse: boolean,
307
307
  ): Promise<OneOfKind<ServerMessageResponse, Kind> | OneOfKind<ServerMessageResponse, Kind>[]> {
308
308
  if (this.errorFactory) return Promise.reject(new RethrowError(this.errorFactory));
309
309
 
310
- if (this.closed) return Promise.reject(new Error('Transaction already closed'));
310
+ if (this.closed) return Promise.reject(new Error("Transaction already closed"));
311
311
 
312
312
  // Note: Promise synchronously executes a callback passed to a constructor
313
- const result = StatefulPromise.fromDeferredReject(new Promise<OneOfKind<ServerMessageResponse, Kind>>((resolve, reject) => {
314
- this.responseHandlerQueue.push(
315
- createResponseHandler(r.oneofKind, expectMultiResponse, resolve, reject),
316
- );
317
- }));
313
+ const result = StatefulPromise.fromDeferredReject(
314
+ new Promise<OneOfKind<ServerMessageResponse, Kind>>((resolve, reject) => {
315
+ this.responseHandlerQueue.push(
316
+ createResponseHandler(r.oneofKind, expectMultiResponse, resolve, reject),
317
+ );
318
+ }),
319
+ );
318
320
 
319
321
  // Awaiting message dispatch to catch any associated errors.
320
322
  // There is no hurry, we are not going to receive a response until message is sent.
@@ -327,7 +329,7 @@ export class LLPlTransaction {
327
329
  return await result;
328
330
  } catch (e: any) {
329
331
  if (e instanceof RethrowError) e.rethrowLambda();
330
- throw new Error('Error while waiting for response', { cause: e });
332
+ throw new Error("Error while waiting for response", { cause: e });
331
333
  }
332
334
  }
333
335
 
@@ -342,6 +344,6 @@ export class LLPlTransaction {
342
344
 
343
345
  private isTerminalResponse(message: TxAPI_ServerMessage): boolean {
344
346
  const kind = message.response.oneofKind;
345
- return kind === 'txCommit' || kind === 'txDiscard';
347
+ return kind === "txCommit" || kind === "txDiscard";
346
348
  }
347
349
  }
package/src/core/stat.ts CHANGED
@@ -34,7 +34,7 @@ export type TxStat = {
34
34
  kvGetBytes: number;
35
35
  };
36
36
 
37
- export type TxStatWithoutTime = Omit<TxStat, 'timeMs'>;
37
+ export type TxStatWithoutTime = Omit<TxStat, "timeMs">;
38
38
 
39
39
  export function initialTxStatWithoutTime(): TxStatWithoutTime {
40
40
  return {
@@ -1,65 +1,65 @@
1
- import { withTempRoot } from '../test/test_config';
2
- import { StructTestResource, ValueTestResource } from '../helpers/pl';
3
- import { field, toGlobalFieldId, toGlobalResourceId } from './transaction';
4
- import { RecoverablePlError } from './errors';
5
- import * as tp from 'node:timers/promises';
6
- import { test, expect } from 'vitest';
7
- import { StatefulPromise } from './StatefulPromise';
8
-
9
- test('get field', async () => {
1
+ import { withTempRoot } from "../test/test_config";
2
+ import { StructTestResource, ValueTestResource } from "../helpers/pl";
3
+ import { field, toGlobalFieldId, toGlobalResourceId } from "./transaction";
4
+ import { RecoverablePlError } from "./errors";
5
+ import * as tp from "node:timers/promises";
6
+ import { test, expect } from "vitest";
7
+ import { StatefulPromise } from "./StatefulPromise";
8
+
9
+ test("get field", async () => {
10
10
  await withTempRoot(async (pl) => {
11
- const [rr0, theField1] = await pl.withWriteTx('resource1', async (tx) => {
11
+ const [rr0, theField1] = await pl.withWriteTx("resource1", async (tx) => {
12
12
  const r0 = tx.createStruct(StructTestResource);
13
13
  const r1 = tx.createStruct(StructTestResource);
14
- const f0 = { resourceId: tx.clientRoot, fieldName: 'test0' };
15
- const f1 = { resourceId: tx.clientRoot, fieldName: 'test1' };
14
+ const f0 = { resourceId: tx.clientRoot, fieldName: "test0" };
15
+ const f1 = { resourceId: tx.clientRoot, fieldName: "test1" };
16
16
 
17
- tx.createField(f0, 'Dynamic');
18
- tx.createField(f1, 'Dynamic');
17
+ tx.createField(f0, "Dynamic");
18
+ tx.createField(f1, "Dynamic");
19
19
  tx.setField(f0, r0);
20
20
  tx.setField(f1, r1);
21
21
 
22
- const theField1 = { resourceId: r1, fieldName: 'theField' };
23
- tx.createField(theField1, 'Input');
22
+ const theField1 = { resourceId: r1, fieldName: "theField" };
23
+ tx.createField(theField1, "Input");
24
24
  tx.lock(r1);
25
- tx.setField(theField1, tx.getFutureFieldValue(r0, 'theField', 'Input'));
25
+ tx.setField(theField1, tx.getFutureFieldValue(r0, "theField", "Input"));
26
26
 
27
27
  await tx.commit();
28
28
  return [await r0.globalId, await toGlobalFieldId(theField1)];
29
29
  });
30
30
 
31
- const theField0 = { resourceId: rr0, fieldName: 'theField' };
31
+ const theField0 = { resourceId: rr0, fieldName: "theField" };
32
32
 
33
- let fieldState = await pl.withReadTx('test', async (tx) => {
33
+ let fieldState = await pl.withReadTx("test", async (tx) => {
34
34
  return await tx.getField(theField1);
35
35
  });
36
- expect(fieldState.status === 'Empty' || fieldState.status === 'Assigned').toBe(true);
36
+ expect(fieldState.status === "Empty" || fieldState.status === "Assigned").toBe(true);
37
37
 
38
- await pl.withWriteTx('resource1', async (tx) => {
39
- tx.createField(theField0, 'Input');
38
+ await pl.withWriteTx("resource1", async (tx) => {
39
+ tx.createField(theField0, "Input");
40
40
  tx.lock(rr0);
41
- tx.setField(theField0, tx.createValue(ValueTestResource, Buffer.from('hello')));
41
+ tx.setField(theField0, tx.createValue(ValueTestResource, Buffer.from("hello")));
42
42
  await tx.commit();
43
43
  return theField0;
44
44
  });
45
45
 
46
46
  while (true) {
47
- fieldState = await pl.withReadTx('test', async (tx) => {
47
+ fieldState = await pl.withReadTx("test", async (tx) => {
48
48
  return await tx.getField(theField1);
49
49
  });
50
- if (fieldState.status === 'Resolved') break;
50
+ if (fieldState.status === "Resolved") break;
51
51
  await tp.setTimeout(10);
52
52
  }
53
53
  });
54
54
  });
55
55
 
56
- test('handle absent resource error', async () => {
56
+ test("handle absent resource error", async () => {
57
57
  await withTempRoot(async (pl) => {
58
- const [rr0, ff0] = await pl.withWriteTx('testCreateResource', async (tx) => {
58
+ const [rr0, ff0] = await pl.withWriteTx("testCreateResource", async (tx) => {
59
59
  const r0 = tx.createStruct(StructTestResource);
60
- const f0 = { resourceId: tx.clientRoot, fieldName: 'test0' };
60
+ const f0 = { resourceId: tx.clientRoot, fieldName: "test0" };
61
61
 
62
- tx.createField(f0, 'Dynamic');
62
+ tx.createField(f0, "Dynamic");
63
63
  tx.setField(f0, r0);
64
64
 
65
65
  await tx.commit();
@@ -67,18 +67,18 @@ test('handle absent resource error', async () => {
67
67
  });
68
68
 
69
69
  await pl.withWriteTx(
70
- 'testDeleteResource',
70
+ "testDeleteResource",
71
71
  async (tx) => {
72
72
  await tx.getResourceData(rr0, true);
73
73
  tx.removeField(ff0);
74
74
  await tx.commit();
75
75
  },
76
- { sync: true }
76
+ { sync: true },
77
77
  );
78
78
 
79
79
  StatefulPromise.debug = true;
80
80
 
81
- let rState = await pl.withReadTx('testRetrieveResource', async (tx) => {
81
+ let rState = await pl.withReadTx("testRetrieveResource", async (tx) => {
82
82
  await expect(async () => {
83
83
  await tx.getResourceData(rr0, true);
84
84
  }).rejects.toThrow(RecoverablePlError);
@@ -89,7 +89,7 @@ test('handle absent resource error', async () => {
89
89
 
90
90
  expect(rState.fields).toHaveLength(0);
91
91
 
92
- rState = await pl.withReadTx('testRetrieveResource', async (tx) => {
92
+ rState = await pl.withReadTx("testRetrieveResource", async (tx) => {
93
93
  await expect(async () => {
94
94
  await tx.listKeyValues(rr0);
95
95
  }).rejects.toThrow(RecoverablePlError);
@@ -98,7 +98,7 @@ test('handle absent resource error', async () => {
98
98
 
99
99
  expect(rState.fields).toHaveLength(0);
100
100
 
101
- rState = await pl.withReadTx('testRetrieveResource', async (tx) => {
101
+ rState = await pl.withReadTx("testRetrieveResource", async (tx) => {
102
102
  await expect(async () => {
103
103
  await tx.getField(ff0);
104
104
  }).rejects.toThrow(RecoverablePlError);
@@ -107,72 +107,72 @@ test('handle absent resource error', async () => {
107
107
 
108
108
  expect(rState.fields).toHaveLength(0);
109
109
 
110
- await pl.withReadTx('testFieldAbsent', async (tx) => {
110
+ await pl.withReadTx("testFieldAbsent", async (tx) => {
111
111
  expect(await tx.getFieldIfExists(ff0)).toBeUndefined();
112
112
  });
113
113
  });
114
114
  });
115
115
 
116
- test('handle KV storage', async () => {
116
+ test("handle KV storage", async () => {
117
117
  await withTempRoot(async (pl) => {
118
- await pl.withWriteTx('writeKV', async (tx) => {
119
- tx.setKValue(tx.clientRoot, 'a', 'a');
120
- tx.setKValue(tx.clientRoot, 'b', 'b');
118
+ await pl.withWriteTx("writeKV", async (tx) => {
119
+ tx.setKValue(tx.clientRoot, "a", "a");
120
+ tx.setKValue(tx.clientRoot, "b", "b");
121
121
  await tx.commit();
122
122
  });
123
123
 
124
- await pl.withReadTx('testReadIndividual', async (tx) => {
125
- expect(await tx.getKValueString(tx.clientRoot, 'a')).toEqual('a');
126
- expect(await tx.getKValueString(tx.clientRoot, 'b')).toEqual('b');
124
+ await pl.withReadTx("testReadIndividual", async (tx) => {
125
+ expect(await tx.getKValueString(tx.clientRoot, "a")).toEqual("a");
126
+ expect(await tx.getKValueString(tx.clientRoot, "b")).toEqual("b");
127
127
  });
128
128
 
129
- await pl.withReadTx('testReadIndividualAndList', async (tx) => {
130
- expect(await tx.getKValueString(tx.clientRoot, 'a')).toEqual('a');
131
- expect(await tx.getKValueString(tx.clientRoot, 'b')).toEqual('b');
129
+ await pl.withReadTx("testReadIndividualAndList", async (tx) => {
130
+ expect(await tx.getKValueString(tx.clientRoot, "a")).toEqual("a");
131
+ expect(await tx.getKValueString(tx.clientRoot, "b")).toEqual("b");
132
132
  expect(await tx.listKeyValuesString(tx.clientRoot)).toEqual([
133
- { key: 'a', value: 'a' },
134
- { key: 'b', value: 'b' }
133
+ { key: "a", value: "a" },
134
+ { key: "b", value: "b" },
135
135
  ]);
136
- expect(await tx.getKValueString(tx.clientRoot, 'a')).toEqual('a');
137
- expect(await tx.getKValueString(tx.clientRoot, 'b')).toEqual('b');
136
+ expect(await tx.getKValueString(tx.clientRoot, "a")).toEqual("a");
137
+ expect(await tx.getKValueString(tx.clientRoot, "b")).toEqual("b");
138
138
  });
139
139
 
140
- await pl.withWriteTx('deleteKV', async (tx) => {
141
- tx.deleteKValue(tx.clientRoot, 'a');
140
+ await pl.withWriteTx("deleteKV", async (tx) => {
141
+ tx.deleteKValue(tx.clientRoot, "a");
142
142
  await tx.commit();
143
143
  });
144
144
 
145
- await pl.withReadTx('testReadIndividualAndList2', async (tx) => {
146
- expect(await tx.getKValueString(tx.clientRoot, 'b')).toEqual('b');
147
- expect(await tx.listKeyValuesString(tx.clientRoot)).toEqual([{ key: 'b', value: 'b' }]);
148
- expect(await tx.getKValueString(tx.clientRoot, 'b')).toEqual('b');
145
+ await pl.withReadTx("testReadIndividualAndList2", async (tx) => {
146
+ expect(await tx.getKValueString(tx.clientRoot, "b")).toEqual("b");
147
+ expect(await tx.listKeyValuesString(tx.clientRoot)).toEqual([{ key: "b", value: "b" }]);
148
+ expect(await tx.getKValueString(tx.clientRoot, "b")).toEqual("b");
149
149
  });
150
150
  });
151
151
  });
152
152
 
153
- test('handle empty KV storage', async () => {
153
+ test("handle empty KV storage", async () => {
154
154
  await withTempRoot(async (pl) => {
155
- await pl.withReadTx('testReadIndividualAndList', async (tx) => {
155
+ await pl.withReadTx("testReadIndividualAndList", async (tx) => {
156
156
  expect(await tx.listKeyValuesString(tx.clientRoot)).toEqual([]);
157
157
  });
158
158
  });
159
159
  });
160
160
 
161
- test('handle KV storage 2', async () => {
161
+ test("handle KV storage 2", async () => {
162
162
  await withTempRoot(async (pl) => {
163
- const r1 = await pl.withWriteTx('writeKV', async (tx) => {
163
+ const r1 = await pl.withWriteTx("writeKV", async (tx) => {
164
164
  const rr1 = tx.createEphemeral(StructTestResource);
165
- tx.createField(field(rr1, 'a'), 'Dynamic', rr1);
166
- tx.setKValue(rr1, 'a', 'a');
167
- tx.setKValue(rr1, 'b', 'b');
165
+ tx.createField(field(rr1, "a"), "Dynamic", rr1);
166
+ tx.setKValue(rr1, "a", "a");
167
+ tx.setKValue(rr1, "b", "b");
168
168
  await tx.commit();
169
169
  return await toGlobalResourceId(rr1);
170
170
  });
171
171
 
172
- await pl.withReadTx('testReadIndividualAndList', async (tx) => {
172
+ await pl.withReadTx("testReadIndividualAndList", async (tx) => {
173
173
  expect(await tx.listKeyValuesString(r1)).toEqual([
174
- { key: 'a', value: 'a' },
175
- { key: 'b', value: 'b' }
174
+ { key: "a", value: "a" },
175
+ { key: "b", value: "b" },
176
176
  ]);
177
177
  });
178
178
  });