@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.
- package/README.md +2 -1
- package/dist/core/PromiseTracker.cjs +1 -3
- package/dist/core/PromiseTracker.cjs.map +1 -1
- package/dist/core/PromiseTracker.d.ts.map +1 -1
- package/dist/core/PromiseTracker.js +1 -3
- package/dist/core/PromiseTracker.js.map +1 -1
- package/dist/core/StatefulPromise.cjs +4 -4
- package/dist/core/StatefulPromise.cjs.map +1 -1
- package/dist/core/StatefulPromise.d.ts +1 -1
- package/dist/core/StatefulPromise.d.ts.map +1 -1
- package/dist/core/StatefulPromise.js +4 -4
- package/dist/core/StatefulPromise.js.map +1 -1
- package/dist/core/advisory_locks.cjs +1 -1
- package/dist/core/advisory_locks.cjs.map +1 -1
- package/dist/core/advisory_locks.js +1 -1
- package/dist/core/advisory_locks.js.map +1 -1
- package/dist/core/auth.cjs.map +1 -1
- package/dist/core/auth.d.ts +1 -1
- package/dist/core/auth.js.map +1 -1
- package/dist/core/cache.d.ts +1 -1
- package/dist/core/client.cjs +14 -14
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts +11 -11
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +14 -14
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.cjs +39 -39
- package/dist/core/config.cjs.map +1 -1
- package/dist/core/config.d.ts +5 -5
- package/dist/core/config.js +39 -39
- package/dist/core/config.js.map +1 -1
- package/dist/core/default_client.cjs +23 -23
- package/dist/core/default_client.cjs.map +1 -1
- package/dist/core/default_client.d.ts +3 -3
- package/dist/core/default_client.js +23 -23
- package/dist/core/default_client.js.map +1 -1
- package/dist/core/driver.cjs +1 -1
- package/dist/core/driver.cjs.map +1 -1
- package/dist/core/driver.d.ts +5 -5
- package/dist/core/driver.js +1 -1
- package/dist/core/driver.js.map +1 -1
- package/dist/core/error_resource.cjs +2 -2
- package/dist/core/error_resource.cjs.map +1 -1
- package/dist/core/error_resource.d.ts +1 -1
- package/dist/core/error_resource.js +2 -2
- package/dist/core/error_resource.js.map +1 -1
- package/dist/core/errors.cjs +24 -24
- package/dist/core/errors.cjs.map +1 -1
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +24 -24
- package/dist/core/errors.js.map +1 -1
- package/dist/core/final.cjs +43 -43
- package/dist/core/final.cjs.map +1 -1
- package/dist/core/final.d.ts +3 -3
- package/dist/core/final.d.ts.map +1 -1
- package/dist/core/final.js +43 -43
- package/dist/core/final.js.map +1 -1
- package/dist/core/ll_client.cjs +50 -43
- package/dist/core/ll_client.cjs.map +1 -1
- package/dist/core/ll_client.d.ts +9 -9
- package/dist/core/ll_client.d.ts.map +1 -1
- package/dist/core/ll_client.js +50 -43
- package/dist/core/ll_client.js.map +1 -1
- package/dist/core/ll_transaction.cjs +9 -9
- package/dist/core/ll_transaction.cjs.map +1 -1
- package/dist/core/ll_transaction.d.ts +7 -7
- package/dist/core/ll_transaction.d.ts.map +1 -1
- package/dist/core/ll_transaction.js +9 -9
- package/dist/core/ll_transaction.js.map +1 -1
- package/dist/core/stat.cjs.map +1 -1
- package/dist/core/stat.d.ts +1 -1
- package/dist/core/stat.js.map +1 -1
- package/dist/core/transaction.cjs +46 -46
- package/dist/core/transaction.cjs.map +1 -1
- package/dist/core/transaction.d.ts +7 -7
- package/dist/core/transaction.d.ts.map +1 -1
- package/dist/core/transaction.js +46 -46
- package/dist/core/transaction.js.map +1 -1
- package/dist/core/type_conversion.cjs +22 -22
- package/dist/core/type_conversion.cjs.map +1 -1
- package/dist/core/type_conversion.d.ts +3 -3
- package/dist/core/type_conversion.d.ts.map +1 -1
- package/dist/core/type_conversion.js +22 -22
- package/dist/core/type_conversion.js.map +1 -1
- package/dist/core/types.cjs +25 -25
- package/dist/core/types.cjs.map +1 -1
- package/dist/core/types.d.ts +7 -7
- package/dist/core/types.js +25 -25
- package/dist/core/types.js.map +1 -1
- package/dist/core/unauth_client.cjs +6 -4
- package/dist/core/unauth_client.cjs.map +1 -1
- package/dist/core/unauth_client.d.ts +4 -4
- package/dist/core/unauth_client.d.ts.map +1 -1
- package/dist/core/unauth_client.js +6 -4
- package/dist/core/unauth_client.js.map +1 -1
- package/dist/core/websocket_stream.cjs +22 -20
- package/dist/core/websocket_stream.cjs.map +1 -1
- package/dist/core/websocket_stream.d.ts +3 -3
- package/dist/core/websocket_stream.d.ts.map +1 -1
- package/dist/core/websocket_stream.js +22 -20
- package/dist/core/websocket_stream.js.map +1 -1
- package/dist/core/wire.d.ts +6 -6
- package/dist/core/wire.d.ts.map +1 -1
- package/dist/helpers/pl.cjs +19 -19
- package/dist/helpers/pl.cjs.map +1 -1
- package/dist/helpers/pl.d.ts +2 -2
- package/dist/helpers/pl.js +19 -19
- package/dist/helpers/pl.js.map +1 -1
- package/dist/helpers/poll.cjs +6 -6
- package/dist/helpers/poll.cjs.map +1 -1
- package/dist/helpers/poll.d.ts +4 -4
- package/dist/helpers/poll.d.ts.map +1 -1
- package/dist/helpers/poll.js +6 -6
- package/dist/helpers/poll.js.map +1 -1
- package/dist/helpers/retry_strategy.cjs +1 -1
- package/dist/helpers/retry_strategy.cjs.map +1 -1
- package/dist/helpers/retry_strategy.d.ts.map +1 -1
- package/dist/helpers/retry_strategy.js +1 -1
- package/dist/helpers/retry_strategy.js.map +1 -1
- package/dist/helpers/state_helpers.d.ts +2 -2
- package/dist/helpers/tx_helpers.cjs +2 -2
- package/dist/helpers/tx_helpers.cjs.map +1 -1
- package/dist/helpers/tx_helpers.d.ts +2 -2
- package/dist/helpers/tx_helpers.d.ts.map +1 -1
- package/dist/helpers/tx_helpers.js +2 -2
- package/dist/helpers/tx_helpers.js.map +1 -1
- package/dist/index.d.ts +16 -16
- package/dist/proto-grpc/google/protobuf/struct.d.ts +1 -1
- package/dist/proto-grpc/google/protobuf/struct.d.ts.map +1 -1
- package/dist/proto-rest/index.cjs +4 -5
- package/dist/proto-rest/index.cjs.map +1 -1
- package/dist/proto-rest/index.d.ts +4 -4
- package/dist/proto-rest/index.d.ts.map +1 -1
- package/dist/proto-rest/index.js +4 -5
- package/dist/proto-rest/index.js.map +1 -1
- package/dist/proto-rest/plapi.d.ts.map +1 -1
- package/dist/test/tcp-proxy.cjs +11 -10
- package/dist/test/tcp-proxy.cjs.map +1 -1
- package/dist/test/tcp-proxy.d.ts +1 -1
- package/dist/test/tcp-proxy.d.ts.map +1 -1
- package/dist/test/tcp-proxy.js +11 -10
- package/dist/test/tcp-proxy.js.map +1 -1
- package/dist/test/test_config.cjs +21 -17
- package/dist/test/test_config.cjs.map +1 -1
- package/dist/test/test_config.d.ts +6 -6
- package/dist/test/test_config.d.ts.map +1 -1
- package/dist/test/test_config.js +21 -17
- package/dist/test/test_config.js.map +1 -1
- package/dist/util/pl.cjs +1 -1
- package/dist/util/pl.cjs.map +1 -1
- package/dist/util/pl.js +1 -1
- package/dist/util/pl.js.map +1 -1
- package/dist/util/util.cjs +1 -1
- package/dist/util/util.cjs.map +1 -1
- package/dist/util/util.js +1 -1
- package/dist/util/util.js.map +1 -1
- package/package.json +23 -23
- package/src/core/PromiseTracker.ts +3 -4
- package/src/core/StatefulPromise.ts +17 -8
- package/src/core/abstract_stream.ts +3 -4
- package/src/core/advisory_locks.ts +1 -1
- package/src/core/auth.ts +2 -2
- package/src/core/cache.ts +1 -1
- package/src/core/client.test.ts +25 -21
- package/src/core/client.ts +54 -45
- package/src/core/config.test.ts +44 -44
- package/src/core/config.ts +49 -49
- package/src/core/connectivity.test.ts +69 -63
- package/src/core/default_client.ts +46 -46
- package/src/core/driver.ts +6 -6
- package/src/core/error.test.ts +5 -5
- package/src/core/error_resource.ts +3 -3
- package/src/core/errors.ts +39 -31
- package/src/core/final.ts +48 -55
- package/src/core/ll_client.test.ts +53 -36
- package/src/core/ll_client.ts +125 -81
- package/src/core/ll_transaction.test.ts +75 -49
- package/src/core/ll_transaction.ts +37 -35
- package/src/core/stat.ts +1 -1
- package/src/core/transaction.test.ts +65 -65
- package/src/core/transaction.ts +91 -84
- package/src/core/type_conversion.ts +30 -31
- package/src/core/types.test.ts +6 -6
- package/src/core/types.ts +35 -35
- package/src/core/unauth_client.test.ts +18 -14
- package/src/core/unauth_client.ts +14 -12
- package/src/core/websocket_stream.test.ts +52 -52
- package/src/core/websocket_stream.ts +41 -37
- package/src/core/wire.ts +10 -8
- package/src/helpers/pl.ts +22 -22
- package/src/helpers/poll.ts +13 -27
- package/src/helpers/retry_strategy.ts +2 -4
- package/src/helpers/rich_resource_types.test.ts +2 -2
- package/src/helpers/state_helpers.ts +3 -3
- package/src/helpers/tx_helpers.ts +9 -7
- package/src/index.ts +16 -16
- package/src/proto-grpc/google/protobuf/struct.ts +1 -1
- package/src/proto-rest/index.ts +17 -18
- package/src/proto-rest/plapi.ts +1472 -1472
- package/src/test/tcp-proxy.ts +55 -54
- package/src/test/test_config.test.ts +3 -3
- package/src/test/test_config.ts +51 -46
- package/src/util/pl.ts +1 -1
- package/src/util/util.test.ts +5 -5
- package/src/util/util.ts +1 -1
- package/dist/helpers/rich_resource_types.d.ts +0 -2
- package/dist/helpers/rich_resource_types.d.ts.map +0 -1
- package/dist/helpers/smart_accessors.d.ts +0 -2
- package/dist/helpers/smart_accessors.d.ts.map +0 -1
- package/src/helpers/rich_resource_types.ts +0 -84
- package/src/helpers/smart_accessors.ts +0 -146
package/dist/core/wire.d.ts
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import type { GrpcTransport } from
|
|
2
|
-
import type { Dispatcher } from
|
|
3
|
-
import type { PlClientConfig } from
|
|
4
|
-
import type { Middleware } from
|
|
1
|
+
import type { GrpcTransport } from "@protobuf-ts/grpc-transport";
|
|
2
|
+
import type { Dispatcher } from "undici";
|
|
3
|
+
import type { PlClientConfig } from "./config";
|
|
4
|
+
import type { Middleware } from "openapi-fetch";
|
|
5
5
|
/**
|
|
6
6
|
* Options for the HTTP client to properly reach the PL server API when
|
|
7
7
|
* it works in WebSocket + REST mode.
|
|
8
8
|
*/
|
|
9
9
|
export type RestConnection = {
|
|
10
|
-
type:
|
|
10
|
+
type: "rest";
|
|
11
11
|
Config: PlClientConfig;
|
|
12
12
|
Dispatcher: Dispatcher;
|
|
13
13
|
Middlewares: Middleware[];
|
|
14
14
|
};
|
|
15
15
|
export type GrpcConnection = {
|
|
16
|
-
type:
|
|
16
|
+
type: "grpc";
|
|
17
17
|
Transport: GrpcTransport;
|
|
18
18
|
};
|
|
19
19
|
export type WireConnection = RestConnection | GrpcConnection;
|
package/dist/core/wire.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/core/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AAI7D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,MAAM;IACxC,GAAG,IAAI,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wBAAwB,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/core/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,UAAU,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AAI7D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,MAAM;IACxC,GAAG,IAAI,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wBAAwB,CAAC,MAAM,EAC7B,iBAAiB,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,MAAM,GACvD,kBAAkB,CAAC,MAAM,CAAC,CAAC;CAC/B"}
|
package/dist/helpers/pl.cjs
CHANGED
|
@@ -13,19 +13,19 @@ var transaction = require('../core/transaction.cjs');
|
|
|
13
13
|
function rt(name, version) {
|
|
14
14
|
return { name, version };
|
|
15
15
|
}
|
|
16
|
-
const ClientRoot = rt(
|
|
17
|
-
const StructTestResource = rt(
|
|
18
|
-
const ValueTestResource = rt(
|
|
19
|
-
const JsonString = rt(
|
|
20
|
-
const JsonBool = rt(
|
|
21
|
-
const JsonObject = rt(
|
|
22
|
-
const JsonGzObject = rt(
|
|
23
|
-
const JsonArray = rt(
|
|
24
|
-
const JsonNumber = rt(
|
|
25
|
-
const JsonNull = rt(
|
|
26
|
-
const RNull = rt(
|
|
27
|
-
const EphStdMap = rt(
|
|
28
|
-
const StdMap = rt(
|
|
16
|
+
const ClientRoot = rt("ClientRoot", "1");
|
|
17
|
+
const StructTestResource = rt("StructTest", "1");
|
|
18
|
+
const ValueTestResource = rt("ValueTest", "1");
|
|
19
|
+
const JsonString = rt("json/string", "1");
|
|
20
|
+
const JsonBool = rt("json/bool", "1");
|
|
21
|
+
const JsonObject = rt("json/object", "1");
|
|
22
|
+
const JsonGzObject = rt("json-gz/object", "1");
|
|
23
|
+
const JsonArray = rt("json/array", "1");
|
|
24
|
+
const JsonNumber = rt("json/number", "1");
|
|
25
|
+
const JsonNull = rt("json/null", "1");
|
|
26
|
+
const RNull = rt("Null", "1");
|
|
27
|
+
const EphStdMap = rt("EphStdMap", "1");
|
|
28
|
+
const StdMap = rt("StdMap", "1");
|
|
29
29
|
//
|
|
30
30
|
// Standard value resources
|
|
31
31
|
//
|
|
@@ -60,11 +60,11 @@ function createPlMap(tx, entries, ephemeral, type) {
|
|
|
60
60
|
const actualType = type ?? (ephemeral ? EphStdMap : StdMap);
|
|
61
61
|
const rId = ephemeral ? tx.createEphemeral(actualType) : tx.createStruct(actualType);
|
|
62
62
|
for (const [name, value] of Array.isArray(entries) ? entries : plEntries(entries))
|
|
63
|
-
tx.createField(transaction.field(rId, name),
|
|
63
|
+
tx.createField(transaction.field(rId, name), "Input", value);
|
|
64
64
|
tx.lock(rId);
|
|
65
65
|
return rId;
|
|
66
66
|
}
|
|
67
|
-
function futureRecord(tx, rId, keys, fieldType, prefix =
|
|
67
|
+
function futureRecord(tx, rId, keys, fieldType, prefix = "") {
|
|
68
68
|
return Object.fromEntries(keys.map((k) => plEntry(k, tx.getFutureFieldValue(rId, `${prefix}${k}`, fieldType))));
|
|
69
69
|
}
|
|
70
70
|
//
|
|
@@ -73,23 +73,23 @@ function futureRecord(tx, rId, keys, fieldType, prefix = '') {
|
|
|
73
73
|
/** Name of the field in block holder, that references the actual block-pack. */
|
|
74
74
|
const Holder = StdMap;
|
|
75
75
|
const EphHolder = EphStdMap;
|
|
76
|
-
const HolderRefField =
|
|
76
|
+
const HolderRefField = "ref";
|
|
77
77
|
function wrapInHolder(tx, ref) {
|
|
78
78
|
const holder = tx.createStruct(Holder);
|
|
79
79
|
const mainHolderField = transaction.field(holder, HolderRefField);
|
|
80
|
-
tx.createField(mainHolderField,
|
|
80
|
+
tx.createField(mainHolderField, "Input", ref);
|
|
81
81
|
tx.lock(holder);
|
|
82
82
|
return holder;
|
|
83
83
|
}
|
|
84
84
|
function wrapInEphHolder(tx, ref) {
|
|
85
85
|
const holder = tx.createEphemeral(EphHolder);
|
|
86
86
|
const mainHolderField = transaction.field(holder, HolderRefField);
|
|
87
|
-
tx.createField(mainHolderField,
|
|
87
|
+
tx.createField(mainHolderField, "Input", ref);
|
|
88
88
|
tx.lock(holder);
|
|
89
89
|
return holder;
|
|
90
90
|
}
|
|
91
91
|
function unwrapHolder(tx, ref) {
|
|
92
|
-
return tx.getFutureFieldValue(ref, HolderRefField,
|
|
92
|
+
return tx.getFutureFieldValue(ref, HolderRefField, "Input");
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
exports.ClientRoot = ClientRoot;
|
package/dist/helpers/pl.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl.cjs","sources":["../../src/helpers/pl.ts"],"sourcesContent":["/**\n * @packageDocumentation\n *\n * This file is exported under Pl \"namespace\" to the client users.\n *\n * It defines well known pl types, and methods to manipulate them.\n *\n */\n\nimport type { FutureFieldType, ResourceType } from
|
|
1
|
+
{"version":3,"file":"pl.cjs","sources":["../../src/helpers/pl.ts"],"sourcesContent":["/**\n * @packageDocumentation\n *\n * This file is exported under Pl \"namespace\" to the client users.\n *\n * It defines well known pl types, and methods to manipulate them.\n *\n */\n\nimport type { FutureFieldType, ResourceType } from \"../core/types\";\nimport type { AnyRef, FieldRef, PlTransaction, ResourceRef } from \"../core/transaction\";\nimport { field } from \"../core/transaction\";\n\nfunction rt(name: string, version: string): ResourceType {\n return { name, version };\n}\n\nexport const ClientRoot = rt(\"ClientRoot\", \"1\");\n\nexport const StructTestResource = rt(\"StructTest\", \"1\");\nexport const ValueTestResource = rt(\"ValueTest\", \"1\");\n\nexport const JsonString = rt(\"json/string\", \"1\");\nexport const JsonBool = rt(\"json/bool\", \"1\");\nexport const JsonObject = rt(\"json/object\", \"1\");\nexport const JsonGzObject = rt(\"json-gz/object\", \"1\");\nexport const JsonArray = rt(\"json/array\", \"1\");\nexport const JsonNumber = rt(\"json/number\", \"1\");\nexport const JsonNull = rt(\"json/null\", \"1\");\n\nexport const RNull = rt(\"Null\", \"1\");\n\nexport const EphStdMap: ResourceType = rt(\"EphStdMap\", \"1\");\nexport const StdMap: ResourceType = rt(\"StdMap\", \"1\");\n\n//\n// Standard value resources\n//\n\nexport function createPlNull(tx: PlTransaction): ResourceRef {\n return tx.createValue(JsonNull, Buffer.from(JSON.stringify(null)));\n}\n\nexport function createPlBool(tx: PlTransaction, val: boolean): ResourceRef {\n return tx.createValue(JsonBool, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlNumber(tx: PlTransaction, val: number): ResourceRef {\n return tx.createValue(JsonNumber, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlString(tx: PlTransaction, val: string): ResourceRef {\n return tx.createValue(JsonString, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlArray(tx: PlTransaction, val: any[]): ResourceRef {\n return tx.createValue(JsonArray, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlObject(tx: PlTransaction, val: object): ResourceRef {\n return tx.createValue(JsonObject, Buffer.from(JSON.stringify(val)));\n}\n\n//\n// Pl Map\n//\n\nexport type PlRecordEntry<Key extends string = string, Ref extends AnyRef = AnyRef> = [Key, Ref];\n\nexport type PlRecord<Key extends string = string, Ref extends AnyRef = AnyRef> = Record<Key, Ref>;\n\nexport function plEntry<Key extends string = string, Ref extends AnyRef = AnyRef>(\n key: Key,\n ref: Ref,\n): PlRecordEntry<Key, Ref> {\n return [key, ref];\n}\n\nexport function plEntries<Key extends string = string, Ref extends AnyRef = AnyRef>(\n record: PlRecord<Key, Ref>,\n fields?: Key[],\n): PlRecordEntry<Key, Ref>[] {\n return fields === undefined\n ? (Object.entries(record) as PlRecordEntry<Key, Ref>[])\n : fields.map((key) => plEntry(key, record[key]));\n}\n\n/** Helper method to build standard pl map from a set of entries */\nexport function createPlMap(\n tx: PlTransaction,\n entries: PlRecordEntry[] | PlRecord,\n ephemeral: boolean,\n type?: ResourceType,\n): ResourceRef {\n const actualType = type ?? (ephemeral ? EphStdMap : StdMap);\n const rId = ephemeral ? tx.createEphemeral(actualType) : tx.createStruct(actualType);\n\n for (const [name, value] of Array.isArray(entries) ? entries : plEntries(entries))\n tx.createField(field(rId, name), \"Input\", value);\n\n tx.lock(rId);\n\n return rId;\n}\n\nexport function futureRecord<Key extends string>(\n tx: PlTransaction,\n rId: AnyRef,\n keys: Key[],\n fieldType: FutureFieldType,\n prefix: string = \"\",\n): PlRecord<Key, FieldRef> {\n return Object.fromEntries(\n keys.map((k) => plEntry(k, tx.getFutureFieldValue(rId, `${prefix}${k}`, fieldType))),\n ) as PlRecord<Key, FieldRef>;\n}\n\n//\n// Holder\n//\n\n/** Name of the field in block holder, that references the actual block-pack. */\nexport const Holder = StdMap;\nexport const EphHolder = EphStdMap;\nexport const HolderRefField = \"ref\";\n\nexport function wrapInHolder(tx: PlTransaction, ref: AnyRef): ResourceRef {\n const holder = tx.createStruct(Holder);\n const mainHolderField = field(holder, HolderRefField);\n tx.createField(mainHolderField, \"Input\", ref);\n tx.lock(holder);\n return holder;\n}\n\nexport function wrapInEphHolder(tx: PlTransaction, ref: AnyRef): ResourceRef {\n const holder = tx.createEphemeral(EphHolder);\n const mainHolderField = field(holder, HolderRefField);\n tx.createField(mainHolderField, \"Input\", ref);\n tx.lock(holder);\n return holder;\n}\n\nexport function unwrapHolder(tx: PlTransaction, ref: AnyRef): FieldRef {\n return tx.getFutureFieldValue(ref, HolderRefField, \"Input\");\n}\n"],"names":["field"],"mappings":"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"}
|
package/dist/helpers/pl.d.ts
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* It defines well known pl types, and methods to manipulate them.
|
|
7
7
|
*
|
|
8
8
|
*/
|
|
9
|
-
import type { FutureFieldType, ResourceType } from
|
|
10
|
-
import type { AnyRef, FieldRef, PlTransaction, ResourceRef } from
|
|
9
|
+
import type { FutureFieldType, ResourceType } from "../core/types";
|
|
10
|
+
import type { AnyRef, FieldRef, PlTransaction, ResourceRef } from "../core/transaction";
|
|
11
11
|
export declare const ClientRoot: ResourceType;
|
|
12
12
|
export declare const StructTestResource: ResourceType;
|
|
13
13
|
export declare const ValueTestResource: ResourceType;
|
package/dist/helpers/pl.js
CHANGED
|
@@ -11,19 +11,19 @@ import { field } from '../core/transaction.js';
|
|
|
11
11
|
function rt(name, version) {
|
|
12
12
|
return { name, version };
|
|
13
13
|
}
|
|
14
|
-
const ClientRoot = rt(
|
|
15
|
-
const StructTestResource = rt(
|
|
16
|
-
const ValueTestResource = rt(
|
|
17
|
-
const JsonString = rt(
|
|
18
|
-
const JsonBool = rt(
|
|
19
|
-
const JsonObject = rt(
|
|
20
|
-
const JsonGzObject = rt(
|
|
21
|
-
const JsonArray = rt(
|
|
22
|
-
const JsonNumber = rt(
|
|
23
|
-
const JsonNull = rt(
|
|
24
|
-
const RNull = rt(
|
|
25
|
-
const EphStdMap = rt(
|
|
26
|
-
const StdMap = rt(
|
|
14
|
+
const ClientRoot = rt("ClientRoot", "1");
|
|
15
|
+
const StructTestResource = rt("StructTest", "1");
|
|
16
|
+
const ValueTestResource = rt("ValueTest", "1");
|
|
17
|
+
const JsonString = rt("json/string", "1");
|
|
18
|
+
const JsonBool = rt("json/bool", "1");
|
|
19
|
+
const JsonObject = rt("json/object", "1");
|
|
20
|
+
const JsonGzObject = rt("json-gz/object", "1");
|
|
21
|
+
const JsonArray = rt("json/array", "1");
|
|
22
|
+
const JsonNumber = rt("json/number", "1");
|
|
23
|
+
const JsonNull = rt("json/null", "1");
|
|
24
|
+
const RNull = rt("Null", "1");
|
|
25
|
+
const EphStdMap = rt("EphStdMap", "1");
|
|
26
|
+
const StdMap = rt("StdMap", "1");
|
|
27
27
|
//
|
|
28
28
|
// Standard value resources
|
|
29
29
|
//
|
|
@@ -58,11 +58,11 @@ function createPlMap(tx, entries, ephemeral, type) {
|
|
|
58
58
|
const actualType = type ?? (ephemeral ? EphStdMap : StdMap);
|
|
59
59
|
const rId = ephemeral ? tx.createEphemeral(actualType) : tx.createStruct(actualType);
|
|
60
60
|
for (const [name, value] of Array.isArray(entries) ? entries : plEntries(entries))
|
|
61
|
-
tx.createField(field(rId, name),
|
|
61
|
+
tx.createField(field(rId, name), "Input", value);
|
|
62
62
|
tx.lock(rId);
|
|
63
63
|
return rId;
|
|
64
64
|
}
|
|
65
|
-
function futureRecord(tx, rId, keys, fieldType, prefix =
|
|
65
|
+
function futureRecord(tx, rId, keys, fieldType, prefix = "") {
|
|
66
66
|
return Object.fromEntries(keys.map((k) => plEntry(k, tx.getFutureFieldValue(rId, `${prefix}${k}`, fieldType))));
|
|
67
67
|
}
|
|
68
68
|
//
|
|
@@ -71,23 +71,23 @@ function futureRecord(tx, rId, keys, fieldType, prefix = '') {
|
|
|
71
71
|
/** Name of the field in block holder, that references the actual block-pack. */
|
|
72
72
|
const Holder = StdMap;
|
|
73
73
|
const EphHolder = EphStdMap;
|
|
74
|
-
const HolderRefField =
|
|
74
|
+
const HolderRefField = "ref";
|
|
75
75
|
function wrapInHolder(tx, ref) {
|
|
76
76
|
const holder = tx.createStruct(Holder);
|
|
77
77
|
const mainHolderField = field(holder, HolderRefField);
|
|
78
|
-
tx.createField(mainHolderField,
|
|
78
|
+
tx.createField(mainHolderField, "Input", ref);
|
|
79
79
|
tx.lock(holder);
|
|
80
80
|
return holder;
|
|
81
81
|
}
|
|
82
82
|
function wrapInEphHolder(tx, ref) {
|
|
83
83
|
const holder = tx.createEphemeral(EphHolder);
|
|
84
84
|
const mainHolderField = field(holder, HolderRefField);
|
|
85
|
-
tx.createField(mainHolderField,
|
|
85
|
+
tx.createField(mainHolderField, "Input", ref);
|
|
86
86
|
tx.lock(holder);
|
|
87
87
|
return holder;
|
|
88
88
|
}
|
|
89
89
|
function unwrapHolder(tx, ref) {
|
|
90
|
-
return tx.getFutureFieldValue(ref, HolderRefField,
|
|
90
|
+
return tx.getFutureFieldValue(ref, HolderRefField, "Input");
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
export { ClientRoot, EphHolder, EphStdMap, Holder, HolderRefField, JsonArray, JsonBool, JsonGzObject, JsonNull, JsonNumber, JsonObject, JsonString, RNull, StdMap, StructTestResource, ValueTestResource, createPlArray, createPlBool, createPlMap, createPlNull, createPlNumber, createPlObject, createPlString, futureRecord, plEntries, plEntry, unwrapHolder, wrapInEphHolder, wrapInHolder };
|
package/dist/helpers/pl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl.js","sources":["../../src/helpers/pl.ts"],"sourcesContent":["/**\n * @packageDocumentation\n *\n * This file is exported under Pl \"namespace\" to the client users.\n *\n * It defines well known pl types, and methods to manipulate them.\n *\n */\n\nimport type { FutureFieldType, ResourceType } from
|
|
1
|
+
{"version":3,"file":"pl.js","sources":["../../src/helpers/pl.ts"],"sourcesContent":["/**\n * @packageDocumentation\n *\n * This file is exported under Pl \"namespace\" to the client users.\n *\n * It defines well known pl types, and methods to manipulate them.\n *\n */\n\nimport type { FutureFieldType, ResourceType } from \"../core/types\";\nimport type { AnyRef, FieldRef, PlTransaction, ResourceRef } from \"../core/transaction\";\nimport { field } from \"../core/transaction\";\n\nfunction rt(name: string, version: string): ResourceType {\n return { name, version };\n}\n\nexport const ClientRoot = rt(\"ClientRoot\", \"1\");\n\nexport const StructTestResource = rt(\"StructTest\", \"1\");\nexport const ValueTestResource = rt(\"ValueTest\", \"1\");\n\nexport const JsonString = rt(\"json/string\", \"1\");\nexport const JsonBool = rt(\"json/bool\", \"1\");\nexport const JsonObject = rt(\"json/object\", \"1\");\nexport const JsonGzObject = rt(\"json-gz/object\", \"1\");\nexport const JsonArray = rt(\"json/array\", \"1\");\nexport const JsonNumber = rt(\"json/number\", \"1\");\nexport const JsonNull = rt(\"json/null\", \"1\");\n\nexport const RNull = rt(\"Null\", \"1\");\n\nexport const EphStdMap: ResourceType = rt(\"EphStdMap\", \"1\");\nexport const StdMap: ResourceType = rt(\"StdMap\", \"1\");\n\n//\n// Standard value resources\n//\n\nexport function createPlNull(tx: PlTransaction): ResourceRef {\n return tx.createValue(JsonNull, Buffer.from(JSON.stringify(null)));\n}\n\nexport function createPlBool(tx: PlTransaction, val: boolean): ResourceRef {\n return tx.createValue(JsonBool, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlNumber(tx: PlTransaction, val: number): ResourceRef {\n return tx.createValue(JsonNumber, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlString(tx: PlTransaction, val: string): ResourceRef {\n return tx.createValue(JsonString, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlArray(tx: PlTransaction, val: any[]): ResourceRef {\n return tx.createValue(JsonArray, Buffer.from(JSON.stringify(val)));\n}\n\nexport function createPlObject(tx: PlTransaction, val: object): ResourceRef {\n return tx.createValue(JsonObject, Buffer.from(JSON.stringify(val)));\n}\n\n//\n// Pl Map\n//\n\nexport type PlRecordEntry<Key extends string = string, Ref extends AnyRef = AnyRef> = [Key, Ref];\n\nexport type PlRecord<Key extends string = string, Ref extends AnyRef = AnyRef> = Record<Key, Ref>;\n\nexport function plEntry<Key extends string = string, Ref extends AnyRef = AnyRef>(\n key: Key,\n ref: Ref,\n): PlRecordEntry<Key, Ref> {\n return [key, ref];\n}\n\nexport function plEntries<Key extends string = string, Ref extends AnyRef = AnyRef>(\n record: PlRecord<Key, Ref>,\n fields?: Key[],\n): PlRecordEntry<Key, Ref>[] {\n return fields === undefined\n ? (Object.entries(record) as PlRecordEntry<Key, Ref>[])\n : fields.map((key) => plEntry(key, record[key]));\n}\n\n/** Helper method to build standard pl map from a set of entries */\nexport function createPlMap(\n tx: PlTransaction,\n entries: PlRecordEntry[] | PlRecord,\n ephemeral: boolean,\n type?: ResourceType,\n): ResourceRef {\n const actualType = type ?? (ephemeral ? EphStdMap : StdMap);\n const rId = ephemeral ? tx.createEphemeral(actualType) : tx.createStruct(actualType);\n\n for (const [name, value] of Array.isArray(entries) ? entries : plEntries(entries))\n tx.createField(field(rId, name), \"Input\", value);\n\n tx.lock(rId);\n\n return rId;\n}\n\nexport function futureRecord<Key extends string>(\n tx: PlTransaction,\n rId: AnyRef,\n keys: Key[],\n fieldType: FutureFieldType,\n prefix: string = \"\",\n): PlRecord<Key, FieldRef> {\n return Object.fromEntries(\n keys.map((k) => plEntry(k, tx.getFutureFieldValue(rId, `${prefix}${k}`, fieldType))),\n ) as PlRecord<Key, FieldRef>;\n}\n\n//\n// Holder\n//\n\n/** Name of the field in block holder, that references the actual block-pack. */\nexport const Holder = StdMap;\nexport const EphHolder = EphStdMap;\nexport const HolderRefField = \"ref\";\n\nexport function wrapInHolder(tx: PlTransaction, ref: AnyRef): ResourceRef {\n const holder = tx.createStruct(Holder);\n const mainHolderField = field(holder, HolderRefField);\n tx.createField(mainHolderField, \"Input\", ref);\n tx.lock(holder);\n return holder;\n}\n\nexport function wrapInEphHolder(tx: PlTransaction, ref: AnyRef): ResourceRef {\n const holder = tx.createEphemeral(EphHolder);\n const mainHolderField = field(holder, HolderRefField);\n tx.createField(mainHolderField, \"Input\", ref);\n tx.lock(holder);\n return holder;\n}\n\nexport function unwrapHolder(tx: PlTransaction, ref: AnyRef): FieldRef {\n return tx.getFutureFieldValue(ref, HolderRefField, \"Input\");\n}\n"],"names":[],"mappings":"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"}
|
package/dist/helpers/poll.cjs
CHANGED
|
@@ -25,7 +25,7 @@ var tp__namespace = /*#__PURE__*/_interopNamespaceDefault(tp);
|
|
|
25
25
|
|
|
26
26
|
/** This error tells state assertion mechanism that required state is not yet ready */
|
|
27
27
|
class ContinuePolling extends Error {
|
|
28
|
-
name =
|
|
28
|
+
name = "ContinuePolling";
|
|
29
29
|
}
|
|
30
30
|
const DefaultPollFieldTraverseOps = {
|
|
31
31
|
failOnError: true,
|
|
@@ -59,8 +59,8 @@ class PollResourceAccessor {
|
|
|
59
59
|
throw new Error(`Unexpected field type. Expected ${expectedType}, found ${fieldData.type}`);
|
|
60
60
|
return fieldData;
|
|
61
61
|
}
|
|
62
|
-
if (((expectedType ===
|
|
63
|
-
|
|
62
|
+
if (((expectedType === "Input" || expectedType === "Service") && this.data.inputsLocked) ||
|
|
63
|
+
(expectedType === "Output" && this.data.outputsLocked))
|
|
64
64
|
throw new Error(
|
|
65
65
|
// eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions
|
|
66
66
|
`Field "${name}" not found. Expected type: ${expectedType}, state: ${this.data}`);
|
|
@@ -112,17 +112,17 @@ class PollTxAccessor {
|
|
|
112
112
|
async throwError(error, path = []) {
|
|
113
113
|
const errorRes = await this.get(error);
|
|
114
114
|
const errorText = Buffer.from(tsHelpers.notEmpty(errorRes.data.data)).toString();
|
|
115
|
-
throw new Error(`${path.join(
|
|
115
|
+
throw new Error(`${path.join(" -> ")} = ${errorText}`);
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
const DefaultPollingRetryOptions = {
|
|
119
|
-
type:
|
|
119
|
+
type: "linearBackoff",
|
|
120
120
|
jitter: 0,
|
|
121
121
|
maxAttempts: 100,
|
|
122
122
|
backoffStep: 10,
|
|
123
123
|
initialDelay: 10,
|
|
124
124
|
};
|
|
125
|
-
async function poll(cl, cb, retryOptions = DefaultPollingRetryOptions, txName =
|
|
125
|
+
async function poll(cl, cb, retryOptions = DefaultPollingRetryOptions, txName = "polling") {
|
|
126
126
|
let retryState = tsHelpers.createRetryState(retryOptions);
|
|
127
127
|
while (true) {
|
|
128
128
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.cjs","sources":["../../src/helpers/poll.ts"],"sourcesContent":["import type { PlClient } from '../core/client';\nimport type {\n RetryOptions,\n} from '@milaboratories/ts-helpers';\nimport {\n createRetryState,\n nextRetryStateOrError,\n notEmpty,\n} from '@milaboratories/ts-helpers';\nimport type {\n FieldData,\n FieldType,\n ResourceData,\n ResourceId } from '../core/types';\nimport {\n isNotNullResourceId,\n isNullResourceId,\n resourceIdToString,\n} from '../core/types';\nimport type { PlTransaction } from '../core/transaction';\nimport * as tp from 'node:timers/promises';\n\n/** This error tells state assertion mechanism that required state is not yet ready */\nexport class ContinuePolling extends Error {\n name = 'ContinuePolling';\n}\n\nexport type PollFieldTraverseOps = {\n expectedType?: FieldType;\n /** Fail if error present along with the value, if value not present,\n * but error do, exception will be thrown anyway. */\n failOnError: boolean;\n /** Traverse only if field report its value as final. */\n onlyFinal: boolean;\n};\n\nconst DefaultPollFieldTraverseOps: PollFieldTraverseOps = {\n failOnError: true,\n onlyFinal: false,\n};\n\nexport class PollResourceAccessor {\n constructor(\n public readonly tx: PollTxAccessor,\n public readonly data: ResourceData,\n public readonly path: string[],\n ) {}\n\n public final(): PollResourceAccessor {\n if (!this.data.final) throw new ContinuePolling();\n return this;\n }\n\n public async requireNoError(): Promise<PollResourceAccessor> {\n if (isNullResourceId(this.data.error)) return this;\n await this.tx.throwError(this.data.error, this.path);\n // hmm... https://github.com/microsoft/TypeScript/issues/34955\n return this;\n }\n\n public getFieldData(name: string, expectedType?: FieldType): FieldData {\n const fieldData = this.data.fields.find((f) => f.name === name);\n\n if (fieldData !== undefined) {\n if (expectedType !== undefined && fieldData.type !== expectedType)\n throw new Error(`Unexpected field type. Expected ${expectedType}, found ${fieldData.type}`);\n return fieldData;\n }\n\n if (\n ((expectedType === 'Input' || expectedType === 'Service') && this.data.inputsLocked)\n || (expectedType === 'Output' && this.data.outputsLocked)\n )\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions\n `Field \"${name}\" not found. Expected type: ${expectedType}, state: ${this.data}`,\n );\n\n throw new ContinuePolling();\n }\n\n public async get(\n name: string,\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<PollResourceAccessor> {\n const { expectedType, failOnError } = { ...DefaultPollFieldTraverseOps, ...ops };\n const path = [...this.path, name];\n\n const fieldData = this.getFieldData(name, expectedType);\n if (isNotNullResourceId(fieldData.error) && (failOnError || isNullResourceId(fieldData.value)))\n await this.tx.throwError(fieldData.error, path);\n\n if (isNullResourceId(fieldData.value)) throw new ContinuePolling();\n\n return await this.tx.get(fieldData.value, failOnError, path);\n }\n\n public async getMulti(\n ops: Partial<PollFieldTraverseOps>,\n ...names: string[]\n ): Promise<PollResourceAccessor[]> {\n return await Promise.all(names.map((name) => this.get(name, ops)));\n }\n\n public async getMultiObj<Key extends string>(\n ops: Partial<PollFieldTraverseOps>,\n ...names: Key[]\n ): Promise<Record<Key, PollResourceAccessor>> {\n return Object.fromEntries(\n await Promise.all(names.map(async (name) => [name, await this.get(name, ops)])),\n );\n }\n\n public async getAllFinal(\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<Record<string, PollResourceAccessor>> {\n return await this.getMultiObj(\n ops,\n ...this.data.fields\n .filter((f) => f.valueIsFinal || isNotNullResourceId(f.error))\n .map((f) => f.name),\n );\n }\n\n public async getKValue(key: string): Promise<string> {\n const value = await this.tx.tx.getKValueStringIfExists(this.data.id, key);\n if (value === undefined) throw new ContinuePolling();\n return value;\n }\n\n public async getKValueObj<T>(key: string): Promise<T> {\n return JSON.parse(await this.getKValue(key)) as T;\n }\n}\n\nexport class PollTxAccessor {\n constructor(public readonly tx: PlTransaction) {}\n\n public async get(\n rid: ResourceId,\n failOnError: boolean = true,\n path: string[] = [],\n ): Promise<PollResourceAccessor> {\n const data = await this.tx.getResourceData(rid, true);\n const accessor = new PollResourceAccessor(this, data, [...path, resourceIdToString(rid)]);\n if (failOnError) await accessor.requireNoError();\n return accessor;\n }\n\n async throwError(error: ResourceId, path: string[] = []): Promise<never> {\n const errorRes = await this.get(error);\n const errorText = Buffer.from(notEmpty(errorRes.data.data)).toString();\n throw new Error(`${path.join(' -> ')} = ${errorText}`);\n }\n}\n\nexport const DefaultPollingRetryOptions: RetryOptions = {\n type: 'linearBackoff',\n jitter: 0,\n maxAttempts: 100,\n backoffStep: 10,\n initialDelay: 10,\n};\n\nexport async function poll<T>(\n cl: PlClient,\n cb: (tx: PollTxAccessor) => Promise<T>,\n retryOptions: RetryOptions = DefaultPollingRetryOptions,\n txName: string = 'polling',\n): Promise<T> {\n let retryState = createRetryState(retryOptions);\n while (true) {\n try {\n return await cl.withReadTx(txName, async (tx) => {\n return await cb(new PollTxAccessor(tx));\n });\n } catch (e: any) {\n // Rethrowing any error except the \"not ready yet\"\n if (!(e instanceof ContinuePolling)) throw e;\n }\n await tp.setTimeout(retryState.nextDelay);\n retryState = nextRetryStateOrError(retryState);\n }\n}\n"],"names":["isNullResourceId","isNotNullResourceId","resourceIdToString","notEmpty","createRetryState","tp","nextRetryStateOrError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"poll.cjs","sources":["../../src/helpers/poll.ts"],"sourcesContent":["import type { PlClient } from \"../core/client\";\nimport type { RetryOptions } from \"@milaboratories/ts-helpers\";\nimport { createRetryState, nextRetryStateOrError, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { FieldData, FieldType, ResourceData, ResourceId } from \"../core/types\";\nimport { isNotNullResourceId, isNullResourceId, resourceIdToString } from \"../core/types\";\nimport type { PlTransaction } from \"../core/transaction\";\nimport * as tp from \"node:timers/promises\";\n\n/** This error tells state assertion mechanism that required state is not yet ready */\nexport class ContinuePolling extends Error {\n name = \"ContinuePolling\";\n}\n\nexport type PollFieldTraverseOps = {\n expectedType?: FieldType;\n /** Fail if error present along with the value, if value not present,\n * but error do, exception will be thrown anyway. */\n failOnError: boolean;\n /** Traverse only if field report its value as final. */\n onlyFinal: boolean;\n};\n\nconst DefaultPollFieldTraverseOps: PollFieldTraverseOps = {\n failOnError: true,\n onlyFinal: false,\n};\n\nexport class PollResourceAccessor {\n constructor(\n public readonly tx: PollTxAccessor,\n public readonly data: ResourceData,\n public readonly path: string[],\n ) {}\n\n public final(): PollResourceAccessor {\n if (!this.data.final) throw new ContinuePolling();\n return this;\n }\n\n public async requireNoError(): Promise<PollResourceAccessor> {\n if (isNullResourceId(this.data.error)) return this;\n await this.tx.throwError(this.data.error, this.path);\n // hmm... https://github.com/microsoft/TypeScript/issues/34955\n return this;\n }\n\n public getFieldData(name: string, expectedType?: FieldType): FieldData {\n const fieldData = this.data.fields.find((f) => f.name === name);\n\n if (fieldData !== undefined) {\n if (expectedType !== undefined && fieldData.type !== expectedType)\n throw new Error(`Unexpected field type. Expected ${expectedType}, found ${fieldData.type}`);\n return fieldData;\n }\n\n if (\n ((expectedType === \"Input\" || expectedType === \"Service\") && this.data.inputsLocked) ||\n (expectedType === \"Output\" && this.data.outputsLocked)\n )\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions\n `Field \"${name}\" not found. Expected type: ${expectedType}, state: ${this.data}`,\n );\n\n throw new ContinuePolling();\n }\n\n public async get(\n name: string,\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<PollResourceAccessor> {\n const { expectedType, failOnError } = { ...DefaultPollFieldTraverseOps, ...ops };\n const path = [...this.path, name];\n\n const fieldData = this.getFieldData(name, expectedType);\n if (isNotNullResourceId(fieldData.error) && (failOnError || isNullResourceId(fieldData.value)))\n await this.tx.throwError(fieldData.error, path);\n\n if (isNullResourceId(fieldData.value)) throw new ContinuePolling();\n\n return await this.tx.get(fieldData.value, failOnError, path);\n }\n\n public async getMulti(\n ops: Partial<PollFieldTraverseOps>,\n ...names: string[]\n ): Promise<PollResourceAccessor[]> {\n return await Promise.all(names.map((name) => this.get(name, ops)));\n }\n\n public async getMultiObj<Key extends string>(\n ops: Partial<PollFieldTraverseOps>,\n ...names: Key[]\n ): Promise<Record<Key, PollResourceAccessor>> {\n return Object.fromEntries(\n await Promise.all(names.map(async (name) => [name, await this.get(name, ops)])),\n );\n }\n\n public async getAllFinal(\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<Record<string, PollResourceAccessor>> {\n return await this.getMultiObj(\n ops,\n ...this.data.fields\n .filter((f) => f.valueIsFinal || isNotNullResourceId(f.error))\n .map((f) => f.name),\n );\n }\n\n public async getKValue(key: string): Promise<string> {\n const value = await this.tx.tx.getKValueStringIfExists(this.data.id, key);\n if (value === undefined) throw new ContinuePolling();\n return value;\n }\n\n public async getKValueObj<T>(key: string): Promise<T> {\n return JSON.parse(await this.getKValue(key)) as T;\n }\n}\n\nexport class PollTxAccessor {\n constructor(public readonly tx: PlTransaction) {}\n\n public async get(\n rid: ResourceId,\n failOnError: boolean = true,\n path: string[] = [],\n ): Promise<PollResourceAccessor> {\n const data = await this.tx.getResourceData(rid, true);\n const accessor = new PollResourceAccessor(this, data, [...path, resourceIdToString(rid)]);\n if (failOnError) await accessor.requireNoError();\n return accessor;\n }\n\n async throwError(error: ResourceId, path: string[] = []): Promise<never> {\n const errorRes = await this.get(error);\n const errorText = Buffer.from(notEmpty(errorRes.data.data)).toString();\n throw new Error(`${path.join(\" -> \")} = ${errorText}`);\n }\n}\n\nexport const DefaultPollingRetryOptions: RetryOptions = {\n type: \"linearBackoff\",\n jitter: 0,\n maxAttempts: 100,\n backoffStep: 10,\n initialDelay: 10,\n};\n\nexport async function poll<T>(\n cl: PlClient,\n cb: (tx: PollTxAccessor) => Promise<T>,\n retryOptions: RetryOptions = DefaultPollingRetryOptions,\n txName: string = \"polling\",\n): Promise<T> {\n let retryState = createRetryState(retryOptions);\n while (true) {\n try {\n return await cl.withReadTx(txName, async (tx) => {\n return await cb(new PollTxAccessor(tx));\n });\n } catch (e: any) {\n // Rethrowing any error except the \"not ready yet\"\n if (!(e instanceof ContinuePolling)) throw e;\n }\n await tp.setTimeout(retryState.nextDelay);\n retryState = nextRetryStateOrError(retryState);\n }\n}\n"],"names":["isNullResourceId","isNotNullResourceId","resourceIdToString","notEmpty","createRetryState","tp","nextRetryStateOrError"],"mappings":"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"}
|
package/dist/helpers/poll.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { PlClient } from
|
|
2
|
-
import type { RetryOptions } from
|
|
3
|
-
import type { FieldData, FieldType, ResourceData, ResourceId } from
|
|
4
|
-
import type { PlTransaction } from
|
|
1
|
+
import type { PlClient } from "../core/client";
|
|
2
|
+
import type { RetryOptions } from "@milaboratories/ts-helpers";
|
|
3
|
+
import type { FieldData, FieldType, ResourceData, ResourceId } from "../core/types";
|
|
4
|
+
import type { PlTransaction } from "../core/transaction";
|
|
5
5
|
/** This error tells state assertion mechanism that required state is not yet ready */
|
|
6
6
|
export declare class ContinuePolling extends Error {
|
|
7
7
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/helpers/poll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/helpers/poll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,sFAAsF;AACtF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,IAAI,SAAqB;CAC1B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB;wDACoD;IACpD,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAOF,qBAAa,oBAAoB;aAEb,EAAE,EAAE,cAAc;aAClB,IAAI,EAAE,YAAY;aAClB,IAAI,EAAE,MAAM,EAAE;gBAFd,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EAAE;IAGzB,KAAK,IAAI,oBAAoB;IAKvB,cAAc,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAOrD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS,GAAG,SAAS;IAqBzD,GAAG,CACd,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,OAAO,CAAC,oBAAoB,CAAM,GACtC,OAAO,CAAC,oBAAoB,CAAC;IAanB,QAAQ,CACnB,GAAG,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAClC,GAAG,KAAK,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAIrB,WAAW,CAAC,GAAG,SAAS,MAAM,EACzC,GAAG,EAAE,OAAO,CAAC,oBAAoB,CAAC,EAClC,GAAG,KAAK,EAAE,GAAG,EAAE,GACd,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;IAMhC,WAAW,CACtB,GAAG,GAAE,OAAO,CAAC,oBAAoB,CAAM,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IASnC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvC,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAGtD;AAED,qBAAa,cAAc;aACG,EAAE,EAAE,aAAa;gBAAjB,EAAE,EAAE,aAAa;IAEhC,GAAG,CACd,GAAG,EAAE,UAAU,EACf,WAAW,GAAE,OAAc,EAC3B,IAAI,GAAE,MAAM,EAAO,GAClB,OAAO,CAAC,oBAAoB,CAAC;IAO1B,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,KAAK,CAAC;CAKzE;AAED,eAAO,MAAM,0BAA0B,EAAE,YAMxC,CAAC;AAEF,wBAAsB,IAAI,CAAC,CAAC,EAC1B,EAAE,EAAE,QAAQ,EACZ,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,YAAY,GAAE,YAAyC,EACvD,MAAM,GAAE,MAAkB,GACzB,OAAO,CAAC,CAAC,CAAC,CAcZ"}
|
package/dist/helpers/poll.js
CHANGED
|
@@ -4,7 +4,7 @@ import * as tp from 'node:timers/promises';
|
|
|
4
4
|
|
|
5
5
|
/** This error tells state assertion mechanism that required state is not yet ready */
|
|
6
6
|
class ContinuePolling extends Error {
|
|
7
|
-
name =
|
|
7
|
+
name = "ContinuePolling";
|
|
8
8
|
}
|
|
9
9
|
const DefaultPollFieldTraverseOps = {
|
|
10
10
|
failOnError: true,
|
|
@@ -38,8 +38,8 @@ class PollResourceAccessor {
|
|
|
38
38
|
throw new Error(`Unexpected field type. Expected ${expectedType}, found ${fieldData.type}`);
|
|
39
39
|
return fieldData;
|
|
40
40
|
}
|
|
41
|
-
if (((expectedType ===
|
|
42
|
-
|
|
41
|
+
if (((expectedType === "Input" || expectedType === "Service") && this.data.inputsLocked) ||
|
|
42
|
+
(expectedType === "Output" && this.data.outputsLocked))
|
|
43
43
|
throw new Error(
|
|
44
44
|
// eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions
|
|
45
45
|
`Field "${name}" not found. Expected type: ${expectedType}, state: ${this.data}`);
|
|
@@ -91,17 +91,17 @@ class PollTxAccessor {
|
|
|
91
91
|
async throwError(error, path = []) {
|
|
92
92
|
const errorRes = await this.get(error);
|
|
93
93
|
const errorText = Buffer.from(notEmpty(errorRes.data.data)).toString();
|
|
94
|
-
throw new Error(`${path.join(
|
|
94
|
+
throw new Error(`${path.join(" -> ")} = ${errorText}`);
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
const DefaultPollingRetryOptions = {
|
|
98
|
-
type:
|
|
98
|
+
type: "linearBackoff",
|
|
99
99
|
jitter: 0,
|
|
100
100
|
maxAttempts: 100,
|
|
101
101
|
backoffStep: 10,
|
|
102
102
|
initialDelay: 10,
|
|
103
103
|
};
|
|
104
|
-
async function poll(cl, cb, retryOptions = DefaultPollingRetryOptions, txName =
|
|
104
|
+
async function poll(cl, cb, retryOptions = DefaultPollingRetryOptions, txName = "polling") {
|
|
105
105
|
let retryState = createRetryState(retryOptions);
|
|
106
106
|
while (true) {
|
|
107
107
|
try {
|
package/dist/helpers/poll.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.js","sources":["../../src/helpers/poll.ts"],"sourcesContent":["import type { PlClient } from '../core/client';\nimport type {\n RetryOptions,\n} from '@milaboratories/ts-helpers';\nimport {\n createRetryState,\n nextRetryStateOrError,\n notEmpty,\n} from '@milaboratories/ts-helpers';\nimport type {\n FieldData,\n FieldType,\n ResourceData,\n ResourceId } from '../core/types';\nimport {\n isNotNullResourceId,\n isNullResourceId,\n resourceIdToString,\n} from '../core/types';\nimport type { PlTransaction } from '../core/transaction';\nimport * as tp from 'node:timers/promises';\n\n/** This error tells state assertion mechanism that required state is not yet ready */\nexport class ContinuePolling extends Error {\n name = 'ContinuePolling';\n}\n\nexport type PollFieldTraverseOps = {\n expectedType?: FieldType;\n /** Fail if error present along with the value, if value not present,\n * but error do, exception will be thrown anyway. */\n failOnError: boolean;\n /** Traverse only if field report its value as final. */\n onlyFinal: boolean;\n};\n\nconst DefaultPollFieldTraverseOps: PollFieldTraverseOps = {\n failOnError: true,\n onlyFinal: false,\n};\n\nexport class PollResourceAccessor {\n constructor(\n public readonly tx: PollTxAccessor,\n public readonly data: ResourceData,\n public readonly path: string[],\n ) {}\n\n public final(): PollResourceAccessor {\n if (!this.data.final) throw new ContinuePolling();\n return this;\n }\n\n public async requireNoError(): Promise<PollResourceAccessor> {\n if (isNullResourceId(this.data.error)) return this;\n await this.tx.throwError(this.data.error, this.path);\n // hmm... https://github.com/microsoft/TypeScript/issues/34955\n return this;\n }\n\n public getFieldData(name: string, expectedType?: FieldType): FieldData {\n const fieldData = this.data.fields.find((f) => f.name === name);\n\n if (fieldData !== undefined) {\n if (expectedType !== undefined && fieldData.type !== expectedType)\n throw new Error(`Unexpected field type. Expected ${expectedType}, found ${fieldData.type}`);\n return fieldData;\n }\n\n if (\n ((expectedType === 'Input' || expectedType === 'Service') && this.data.inputsLocked)\n || (expectedType === 'Output' && this.data.outputsLocked)\n )\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions\n `Field \"${name}\" not found. Expected type: ${expectedType}, state: ${this.data}`,\n );\n\n throw new ContinuePolling();\n }\n\n public async get(\n name: string,\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<PollResourceAccessor> {\n const { expectedType, failOnError } = { ...DefaultPollFieldTraverseOps, ...ops };\n const path = [...this.path, name];\n\n const fieldData = this.getFieldData(name, expectedType);\n if (isNotNullResourceId(fieldData.error) && (failOnError || isNullResourceId(fieldData.value)))\n await this.tx.throwError(fieldData.error, path);\n\n if (isNullResourceId(fieldData.value)) throw new ContinuePolling();\n\n return await this.tx.get(fieldData.value, failOnError, path);\n }\n\n public async getMulti(\n ops: Partial<PollFieldTraverseOps>,\n ...names: string[]\n ): Promise<PollResourceAccessor[]> {\n return await Promise.all(names.map((name) => this.get(name, ops)));\n }\n\n public async getMultiObj<Key extends string>(\n ops: Partial<PollFieldTraverseOps>,\n ...names: Key[]\n ): Promise<Record<Key, PollResourceAccessor>> {\n return Object.fromEntries(\n await Promise.all(names.map(async (name) => [name, await this.get(name, ops)])),\n );\n }\n\n public async getAllFinal(\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<Record<string, PollResourceAccessor>> {\n return await this.getMultiObj(\n ops,\n ...this.data.fields\n .filter((f) => f.valueIsFinal || isNotNullResourceId(f.error))\n .map((f) => f.name),\n );\n }\n\n public async getKValue(key: string): Promise<string> {\n const value = await this.tx.tx.getKValueStringIfExists(this.data.id, key);\n if (value === undefined) throw new ContinuePolling();\n return value;\n }\n\n public async getKValueObj<T>(key: string): Promise<T> {\n return JSON.parse(await this.getKValue(key)) as T;\n }\n}\n\nexport class PollTxAccessor {\n constructor(public readonly tx: PlTransaction) {}\n\n public async get(\n rid: ResourceId,\n failOnError: boolean = true,\n path: string[] = [],\n ): Promise<PollResourceAccessor> {\n const data = await this.tx.getResourceData(rid, true);\n const accessor = new PollResourceAccessor(this, data, [...path, resourceIdToString(rid)]);\n if (failOnError) await accessor.requireNoError();\n return accessor;\n }\n\n async throwError(error: ResourceId, path: string[] = []): Promise<never> {\n const errorRes = await this.get(error);\n const errorText = Buffer.from(notEmpty(errorRes.data.data)).toString();\n throw new Error(`${path.join(' -> ')} = ${errorText}`);\n }\n}\n\nexport const DefaultPollingRetryOptions: RetryOptions = {\n type: 'linearBackoff',\n jitter: 0,\n maxAttempts: 100,\n backoffStep: 10,\n initialDelay: 10,\n};\n\nexport async function poll<T>(\n cl: PlClient,\n cb: (tx: PollTxAccessor) => Promise<T>,\n retryOptions: RetryOptions = DefaultPollingRetryOptions,\n txName: string = 'polling',\n): Promise<T> {\n let retryState = createRetryState(retryOptions);\n while (true) {\n try {\n return await cl.withReadTx(txName, async (tx) => {\n return await cb(new PollTxAccessor(tx));\n });\n } catch (e: any) {\n // Rethrowing any error except the \"not ready yet\"\n if (!(e instanceof ContinuePolling)) throw e;\n }\n await tp.setTimeout(retryState.nextDelay);\n retryState = nextRetryStateOrError(retryState);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"poll.js","sources":["../../src/helpers/poll.ts"],"sourcesContent":["import type { PlClient } from \"../core/client\";\nimport type { RetryOptions } from \"@milaboratories/ts-helpers\";\nimport { createRetryState, nextRetryStateOrError, notEmpty } from \"@milaboratories/ts-helpers\";\nimport type { FieldData, FieldType, ResourceData, ResourceId } from \"../core/types\";\nimport { isNotNullResourceId, isNullResourceId, resourceIdToString } from \"../core/types\";\nimport type { PlTransaction } from \"../core/transaction\";\nimport * as tp from \"node:timers/promises\";\n\n/** This error tells state assertion mechanism that required state is not yet ready */\nexport class ContinuePolling extends Error {\n name = \"ContinuePolling\";\n}\n\nexport type PollFieldTraverseOps = {\n expectedType?: FieldType;\n /** Fail if error present along with the value, if value not present,\n * but error do, exception will be thrown anyway. */\n failOnError: boolean;\n /** Traverse only if field report its value as final. */\n onlyFinal: boolean;\n};\n\nconst DefaultPollFieldTraverseOps: PollFieldTraverseOps = {\n failOnError: true,\n onlyFinal: false,\n};\n\nexport class PollResourceAccessor {\n constructor(\n public readonly tx: PollTxAccessor,\n public readonly data: ResourceData,\n public readonly path: string[],\n ) {}\n\n public final(): PollResourceAccessor {\n if (!this.data.final) throw new ContinuePolling();\n return this;\n }\n\n public async requireNoError(): Promise<PollResourceAccessor> {\n if (isNullResourceId(this.data.error)) return this;\n await this.tx.throwError(this.data.error, this.path);\n // hmm... https://github.com/microsoft/TypeScript/issues/34955\n return this;\n }\n\n public getFieldData(name: string, expectedType?: FieldType): FieldData {\n const fieldData = this.data.fields.find((f) => f.name === name);\n\n if (fieldData !== undefined) {\n if (expectedType !== undefined && fieldData.type !== expectedType)\n throw new Error(`Unexpected field type. Expected ${expectedType}, found ${fieldData.type}`);\n return fieldData;\n }\n\n if (\n ((expectedType === \"Input\" || expectedType === \"Service\") && this.data.inputsLocked) ||\n (expectedType === \"Output\" && this.data.outputsLocked)\n )\n throw new Error(\n // eslint-disable-next-line @typescript-eslint/no-base-to-string, @typescript-eslint/restrict-template-expressions\n `Field \"${name}\" not found. Expected type: ${expectedType}, state: ${this.data}`,\n );\n\n throw new ContinuePolling();\n }\n\n public async get(\n name: string,\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<PollResourceAccessor> {\n const { expectedType, failOnError } = { ...DefaultPollFieldTraverseOps, ...ops };\n const path = [...this.path, name];\n\n const fieldData = this.getFieldData(name, expectedType);\n if (isNotNullResourceId(fieldData.error) && (failOnError || isNullResourceId(fieldData.value)))\n await this.tx.throwError(fieldData.error, path);\n\n if (isNullResourceId(fieldData.value)) throw new ContinuePolling();\n\n return await this.tx.get(fieldData.value, failOnError, path);\n }\n\n public async getMulti(\n ops: Partial<PollFieldTraverseOps>,\n ...names: string[]\n ): Promise<PollResourceAccessor[]> {\n return await Promise.all(names.map((name) => this.get(name, ops)));\n }\n\n public async getMultiObj<Key extends string>(\n ops: Partial<PollFieldTraverseOps>,\n ...names: Key[]\n ): Promise<Record<Key, PollResourceAccessor>> {\n return Object.fromEntries(\n await Promise.all(names.map(async (name) => [name, await this.get(name, ops)])),\n );\n }\n\n public async getAllFinal(\n ops: Partial<PollFieldTraverseOps> = {},\n ): Promise<Record<string, PollResourceAccessor>> {\n return await this.getMultiObj(\n ops,\n ...this.data.fields\n .filter((f) => f.valueIsFinal || isNotNullResourceId(f.error))\n .map((f) => f.name),\n );\n }\n\n public async getKValue(key: string): Promise<string> {\n const value = await this.tx.tx.getKValueStringIfExists(this.data.id, key);\n if (value === undefined) throw new ContinuePolling();\n return value;\n }\n\n public async getKValueObj<T>(key: string): Promise<T> {\n return JSON.parse(await this.getKValue(key)) as T;\n }\n}\n\nexport class PollTxAccessor {\n constructor(public readonly tx: PlTransaction) {}\n\n public async get(\n rid: ResourceId,\n failOnError: boolean = true,\n path: string[] = [],\n ): Promise<PollResourceAccessor> {\n const data = await this.tx.getResourceData(rid, true);\n const accessor = new PollResourceAccessor(this, data, [...path, resourceIdToString(rid)]);\n if (failOnError) await accessor.requireNoError();\n return accessor;\n }\n\n async throwError(error: ResourceId, path: string[] = []): Promise<never> {\n const errorRes = await this.get(error);\n const errorText = Buffer.from(notEmpty(errorRes.data.data)).toString();\n throw new Error(`${path.join(\" -> \")} = ${errorText}`);\n }\n}\n\nexport const DefaultPollingRetryOptions: RetryOptions = {\n type: \"linearBackoff\",\n jitter: 0,\n maxAttempts: 100,\n backoffStep: 10,\n initialDelay: 10,\n};\n\nexport async function poll<T>(\n cl: PlClient,\n cb: (tx: PollTxAccessor) => Promise<T>,\n retryOptions: RetryOptions = DefaultPollingRetryOptions,\n txName: string = \"polling\",\n): Promise<T> {\n let retryState = createRetryState(retryOptions);\n while (true) {\n try {\n return await cl.withReadTx(txName, async (tx) => {\n return await cb(new PollTxAccessor(tx));\n });\n } catch (e: any) {\n // Rethrowing any error except the \"not ready yet\"\n if (!(e instanceof ContinuePolling)) throw e;\n }\n await tp.setTimeout(retryState.nextDelay);\n retryState = nextRetryStateOrError(retryState);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -82,7 +82,7 @@ class ExponentialBackoff {
|
|
|
82
82
|
if (delay === 0 || this.jitter === 0) {
|
|
83
83
|
return delay;
|
|
84
84
|
}
|
|
85
|
-
const delayFactor = 1 -
|
|
85
|
+
const delayFactor = 1 - this.jitter / 2 + Math.random() * this.jitter;
|
|
86
86
|
return delay * delayFactor;
|
|
87
87
|
}
|
|
88
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry_strategy.cjs","sources":["../../src/helpers/retry_strategy.ts"],"sourcesContent":["export interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxAttempts: 10,\n initialDelay: 100,\n maxDelay: 30000,\n};\n\nexport interface RetryCallbacks {\n onRetry: () => void;\n onMaxAttemptsReached: (error: Error) => void;\n}\n\nexport class RetryStrategy {\n private attempts = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly config: RetryConfig;\n private readonly callbacks: RetryCallbacks;\n private readonly backoff: ExponentialBackoff;\n\n constructor(config: Partial<RetryConfig>, callbacks: RetryCallbacks) {\n this.config = { ...DEFAULT_RETRY_CONFIG, ...config };\n this.callbacks = callbacks;\n this.backoff = new ExponentialBackoff({\n initialDelay: this.config.initialDelay,\n maxDelay: this.config.maxDelay,\n factor: 2,\n jitter: 0.1,\n });\n }\n\n schedule(): void {\n if (this.timer) return;\n if (this.hasExceededLimit()) {\n this.notifyMaxAttemptsReached();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.timer = null;\n this.attempts++;\n this.callbacks.onRetry();\n }, this.backoff.delay());\n }\n\n cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n reset(): void {\n this.attempts = 0;\n this.backoff.reset();\n }\n\n private hasExceededLimit(): boolean {\n return this.attempts >= this.config.maxAttempts;\n }\n\n private notifyMaxAttemptsReached(): void {\n const error = new Error(
|
|
1
|
+
{"version":3,"file":"retry_strategy.cjs","sources":["../../src/helpers/retry_strategy.ts"],"sourcesContent":["export interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxAttempts: 10,\n initialDelay: 100,\n maxDelay: 30000,\n};\n\nexport interface RetryCallbacks {\n onRetry: () => void;\n onMaxAttemptsReached: (error: Error) => void;\n}\n\nexport class RetryStrategy {\n private attempts = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly config: RetryConfig;\n private readonly callbacks: RetryCallbacks;\n private readonly backoff: ExponentialBackoff;\n\n constructor(config: Partial<RetryConfig>, callbacks: RetryCallbacks) {\n this.config = { ...DEFAULT_RETRY_CONFIG, ...config };\n this.callbacks = callbacks;\n this.backoff = new ExponentialBackoff({\n initialDelay: this.config.initialDelay,\n maxDelay: this.config.maxDelay,\n factor: 2,\n jitter: 0.1,\n });\n }\n\n schedule(): void {\n if (this.timer) return;\n if (this.hasExceededLimit()) {\n this.notifyMaxAttemptsReached();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.timer = null;\n this.attempts++;\n this.callbacks.onRetry();\n }, this.backoff.delay());\n }\n\n cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n reset(): void {\n this.attempts = 0;\n this.backoff.reset();\n }\n\n private hasExceededLimit(): boolean {\n return this.attempts >= this.config.maxAttempts;\n }\n\n private notifyMaxAttemptsReached(): void {\n const error = new Error(`Max retry attempts (${this.config.maxAttempts}) reached`);\n this.callbacks.onMaxAttemptsReached(error);\n }\n}\n\ninterface ExponentialBackoffConfig {\n initialDelay: number;\n maxDelay: number;\n factor: number;\n jitter: number;\n}\n\nclass ExponentialBackoff {\n private readonly initialDelay: number;\n private readonly maxDelay: number;\n\n private currentDelay: number;\n\n private readonly factor: number;\n private readonly jitter: number;\n\n constructor(config: ExponentialBackoffConfig) {\n this.initialDelay = config.initialDelay;\n this.maxDelay = config.maxDelay;\n this.factor = config.factor;\n this.jitter = config.jitter;\n this.currentDelay = config.initialDelay;\n }\n\n delay(): number {\n if (this.currentDelay >= this.maxDelay) {\n return this.applyJitter(this.maxDelay);\n }\n\n this.currentDelay = this.currentDelay * this.factor;\n\n if (this.currentDelay > this.maxDelay) {\n this.currentDelay = this.maxDelay;\n }\n\n return this.applyJitter(this.currentDelay);\n }\n\n reset(): void {\n this.currentDelay = this.initialDelay;\n }\n\n private applyJitter(delay: number): number {\n if (delay === 0 || this.jitter === 0) {\n return delay;\n }\n const delayFactor = 1 - this.jitter / 2 + Math.random() * this.jitter;\n return delay * delayFactor;\n }\n}\n"],"names":[],"mappings":";;AAMO,MAAM,oBAAoB,GAAgB;AAC/C,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,YAAY,EAAE,GAAG;AACjB,IAAA,QAAQ,EAAE,KAAK;;MAQJ,aAAa,CAAA;IAChB,QAAQ,GAAG,CAAC;IACZ,KAAK,GAAyC,IAAI;AACzC,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,OAAO;IAExB,WAAA,CAAY,MAA4B,EAAE,SAAyB,EAAA;QACjE,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,MAAM,EAAE;AACpD,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,kBAAkB,CAAC;AACpC,YAAA,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;AACtC,YAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC9B,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,MAAM,EAAE,GAAG;AACZ,SAAA,CAAC;IACJ;IAEA,QAAQ,GAAA;QACN,IAAI,IAAI,CAAC,KAAK;YAAE;AAChB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;YAC3B,IAAI,CAAC,wBAAwB,EAAE;YAC/B;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,MAAK;AAC3B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;YACjB,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;QAC1B,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC1B;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AACxB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACnB;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;AACjB,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACtB;IAEQ,gBAAgB,GAAA;QACtB,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;IACjD;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,CAAA,oBAAA,EAAuB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA,SAAA,CAAW,CAAC;AAClF,QAAA,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,KAAK,CAAC;IAC5C;AACD;AASD,MAAM,kBAAkB,CAAA;AACL,IAAA,YAAY;AACZ,IAAA,QAAQ;AAEjB,IAAA,YAAY;AAEH,IAAA,MAAM;AACN,IAAA,MAAM;AAEvB,IAAA,WAAA,CAAY,MAAgC,EAAA;AAC1C,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;AACvC,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ;AAC/B,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC3B,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;IACzC;IAEA,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EAAE;YACtC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC;QAEA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM;QAEnD,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE;AACrC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ;QACnC;QAEA,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;IAC5C;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY;IACvC;AAEQ,IAAA,WAAW,CAAC,KAAa,EAAA;QAC/B,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACpC,YAAA,OAAO,KAAK;QACd;AACA,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM;QACrE,OAAO,KAAK,GAAG,WAAW;IAC5B;AACD;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry_strategy.d.ts","sourceRoot":"","sources":["../../src/helpers/retry_strategy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,WAIlC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9C;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,cAAc;IAWnE,QAAQ,IAAI,IAAI;IAchB,MAAM,IAAI,IAAI;IAOd,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,wBAAwB;
|
|
1
|
+
{"version":3,"file":"retry_strategy.d.ts","sourceRoot":"","sources":["../../src/helpers/retry_strategy.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,WAIlC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oBAAoB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC9C;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiB;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;gBAEjC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,cAAc;IAWnE,QAAQ,IAAI,IAAI;IAchB,MAAM,IAAI,IAAI;IAOd,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,wBAAwB;CAIjC"}
|
|
@@ -80,7 +80,7 @@ class ExponentialBackoff {
|
|
|
80
80
|
if (delay === 0 || this.jitter === 0) {
|
|
81
81
|
return delay;
|
|
82
82
|
}
|
|
83
|
-
const delayFactor = 1 -
|
|
83
|
+
const delayFactor = 1 - this.jitter / 2 + Math.random() * this.jitter;
|
|
84
84
|
return delay * delayFactor;
|
|
85
85
|
}
|
|
86
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry_strategy.js","sources":["../../src/helpers/retry_strategy.ts"],"sourcesContent":["export interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxAttempts: 10,\n initialDelay: 100,\n maxDelay: 30000,\n};\n\nexport interface RetryCallbacks {\n onRetry: () => void;\n onMaxAttemptsReached: (error: Error) => void;\n}\n\nexport class RetryStrategy {\n private attempts = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly config: RetryConfig;\n private readonly callbacks: RetryCallbacks;\n private readonly backoff: ExponentialBackoff;\n\n constructor(config: Partial<RetryConfig>, callbacks: RetryCallbacks) {\n this.config = { ...DEFAULT_RETRY_CONFIG, ...config };\n this.callbacks = callbacks;\n this.backoff = new ExponentialBackoff({\n initialDelay: this.config.initialDelay,\n maxDelay: this.config.maxDelay,\n factor: 2,\n jitter: 0.1,\n });\n }\n\n schedule(): void {\n if (this.timer) return;\n if (this.hasExceededLimit()) {\n this.notifyMaxAttemptsReached();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.timer = null;\n this.attempts++;\n this.callbacks.onRetry();\n }, this.backoff.delay());\n }\n\n cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n reset(): void {\n this.attempts = 0;\n this.backoff.reset();\n }\n\n private hasExceededLimit(): boolean {\n return this.attempts >= this.config.maxAttempts;\n }\n\n private notifyMaxAttemptsReached(): void {\n const error = new Error(
|
|
1
|
+
{"version":3,"file":"retry_strategy.js","sources":["../../src/helpers/retry_strategy.ts"],"sourcesContent":["export interface RetryConfig {\n maxAttempts: number;\n initialDelay: number;\n maxDelay: number;\n}\n\nexport const DEFAULT_RETRY_CONFIG: RetryConfig = {\n maxAttempts: 10,\n initialDelay: 100,\n maxDelay: 30000,\n};\n\nexport interface RetryCallbacks {\n onRetry: () => void;\n onMaxAttemptsReached: (error: Error) => void;\n}\n\nexport class RetryStrategy {\n private attempts = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly config: RetryConfig;\n private readonly callbacks: RetryCallbacks;\n private readonly backoff: ExponentialBackoff;\n\n constructor(config: Partial<RetryConfig>, callbacks: RetryCallbacks) {\n this.config = { ...DEFAULT_RETRY_CONFIG, ...config };\n this.callbacks = callbacks;\n this.backoff = new ExponentialBackoff({\n initialDelay: this.config.initialDelay,\n maxDelay: this.config.maxDelay,\n factor: 2,\n jitter: 0.1,\n });\n }\n\n schedule(): void {\n if (this.timer) return;\n if (this.hasExceededLimit()) {\n this.notifyMaxAttemptsReached();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.timer = null;\n this.attempts++;\n this.callbacks.onRetry();\n }, this.backoff.delay());\n }\n\n cancel(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n\n reset(): void {\n this.attempts = 0;\n this.backoff.reset();\n }\n\n private hasExceededLimit(): boolean {\n return this.attempts >= this.config.maxAttempts;\n }\n\n private notifyMaxAttemptsReached(): void {\n const error = new Error(`Max retry attempts (${this.config.maxAttempts}) reached`);\n this.callbacks.onMaxAttemptsReached(error);\n }\n}\n\ninterface ExponentialBackoffConfig {\n initialDelay: number;\n maxDelay: number;\n factor: number;\n jitter: number;\n}\n\nclass ExponentialBackoff {\n private readonly initialDelay: number;\n private readonly maxDelay: number;\n\n private currentDelay: number;\n\n private readonly factor: number;\n private readonly jitter: number;\n\n constructor(config: ExponentialBackoffConfig) {\n this.initialDelay = config.initialDelay;\n this.maxDelay = config.maxDelay;\n this.factor = config.factor;\n this.jitter = config.jitter;\n this.currentDelay = config.initialDelay;\n }\n\n delay(): number {\n if (this.currentDelay >= this.maxDelay) {\n return this.applyJitter(this.maxDelay);\n }\n\n this.currentDelay = this.currentDelay * this.factor;\n\n if (this.currentDelay > this.maxDelay) {\n this.currentDelay = this.maxDelay;\n }\n\n return this.applyJitter(this.currentDelay);\n }\n\n reset(): void {\n this.currentDelay = this.initialDelay;\n }\n\n private applyJitter(delay: number): number {\n if (delay === 0 || this.jitter === 0) {\n return delay;\n }\n const delayFactor = 1 - this.jitter / 2 + Math.random() * this.jitter;\n return delay * delayFactor;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { FieldData } from
|
|
2
|
-
export declare function fieldResolved(data: Pick<FieldData,
|
|
1
|
+
import type { FieldData } from "../core/types";
|
|
2
|
+
export declare function fieldResolved(data: Pick<FieldData, "value" | "error">): boolean;
|
|
3
3
|
//# sourceMappingURL=state_helpers.d.ts.map
|