@milaboratories/pl-client 3.4.2 → 3.6.0

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 (74) hide show
  1. package/dist/core/final.cjs.map +1 -1
  2. package/dist/core/final.js.map +1 -1
  3. package/dist/core/ll_client.cjs +7 -1
  4. package/dist/core/ll_client.cjs.map +1 -1
  5. package/dist/core/ll_client.d.ts.map +1 -1
  6. package/dist/core/ll_client.js +7 -1
  7. package/dist/core/ll_client.js.map +1 -1
  8. package/dist/core/ll_transaction.cjs +151 -26
  9. package/dist/core/ll_transaction.cjs.map +1 -1
  10. package/dist/core/ll_transaction.d.ts +1 -0
  11. package/dist/core/ll_transaction.d.ts.map +1 -1
  12. package/dist/core/ll_transaction.js +151 -26
  13. package/dist/core/ll_transaction.js.map +1 -1
  14. package/dist/core/transaction.cjs +89 -0
  15. package/dist/core/transaction.cjs.map +1 -1
  16. package/dist/core/transaction.d.ts +47 -1
  17. package/dist/core/transaction.d.ts.map +1 -1
  18. package/dist/core/transaction.js +90 -1
  19. package/dist/core/transaction.js.map +1 -1
  20. package/dist/core/tree_filter.cjs +106 -0
  21. package/dist/core/tree_filter.cjs.map +1 -0
  22. package/dist/core/tree_filter.d.ts +85 -0
  23. package/dist/core/tree_filter.d.ts.map +1 -0
  24. package/dist/core/tree_filter.js +106 -0
  25. package/dist/core/tree_filter.js.map +1 -0
  26. package/dist/core/type_conversion.cjs +1 -0
  27. package/dist/core/type_conversion.cjs.map +1 -1
  28. package/dist/core/type_conversion.js +1 -1
  29. package/dist/core/type_conversion.js.map +1 -1
  30. package/dist/core/types.cjs +10 -0
  31. package/dist/core/types.cjs.map +1 -1
  32. package/dist/core/types.d.ts +4 -1
  33. package/dist/core/types.d.ts.map +1 -1
  34. package/dist/core/types.js +10 -1
  35. package/dist/core/types.js.map +1 -1
  36. package/dist/index.cjs +6 -0
  37. package/dist/index.d.ts +5 -3
  38. package/dist/index.js +4 -2
  39. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs.map +1 -1
  40. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js.map +1 -1
  41. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +450 -4
  42. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
  43. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +328 -2
  44. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +1 -1
  45. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +449 -5
  46. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
  47. package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
  48. package/dist/proto-grpc/google/protobuf/timestamp.d.ts +9 -8
  49. package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +1 -1
  50. package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
  51. package/dist/proto-grpc/google/rpc/code.cjs.map +1 -1
  52. package/dist/proto-grpc/google/rpc/code.js.map +1 -1
  53. package/package.json +6 -6
  54. package/src/core/final.ts +1 -1
  55. package/src/core/ll_client.ts +11 -1
  56. package/src/core/ll_transaction.test.ts +13 -18
  57. package/src/core/ll_transaction.ts +237 -60
  58. package/src/core/transaction.test.ts +38 -0
  59. package/src/core/transaction.ts +136 -1
  60. package/src/core/tree_filter.test.ts +217 -0
  61. package/src/core/tree_filter.ts +182 -0
  62. package/src/core/type_conversion.ts +1 -1
  63. package/src/core/types.ts +13 -3
  64. package/src/index.ts +1 -0
  65. package/src/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.ts +1 -1
  66. package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.ts +604 -6
  67. package/src/proto-grpc/google/api/http.ts +1 -1
  68. package/src/proto-grpc/google/protobuf/descriptor.ts +242 -12
  69. package/src/proto-grpc/google/protobuf/timestamp.ts +9 -8
  70. package/src/proto-grpc/google/protobuf/wrappers.ts +38 -4
  71. package/src/proto-grpc/google/rpc/code.ts +1 -1
  72. package/src/proto-grpc/google/rpc/error_details.ts +5 -5
  73. package/src/proto-grpc/google/rpc/http.ts +1 -1
  74. package/src/proto-grpc/google/rpc/status.ts +1 -1
@@ -0,0 +1,106 @@
1
+ import { ResourceAPI_Tree_Filter_OperatorType, ResourceAPI_Tree_Filter_Property } from "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js";
2
+ //#region src/core/tree_filter.ts
3
+ /**
4
+ * Builder helpers for {@link ResourceAPI_Tree_Filter} predicates used in
5
+ * `ResourceAPI_Tree_Request.fieldFilter` and `traverseStopRules`.
6
+ *
7
+ * Property restrictions (not enforced here; the backend rejects invalid combinations):
8
+ * - `FIELD_NAME` is only valid inside `fieldFilter`.
9
+ * - `IS_FINAL`, `ALL_OUTPUTS_FINAL`, and resource-level boolean predicates are only valid inside `traverseStopRules`.
10
+ */
11
+ const treeFilter = {
12
+ and(...children) {
13
+ return {
14
+ operator: ResourceAPI_Tree_Filter_OperatorType.AND,
15
+ value: {
16
+ oneofKind: "filtersValue",
17
+ filtersValue: { filters: children }
18
+ }
19
+ };
20
+ },
21
+ or(...children) {
22
+ return {
23
+ operator: ResourceAPI_Tree_Filter_OperatorType.OR,
24
+ value: {
25
+ oneofKind: "filtersValue",
26
+ filtersValue: { filters: children }
27
+ }
28
+ };
29
+ },
30
+ not(child) {
31
+ return {
32
+ operator: ResourceAPI_Tree_Filter_OperatorType.NOT,
33
+ value: {
34
+ oneofKind: "filtersValue",
35
+ filtersValue: { filters: [child] }
36
+ }
37
+ };
38
+ },
39
+ eq(prop, value) {
40
+ return {
41
+ key: prop,
42
+ operator: ResourceAPI_Tree_Filter_OperatorType.EQUAL,
43
+ value: {
44
+ oneofKind: "stringValue",
45
+ stringValue: value
46
+ }
47
+ };
48
+ },
49
+ match(prop, pattern) {
50
+ return {
51
+ key: prop,
52
+ operator: ResourceAPI_Tree_Filter_OperatorType.MATCH,
53
+ value: {
54
+ oneofKind: "stringValue",
55
+ stringValue: pattern
56
+ }
57
+ };
58
+ },
59
+ boolEq(prop, value) {
60
+ return {
61
+ key: prop,
62
+ operator: ResourceAPI_Tree_Filter_OperatorType.EQUAL,
63
+ value: {
64
+ oneofKind: "boolValue",
65
+ boolValue: value
66
+ }
67
+ };
68
+ },
69
+ resourceTypeEq(name) {
70
+ return treeFilter.eq(ResourceAPI_Tree_Filter_Property.RESOURCE_TYPE, name);
71
+ },
72
+ resourceTypeMatch(pattern) {
73
+ return treeFilter.match(ResourceAPI_Tree_Filter_Property.RESOURCE_TYPE, pattern);
74
+ },
75
+ fieldNameEq(name) {
76
+ return treeFilter.eq(ResourceAPI_Tree_Filter_Property.FIELD_NAME, name);
77
+ },
78
+ fieldNameMatch(pattern) {
79
+ return treeFilter.match(ResourceAPI_Tree_Filter_Property.FIELD_NAME, pattern);
80
+ },
81
+ isFinal(value) {
82
+ return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.IS_FINAL, value);
83
+ },
84
+ allOutputsFinal(value) {
85
+ return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.ALL_OUTPUTS_FINAL, value);
86
+ },
87
+ resourceReadyForCalculation(value) {
88
+ return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.RESOURCE_READY_FOR_CALCULATION, value);
89
+ },
90
+ isDuplicate(value) {
91
+ return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.IS_DUPLICATE, value);
92
+ },
93
+ hasErrors(value) {
94
+ return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.HAS_ERRORS, value);
95
+ },
96
+ outputsLocked(value) {
97
+ return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.OUTPUTS_LOCKED, value);
98
+ },
99
+ readyOrDuplicateOrError() {
100
+ return treeFilter.or(treeFilter.resourceReadyForCalculation(true), treeFilter.isDuplicate(true), treeFilter.hasErrors(true));
101
+ }
102
+ };
103
+ //#endregion
104
+ export { treeFilter };
105
+
106
+ //# sourceMappingURL=tree_filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree_filter.js","names":[],"sources":["../../src/core/tree_filter.ts"],"sourcesContent":["import type { ResourceAPI_Tree_Filter } from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api\";\nimport {\n ResourceAPI_Tree_Filter_OperatorType,\n ResourceAPI_Tree_Filter_Property,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api\";\n\nexport type { ResourceAPI_Tree_Filter };\n\n/** Shorthand alias for the filter predicate type. */\nexport type Filter = ResourceAPI_Tree_Filter;\n\n/** Shorthand alias for the Property enum. */\nexport type Property = ResourceAPI_Tree_Filter_Property;\n\n// Re-export enum namespaces under shorter aliases so callers need not import api.ts directly.\nexport { ResourceAPI_Tree_Filter_OperatorType as FilterOperatorType };\nexport { ResourceAPI_Tree_Filter_Property as FilterProperty };\n\n/**\n * Builder helpers for {@link ResourceAPI_Tree_Filter} predicates used in\n * `ResourceAPI_Tree_Request.fieldFilter` and `traverseStopRules`.\n *\n * Property restrictions (not enforced here; the backend rejects invalid combinations):\n * - `FIELD_NAME` is only valid inside `fieldFilter`.\n * - `IS_FINAL`, `ALL_OUTPUTS_FINAL`, and resource-level boolean predicates are only valid inside `traverseStopRules`.\n */\nexport const treeFilter = {\n // ── Group operators ──────────────────────────────────────────────────────\n\n and(...children: Filter[]): Filter {\n return {\n operator: ResourceAPI_Tree_Filter_OperatorType.AND,\n value: { oneofKind: \"filtersValue\", filtersValue: { filters: children } },\n };\n },\n\n or(...children: Filter[]): Filter {\n return {\n operator: ResourceAPI_Tree_Filter_OperatorType.OR,\n value: { oneofKind: \"filtersValue\", filtersValue: { filters: children } },\n };\n },\n\n not(child: Filter): Filter {\n return {\n operator: ResourceAPI_Tree_Filter_OperatorType.NOT,\n value: { oneofKind: \"filtersValue\", filtersValue: { filters: [child] } },\n };\n },\n\n // ── Generic leaf operators ───────────────────────────────────────────────\n\n /** Exact-match predicate on a string property. */\n eq(prop: Property, value: string): Filter {\n return {\n key: prop,\n operator: ResourceAPI_Tree_Filter_OperatorType.EQUAL,\n value: { oneofKind: \"stringValue\", stringValue: value },\n };\n },\n\n /** Regex-match predicate on a string property. */\n match(prop: Property, pattern: string): Filter {\n return {\n key: prop,\n operator: ResourceAPI_Tree_Filter_OperatorType.MATCH,\n value: { oneofKind: \"stringValue\", stringValue: pattern },\n };\n },\n\n /** Boolean-equality predicate. */\n boolEq(prop: Property, value: boolean): Filter {\n return {\n key: prop,\n operator: ResourceAPI_Tree_Filter_OperatorType.EQUAL,\n value: { oneofKind: \"boolValue\", boolValue: value },\n };\n },\n\n // ── Typed convenience wrappers ───────────────────────────────────────────\n\n /** Match resources whose type string equals `name` exactly. */\n resourceTypeEq(name: string): Filter {\n return treeFilter.eq(ResourceAPI_Tree_Filter_Property.RESOURCE_TYPE, name);\n },\n\n /** Match resources whose type string satisfies the regex `pattern`. */\n resourceTypeMatch(pattern: string): Filter {\n return treeFilter.match(ResourceAPI_Tree_Filter_Property.RESOURCE_TYPE, pattern);\n },\n\n /**\n * Match field edges whose name equals `name` exactly.\n * Valid only inside `fieldFilter`.\n */\n fieldNameEq(name: string): Filter {\n return treeFilter.eq(ResourceAPI_Tree_Filter_Property.FIELD_NAME, name);\n },\n\n /**\n * Match field edges whose name satisfies the regex `pattern`.\n * Valid only inside `fieldFilter`.\n */\n fieldNameMatch(pattern: string): Filter {\n return treeFilter.match(ResourceAPI_Tree_Filter_Property.FIELD_NAME, pattern);\n },\n\n /**\n * Match resources where `is_final == value`.\n * Valid only inside `traverseStopRules`.\n */\n isFinal(value: boolean): Filter {\n return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.IS_FINAL, value);\n },\n\n /**\n * Match resources where `all_outputs_final == value`.\n * Valid only inside `traverseStopRules`.\n */\n allOutputsFinal(value: boolean): Filter {\n return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.ALL_OUTPUTS_FINAL, value);\n },\n\n /**\n * Match resources where `resource_ready_for_calculation == value`.\n * True when the resource is Original, inputs are locked, and all inputs are final.\n * Valid only inside `traverseStopRules`.\n */\n resourceReadyForCalculation(value: boolean): Filter {\n return treeFilter.boolEq(\n ResourceAPI_Tree_Filter_Property.RESOURCE_READY_FOR_CALCULATION,\n value,\n );\n },\n\n /**\n * Match resources where `is_duplicate == value`.\n * True when the resource has a non-zero original_resource_id.\n * Valid only inside `traverseStopRules`.\n */\n isDuplicate(value: boolean): Filter {\n return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.IS_DUPLICATE, value);\n },\n\n /**\n * Match resources where `has_errors == value`.\n * True when the resource has at least one field carrying an error (aggregated\n * has-error flag). Can be true even when the resource's own status is not\n * Error (e.g., an Original resource with a failed input field).\n * Valid only inside `traverseStopRules`.\n */\n hasErrors(value: boolean): Filter {\n return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.HAS_ERRORS, value);\n },\n\n /**\n * Match resources where `outputs_locked == value`.\n * Valid only inside `traverseStopRules`.\n */\n outputsLocked(value: boolean): Filter {\n return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.OUTPUTS_LOCKED, value);\n },\n\n /**\n * Match resources that are ready-or-duplicate-or-error: mirrors the BFS\n * `readyOrDuplicateOrError` predicate used by pl-tree to decide whether a\n * resource subtree needs further polling.\n *\n * Use this as `traverseStopRules` to stop the server-side tree walk at\n * exactly the same nodes where the client BFS would stop, eliminating\n * unnecessary follow-up calls.\n *\n * Valid only inside `traverseStopRules`.\n */\n readyOrDuplicateOrError(): Filter {\n return treeFilter.or(\n treeFilter.resourceReadyForCalculation(true),\n treeFilter.isDuplicate(true),\n treeFilter.hasErrors(true),\n );\n },\n} as const;\n"],"mappings":";;;;;;;;;;AA0BA,MAAa,aAAa;CAGxB,IAAI,GAAG,UAA4B;AACjC,SAAO;GACL,UAAU,qCAAqC;GAC/C,OAAO;IAAE,WAAW;IAAgB,cAAc,EAAE,SAAS,UAAU;IAAE;GAC1E;;CAGH,GAAG,GAAG,UAA4B;AAChC,SAAO;GACL,UAAU,qCAAqC;GAC/C,OAAO;IAAE,WAAW;IAAgB,cAAc,EAAE,SAAS,UAAU;IAAE;GAC1E;;CAGH,IAAI,OAAuB;AACzB,SAAO;GACL,UAAU,qCAAqC;GAC/C,OAAO;IAAE,WAAW;IAAgB,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE;IAAE;GACzE;;CAMH,GAAG,MAAgB,OAAuB;AACxC,SAAO;GACL,KAAK;GACL,UAAU,qCAAqC;GAC/C,OAAO;IAAE,WAAW;IAAe,aAAa;IAAO;GACxD;;CAIH,MAAM,MAAgB,SAAyB;AAC7C,SAAO;GACL,KAAK;GACL,UAAU,qCAAqC;GAC/C,OAAO;IAAE,WAAW;IAAe,aAAa;IAAS;GAC1D;;CAIH,OAAO,MAAgB,OAAwB;AAC7C,SAAO;GACL,KAAK;GACL,UAAU,qCAAqC;GAC/C,OAAO;IAAE,WAAW;IAAa,WAAW;IAAO;GACpD;;CAMH,eAAe,MAAsB;AACnC,SAAO,WAAW,GAAG,iCAAiC,eAAe,KAAK;;CAI5E,kBAAkB,SAAyB;AACzC,SAAO,WAAW,MAAM,iCAAiC,eAAe,QAAQ;;CAOlF,YAAY,MAAsB;AAChC,SAAO,WAAW,GAAG,iCAAiC,YAAY,KAAK;;CAOzE,eAAe,SAAyB;AACtC,SAAO,WAAW,MAAM,iCAAiC,YAAY,QAAQ;;CAO/E,QAAQ,OAAwB;AAC9B,SAAO,WAAW,OAAO,iCAAiC,UAAU,MAAM;;CAO5E,gBAAgB,OAAwB;AACtC,SAAO,WAAW,OAAO,iCAAiC,mBAAmB,MAAM;;CAQrF,4BAA4B,OAAwB;AAClD,SAAO,WAAW,OAChB,iCAAiC,gCACjC,MACD;;CAQH,YAAY,OAAwB;AAClC,SAAO,WAAW,OAAO,iCAAiC,cAAc,MAAM;;CAUhF,UAAU,OAAwB;AAChC,SAAO,WAAW,OAAO,iCAAiC,YAAY,MAAM;;CAO9E,cAAc,OAAwB;AACpC,SAAO,WAAW,OAAO,iCAAiC,gBAAgB,MAAM;;CAclF,0BAAkC;AAChC,SAAO,WAAW,GAChB,WAAW,4BAA4B,KAAK,EAC5C,WAAW,YAAY,KAAK,EAC5B,WAAW,UAAU,KAAK,CAC3B;;CAEJ"}
@@ -88,5 +88,6 @@ function fieldTypeToProto(type) {
88
88
  exports.fieldTypeToProto = fieldTypeToProto;
89
89
  exports.protoToField = protoToField;
90
90
  exports.protoToResource = protoToResource;
91
+ exports.resourceIsDeleted = resourceIsDeleted;
91
92
 
92
93
  //# sourceMappingURL=type_conversion.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"type_conversion.cjs","names":["createSignedResourceId","toResourceSignature","Resource_Kind","GrpcFieldType","Field_ValueStatus"],"sources":["../../src/core/type_conversion.ts"],"sourcesContent":["import type {\n Field,\n Resource,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport {\n Field_ValueStatus,\n Resource_Kind,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport { FieldType as GrpcFieldType } from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types\";\nimport type {\n FieldData,\n FieldStatus,\n OptionalSignedResourceId,\n FieldType,\n ResourceData,\n ResourceKind,\n} from \"./types\";\nimport {\n createSignedResourceId,\n NullSignedResourceId,\n toResourceSignature,\n NullResourceId,\n} from \"./types\";\nimport { assertNever, notEmpty } from \"@milaboratories/ts-helpers\";\nimport { throwPlNotFoundError } from \"./errors\";\n\nconst ResourceErrorField = \"resourceError\";\n\nfunction resourceIsDeleted(proto: Resource): boolean {\n return proto.deletedTime !== undefined && proto.deletedTime.seconds !== 0n;\n}\n\nfunction protoIdToOptionalResourceId(id: bigint, signature?: Uint8Array): OptionalSignedResourceId {\n if (id === NullResourceId) return NullSignedResourceId;\n return createSignedResourceId(id, toResourceSignature(signature));\n}\n\n/** Throws \"native\" pl not found error, if resource is marked as deleted. */\nexport function protoToResource(proto: Resource): ResourceData {\n if (resourceIsDeleted(proto)) throwPlNotFoundError(\"resource deleted\");\n return {\n id: createSignedResourceId(proto.resourceId, toResourceSignature(proto.resourceSignature)),\n originalResourceId: protoIdToOptionalResourceId(\n proto.originalResourceId,\n proto.originalResourceSignature,\n ),\n type: notEmpty(proto.type),\n data: proto.data,\n inputsLocked: proto.inputsLocked,\n outputsLocked: proto.outputsLocked,\n resourceReady: proto.resourceReady,\n kind: protoToResourceKind(proto.kind),\n error: protoToError(proto),\n final: proto.isFinal,\n fields: proto.fields?.filter((f) => f.id!.fieldName !== ResourceErrorField).map(protoToField),\n };\n}\n\nfunction protoToResourceKind(proto: Resource_Kind): ResourceKind {\n switch (proto) {\n case Resource_Kind.STRUCTURAL:\n return \"Structural\";\n case Resource_Kind.VALUE:\n return \"Value\";\n }\n\n throw new Error(\"invalid ResourceKind: \" + proto);\n}\n\nfunction protoToError(proto: Resource): OptionalSignedResourceId {\n const f = proto.fields.find((f) => f?.id?.fieldName === ResourceErrorField);\n if (!f) return NullSignedResourceId;\n const errId = f.error ?? 0n;\n if (errId === 0n) return NullSignedResourceId;\n return createSignedResourceId(errId, toResourceSignature(f.errorSignature));\n}\n\nexport function protoToField(proto: Field): FieldData {\n return {\n name: notEmpty(proto.id?.fieldName),\n type: protoToFieldType(proto.type),\n status: protoToFieldStatus(proto.valueStatus),\n value: protoIdToOptionalResourceId(proto.value, proto.valueSignature),\n error: protoIdToOptionalResourceId(proto.error, proto.errorSignature),\n valueIsFinal: proto.valueIsFinal,\n };\n}\n\nfunction protoToFieldType(proto: GrpcFieldType): FieldType {\n switch (proto) {\n case GrpcFieldType.INPUT:\n return \"Input\";\n case GrpcFieldType.OUTPUT:\n return \"Output\";\n case GrpcFieldType.SERVICE:\n return \"Service\";\n case GrpcFieldType.ONE_TIME_WRITABLE:\n return \"OTW\";\n case GrpcFieldType.DYNAMIC:\n return \"Dynamic\";\n case GrpcFieldType.MULTIPLE_TIMES_WRITABLE:\n return \"MTW\";\n default:\n throw new Error(\"invalid FieldType: \" + proto);\n }\n}\n\nfunction protoToFieldStatus(proto: Field_ValueStatus): FieldStatus {\n switch (proto) {\n case Field_ValueStatus.EMPTY:\n return \"Empty\";\n case Field_ValueStatus.ASSIGNED:\n return \"Assigned\";\n case Field_ValueStatus.RESOLVED:\n return \"Resolved\";\n default:\n throw new Error(\"invalid FieldStatus: \" + proto);\n }\n}\n\nexport function fieldTypeToProto(type: FieldType): GrpcFieldType {\n switch (type) {\n case \"Input\":\n return GrpcFieldType.INPUT;\n case \"Output\":\n return GrpcFieldType.OUTPUT;\n case \"Dynamic\":\n return GrpcFieldType.DYNAMIC;\n case \"Service\":\n return GrpcFieldType.SERVICE;\n case \"MTW\":\n return GrpcFieldType.MULTIPLE_TIMES_WRITABLE;\n case \"OTW\":\n return GrpcFieldType.ONE_TIME_WRITABLE;\n default:\n return assertNever(type);\n }\n}\n"],"mappings":";;;;;;;AA0BA,MAAM,qBAAqB;AAE3B,SAAS,kBAAkB,OAA0B;AACnD,QAAO,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,YAAY;;AAG1E,SAAS,4BAA4B,IAAY,WAAkD;AACjG,KAAI,OAAA,GAAuB,QAAA;AAC3B,QAAOA,cAAAA,uBAAuB,IAAIC,cAAAA,oBAAoB,UAAU,CAAC;;;AAInE,SAAgB,gBAAgB,OAA+B;AAC7D,KAAI,kBAAkB,MAAM,CAAE,gBAAA,qBAAqB,mBAAmB;AACtE,QAAO;EACL,IAAID,cAAAA,uBAAuB,MAAM,YAAYC,cAAAA,oBAAoB,MAAM,kBAAkB,CAAC;EAC1F,oBAAoB,4BAClB,MAAM,oBACN,MAAM,0BACP;EACD,OAAA,GAAA,2BAAA,UAAe,MAAM,KAAK;EAC1B,MAAM,MAAM;EACZ,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,eAAe,MAAM;EACrB,MAAM,oBAAoB,MAAM,KAAK;EACrC,OAAO,aAAa,MAAM;EAC1B,OAAO,MAAM;EACb,QAAQ,MAAM,QAAQ,QAAQ,MAAM,EAAE,GAAI,cAAc,mBAAmB,CAAC,IAAI,aAAa;EAC9F;;AAGH,SAAS,oBAAoB,OAAoC;AAC/D,SAAQ,OAAR;EACE,KAAKC,kBAAAA,cAAc,WACjB,QAAO;EACT,KAAKA,kBAAAA,cAAc,MACjB,QAAO;;AAGX,OAAM,IAAI,MAAM,2BAA2B,MAAM;;AAGnD,SAAS,aAAa,OAA2C;CAC/D,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,GAAG,IAAI,cAAc,mBAAmB;AAC3E,KAAI,CAAC,EAAG,QAAA;CACR,MAAM,QAAQ,EAAE,SAAS;AACzB,KAAI,UAAU,GAAI,QAAA;AAClB,QAAOF,cAAAA,uBAAuB,OAAOC,cAAAA,oBAAoB,EAAE,eAAe,CAAC;;AAG7E,SAAgB,aAAa,OAAyB;AACpD,QAAO;EACL,OAAA,GAAA,2BAAA,UAAe,MAAM,IAAI,UAAU;EACnC,MAAM,iBAAiB,MAAM,KAAK;EAClC,QAAQ,mBAAmB,MAAM,YAAY;EAC7C,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,cAAc,MAAM;EACrB;;AAGH,SAAS,iBAAiB,OAAiC;AACzD,SAAQ,OAAR;EACE,KAAKE,mBAAAA,UAAc,MACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,OACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,QACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,kBACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,QACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,wBACjB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,wBAAwB,MAAM;;;AAIpD,SAAS,mBAAmB,OAAuC;AACjE,SAAQ,OAAR;EACE,KAAKC,kBAAAA,kBAAkB,MACrB,QAAO;EACT,KAAKA,kBAAAA,kBAAkB,SACrB,QAAO;EACT,KAAKA,kBAAAA,kBAAkB,SACrB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,0BAA0B,MAAM;;;AAItD,SAAgB,iBAAiB,MAAgC;AAC/D,SAAQ,MAAR;EACE,KAAK,QACH,QAAOD,mBAAAA,UAAc;EACvB,KAAK,SACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,UACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,UACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,MACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,MACH,QAAOA,mBAAAA,UAAc;EACvB,QACE,SAAA,GAAA,2BAAA,aAAmB,KAAK"}
1
+ {"version":3,"file":"type_conversion.cjs","names":["createSignedResourceId","toResourceSignature","Resource_Kind","GrpcFieldType","Field_ValueStatus"],"sources":["../../src/core/type_conversion.ts"],"sourcesContent":["import type {\n Field,\n Resource,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport {\n Field_ValueStatus,\n Resource_Kind,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport { FieldType as GrpcFieldType } from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types\";\nimport type {\n FieldData,\n FieldStatus,\n OptionalSignedResourceId,\n FieldType,\n ResourceData,\n ResourceKind,\n} from \"./types\";\nimport {\n createSignedResourceId,\n NullSignedResourceId,\n toResourceSignature,\n NullResourceId,\n} from \"./types\";\nimport { assertNever, notEmpty } from \"@milaboratories/ts-helpers\";\nimport { throwPlNotFoundError } from \"./errors\";\n\nconst ResourceErrorField = \"resourceError\";\n\nexport function resourceIsDeleted(proto: Resource): boolean {\n return proto.deletedTime !== undefined && proto.deletedTime.seconds !== 0n;\n}\n\nfunction protoIdToOptionalResourceId(id: bigint, signature?: Uint8Array): OptionalSignedResourceId {\n if (id === NullResourceId) return NullSignedResourceId;\n return createSignedResourceId(id, toResourceSignature(signature));\n}\n\n/** Throws \"native\" pl not found error, if resource is marked as deleted. */\nexport function protoToResource(proto: Resource): ResourceData {\n if (resourceIsDeleted(proto)) throwPlNotFoundError(\"resource deleted\");\n return {\n id: createSignedResourceId(proto.resourceId, toResourceSignature(proto.resourceSignature)),\n originalResourceId: protoIdToOptionalResourceId(\n proto.originalResourceId,\n proto.originalResourceSignature,\n ),\n type: notEmpty(proto.type),\n data: proto.data,\n inputsLocked: proto.inputsLocked,\n outputsLocked: proto.outputsLocked,\n resourceReady: proto.resourceReady,\n kind: protoToResourceKind(proto.kind),\n error: protoToError(proto),\n final: proto.isFinal,\n fields: proto.fields?.filter((f) => f.id!.fieldName !== ResourceErrorField).map(protoToField),\n };\n}\n\nfunction protoToResourceKind(proto: Resource_Kind): ResourceKind {\n switch (proto) {\n case Resource_Kind.STRUCTURAL:\n return \"Structural\";\n case Resource_Kind.VALUE:\n return \"Value\";\n }\n\n throw new Error(\"invalid ResourceKind: \" + proto);\n}\n\nfunction protoToError(proto: Resource): OptionalSignedResourceId {\n const f = proto.fields.find((f) => f?.id?.fieldName === ResourceErrorField);\n if (!f) return NullSignedResourceId;\n const errId = f.error ?? 0n;\n if (errId === 0n) return NullSignedResourceId;\n return createSignedResourceId(errId, toResourceSignature(f.errorSignature));\n}\n\nexport function protoToField(proto: Field): FieldData {\n return {\n name: notEmpty(proto.id?.fieldName),\n type: protoToFieldType(proto.type),\n status: protoToFieldStatus(proto.valueStatus),\n value: protoIdToOptionalResourceId(proto.value, proto.valueSignature),\n error: protoIdToOptionalResourceId(proto.error, proto.errorSignature),\n valueIsFinal: proto.valueIsFinal,\n };\n}\n\nfunction protoToFieldType(proto: GrpcFieldType): FieldType {\n switch (proto) {\n case GrpcFieldType.INPUT:\n return \"Input\";\n case GrpcFieldType.OUTPUT:\n return \"Output\";\n case GrpcFieldType.SERVICE:\n return \"Service\";\n case GrpcFieldType.ONE_TIME_WRITABLE:\n return \"OTW\";\n case GrpcFieldType.DYNAMIC:\n return \"Dynamic\";\n case GrpcFieldType.MULTIPLE_TIMES_WRITABLE:\n return \"MTW\";\n default:\n throw new Error(\"invalid FieldType: \" + proto);\n }\n}\n\nfunction protoToFieldStatus(proto: Field_ValueStatus): FieldStatus {\n switch (proto) {\n case Field_ValueStatus.EMPTY:\n return \"Empty\";\n case Field_ValueStatus.ASSIGNED:\n return \"Assigned\";\n case Field_ValueStatus.RESOLVED:\n return \"Resolved\";\n default:\n throw new Error(\"invalid FieldStatus: \" + proto);\n }\n}\n\nexport function fieldTypeToProto(type: FieldType): GrpcFieldType {\n switch (type) {\n case \"Input\":\n return GrpcFieldType.INPUT;\n case \"Output\":\n return GrpcFieldType.OUTPUT;\n case \"Dynamic\":\n return GrpcFieldType.DYNAMIC;\n case \"Service\":\n return GrpcFieldType.SERVICE;\n case \"MTW\":\n return GrpcFieldType.MULTIPLE_TIMES_WRITABLE;\n case \"OTW\":\n return GrpcFieldType.ONE_TIME_WRITABLE;\n default:\n return assertNever(type);\n }\n}\n"],"mappings":";;;;;;;AA0BA,MAAM,qBAAqB;AAE3B,SAAgB,kBAAkB,OAA0B;AAC1D,QAAO,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,YAAY;;AAG1E,SAAS,4BAA4B,IAAY,WAAkD;AACjG,KAAI,OAAA,GAAuB,QAAA;AAC3B,QAAOA,cAAAA,uBAAuB,IAAIC,cAAAA,oBAAoB,UAAU,CAAC;;;AAInE,SAAgB,gBAAgB,OAA+B;AAC7D,KAAI,kBAAkB,MAAM,CAAE,gBAAA,qBAAqB,mBAAmB;AACtE,QAAO;EACL,IAAID,cAAAA,uBAAuB,MAAM,YAAYC,cAAAA,oBAAoB,MAAM,kBAAkB,CAAC;EAC1F,oBAAoB,4BAClB,MAAM,oBACN,MAAM,0BACP;EACD,OAAA,GAAA,2BAAA,UAAe,MAAM,KAAK;EAC1B,MAAM,MAAM;EACZ,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,eAAe,MAAM;EACrB,MAAM,oBAAoB,MAAM,KAAK;EACrC,OAAO,aAAa,MAAM;EAC1B,OAAO,MAAM;EACb,QAAQ,MAAM,QAAQ,QAAQ,MAAM,EAAE,GAAI,cAAc,mBAAmB,CAAC,IAAI,aAAa;EAC9F;;AAGH,SAAS,oBAAoB,OAAoC;AAC/D,SAAQ,OAAR;EACE,KAAKC,kBAAAA,cAAc,WACjB,QAAO;EACT,KAAKA,kBAAAA,cAAc,MACjB,QAAO;;AAGX,OAAM,IAAI,MAAM,2BAA2B,MAAM;;AAGnD,SAAS,aAAa,OAA2C;CAC/D,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,GAAG,IAAI,cAAc,mBAAmB;AAC3E,KAAI,CAAC,EAAG,QAAA;CACR,MAAM,QAAQ,EAAE,SAAS;AACzB,KAAI,UAAU,GAAI,QAAA;AAClB,QAAOF,cAAAA,uBAAuB,OAAOC,cAAAA,oBAAoB,EAAE,eAAe,CAAC;;AAG7E,SAAgB,aAAa,OAAyB;AACpD,QAAO;EACL,OAAA,GAAA,2BAAA,UAAe,MAAM,IAAI,UAAU;EACnC,MAAM,iBAAiB,MAAM,KAAK;EAClC,QAAQ,mBAAmB,MAAM,YAAY;EAC7C,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,cAAc,MAAM;EACrB;;AAGH,SAAS,iBAAiB,OAAiC;AACzD,SAAQ,OAAR;EACE,KAAKE,mBAAAA,UAAc,MACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,OACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,QACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,kBACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,QACjB,QAAO;EACT,KAAKA,mBAAAA,UAAc,wBACjB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,wBAAwB,MAAM;;;AAIpD,SAAS,mBAAmB,OAAuC;AACjE,SAAQ,OAAR;EACE,KAAKC,kBAAAA,kBAAkB,MACrB,QAAO;EACT,KAAKA,kBAAAA,kBAAkB,SACrB,QAAO;EACT,KAAKA,kBAAAA,kBAAkB,SACrB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,0BAA0B,MAAM;;;AAItD,SAAgB,iBAAiB,MAAgC;AAC/D,SAAQ,MAAR;EACE,KAAK,QACH,QAAOD,mBAAAA,UAAc;EACvB,KAAK,SACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,UACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,UACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,MACH,QAAOA,mBAAAA,UAAc;EACvB,KAAK,MACH,QAAOA,mBAAAA,UAAc;EACvB,QACE,SAAA,GAAA,2BAAA,aAAmB,KAAK"}
@@ -84,6 +84,6 @@ function fieldTypeToProto(type) {
84
84
  }
85
85
  }
86
86
  //#endregion
87
- export { fieldTypeToProto, protoToField, protoToResource };
87
+ export { fieldTypeToProto, protoToField, protoToResource, resourceIsDeleted };
88
88
 
89
89
  //# sourceMappingURL=type_conversion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"type_conversion.js","names":["GrpcFieldType"],"sources":["../../src/core/type_conversion.ts"],"sourcesContent":["import type {\n Field,\n Resource,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport {\n Field_ValueStatus,\n Resource_Kind,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport { FieldType as GrpcFieldType } from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types\";\nimport type {\n FieldData,\n FieldStatus,\n OptionalSignedResourceId,\n FieldType,\n ResourceData,\n ResourceKind,\n} from \"./types\";\nimport {\n createSignedResourceId,\n NullSignedResourceId,\n toResourceSignature,\n NullResourceId,\n} from \"./types\";\nimport { assertNever, notEmpty } from \"@milaboratories/ts-helpers\";\nimport { throwPlNotFoundError } from \"./errors\";\n\nconst ResourceErrorField = \"resourceError\";\n\nfunction resourceIsDeleted(proto: Resource): boolean {\n return proto.deletedTime !== undefined && proto.deletedTime.seconds !== 0n;\n}\n\nfunction protoIdToOptionalResourceId(id: bigint, signature?: Uint8Array): OptionalSignedResourceId {\n if (id === NullResourceId) return NullSignedResourceId;\n return createSignedResourceId(id, toResourceSignature(signature));\n}\n\n/** Throws \"native\" pl not found error, if resource is marked as deleted. */\nexport function protoToResource(proto: Resource): ResourceData {\n if (resourceIsDeleted(proto)) throwPlNotFoundError(\"resource deleted\");\n return {\n id: createSignedResourceId(proto.resourceId, toResourceSignature(proto.resourceSignature)),\n originalResourceId: protoIdToOptionalResourceId(\n proto.originalResourceId,\n proto.originalResourceSignature,\n ),\n type: notEmpty(proto.type),\n data: proto.data,\n inputsLocked: proto.inputsLocked,\n outputsLocked: proto.outputsLocked,\n resourceReady: proto.resourceReady,\n kind: protoToResourceKind(proto.kind),\n error: protoToError(proto),\n final: proto.isFinal,\n fields: proto.fields?.filter((f) => f.id!.fieldName !== ResourceErrorField).map(protoToField),\n };\n}\n\nfunction protoToResourceKind(proto: Resource_Kind): ResourceKind {\n switch (proto) {\n case Resource_Kind.STRUCTURAL:\n return \"Structural\";\n case Resource_Kind.VALUE:\n return \"Value\";\n }\n\n throw new Error(\"invalid ResourceKind: \" + proto);\n}\n\nfunction protoToError(proto: Resource): OptionalSignedResourceId {\n const f = proto.fields.find((f) => f?.id?.fieldName === ResourceErrorField);\n if (!f) return NullSignedResourceId;\n const errId = f.error ?? 0n;\n if (errId === 0n) return NullSignedResourceId;\n return createSignedResourceId(errId, toResourceSignature(f.errorSignature));\n}\n\nexport function protoToField(proto: Field): FieldData {\n return {\n name: notEmpty(proto.id?.fieldName),\n type: protoToFieldType(proto.type),\n status: protoToFieldStatus(proto.valueStatus),\n value: protoIdToOptionalResourceId(proto.value, proto.valueSignature),\n error: protoIdToOptionalResourceId(proto.error, proto.errorSignature),\n valueIsFinal: proto.valueIsFinal,\n };\n}\n\nfunction protoToFieldType(proto: GrpcFieldType): FieldType {\n switch (proto) {\n case GrpcFieldType.INPUT:\n return \"Input\";\n case GrpcFieldType.OUTPUT:\n return \"Output\";\n case GrpcFieldType.SERVICE:\n return \"Service\";\n case GrpcFieldType.ONE_TIME_WRITABLE:\n return \"OTW\";\n case GrpcFieldType.DYNAMIC:\n return \"Dynamic\";\n case GrpcFieldType.MULTIPLE_TIMES_WRITABLE:\n return \"MTW\";\n default:\n throw new Error(\"invalid FieldType: \" + proto);\n }\n}\n\nfunction protoToFieldStatus(proto: Field_ValueStatus): FieldStatus {\n switch (proto) {\n case Field_ValueStatus.EMPTY:\n return \"Empty\";\n case Field_ValueStatus.ASSIGNED:\n return \"Assigned\";\n case Field_ValueStatus.RESOLVED:\n return \"Resolved\";\n default:\n throw new Error(\"invalid FieldStatus: \" + proto);\n }\n}\n\nexport function fieldTypeToProto(type: FieldType): GrpcFieldType {\n switch (type) {\n case \"Input\":\n return GrpcFieldType.INPUT;\n case \"Output\":\n return GrpcFieldType.OUTPUT;\n case \"Dynamic\":\n return GrpcFieldType.DYNAMIC;\n case \"Service\":\n return GrpcFieldType.SERVICE;\n case \"MTW\":\n return GrpcFieldType.MULTIPLE_TIMES_WRITABLE;\n case \"OTW\":\n return GrpcFieldType.ONE_TIME_WRITABLE;\n default:\n return assertNever(type);\n }\n}\n"],"mappings":";;;;;;AA0BA,MAAM,qBAAqB;AAE3B,SAAS,kBAAkB,OAA0B;AACnD,QAAO,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,YAAY;;AAG1E,SAAS,4BAA4B,IAAY,WAAkD;AACjG,KAAI,OAAA,GAAuB,QAAA;AAC3B,QAAO,uBAAuB,IAAI,oBAAoB,UAAU,CAAC;;;AAInE,SAAgB,gBAAgB,OAA+B;AAC7D,KAAI,kBAAkB,MAAM,CAAE,sBAAqB,mBAAmB;AACtE,QAAO;EACL,IAAI,uBAAuB,MAAM,YAAY,oBAAoB,MAAM,kBAAkB,CAAC;EAC1F,oBAAoB,4BAClB,MAAM,oBACN,MAAM,0BACP;EACD,MAAM,SAAS,MAAM,KAAK;EAC1B,MAAM,MAAM;EACZ,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,eAAe,MAAM;EACrB,MAAM,oBAAoB,MAAM,KAAK;EACrC,OAAO,aAAa,MAAM;EAC1B,OAAO,MAAM;EACb,QAAQ,MAAM,QAAQ,QAAQ,MAAM,EAAE,GAAI,cAAc,mBAAmB,CAAC,IAAI,aAAa;EAC9F;;AAGH,SAAS,oBAAoB,OAAoC;AAC/D,SAAQ,OAAR;EACE,KAAK,cAAc,WACjB,QAAO;EACT,KAAK,cAAc,MACjB,QAAO;;AAGX,OAAM,IAAI,MAAM,2BAA2B,MAAM;;AAGnD,SAAS,aAAa,OAA2C;CAC/D,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,GAAG,IAAI,cAAc,mBAAmB;AAC3E,KAAI,CAAC,EAAG,QAAA;CACR,MAAM,QAAQ,EAAE,SAAS;AACzB,KAAI,UAAU,GAAI,QAAA;AAClB,QAAO,uBAAuB,OAAO,oBAAoB,EAAE,eAAe,CAAC;;AAG7E,SAAgB,aAAa,OAAyB;AACpD,QAAO;EACL,MAAM,SAAS,MAAM,IAAI,UAAU;EACnC,MAAM,iBAAiB,MAAM,KAAK;EAClC,QAAQ,mBAAmB,MAAM,YAAY;EAC7C,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,cAAc,MAAM;EACrB;;AAGH,SAAS,iBAAiB,OAAiC;AACzD,SAAQ,OAAR;EACE,KAAKA,UAAc,MACjB,QAAO;EACT,KAAKA,UAAc,OACjB,QAAO;EACT,KAAKA,UAAc,QACjB,QAAO;EACT,KAAKA,UAAc,kBACjB,QAAO;EACT,KAAKA,UAAc,QACjB,QAAO;EACT,KAAKA,UAAc,wBACjB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,wBAAwB,MAAM;;;AAIpD,SAAS,mBAAmB,OAAuC;AACjE,SAAQ,OAAR;EACE,KAAK,kBAAkB,MACrB,QAAO;EACT,KAAK,kBAAkB,SACrB,QAAO;EACT,KAAK,kBAAkB,SACrB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,0BAA0B,MAAM;;;AAItD,SAAgB,iBAAiB,MAAgC;AAC/D,SAAQ,MAAR;EACE,KAAK,QACH,QAAOA,UAAc;EACvB,KAAK,SACH,QAAOA,UAAc;EACvB,KAAK,UACH,QAAOA,UAAc;EACvB,KAAK,UACH,QAAOA,UAAc;EACvB,KAAK,MACH,QAAOA,UAAc;EACvB,KAAK,MACH,QAAOA,UAAc;EACvB,QACE,QAAO,YAAY,KAAK"}
1
+ {"version":3,"file":"type_conversion.js","names":["GrpcFieldType"],"sources":["../../src/core/type_conversion.ts"],"sourcesContent":["import type {\n Field,\n Resource,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport {\n Field_ValueStatus,\n Resource_Kind,\n} from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types\";\nimport { FieldType as GrpcFieldType } from \"../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types\";\nimport type {\n FieldData,\n FieldStatus,\n OptionalSignedResourceId,\n FieldType,\n ResourceData,\n ResourceKind,\n} from \"./types\";\nimport {\n createSignedResourceId,\n NullSignedResourceId,\n toResourceSignature,\n NullResourceId,\n} from \"./types\";\nimport { assertNever, notEmpty } from \"@milaboratories/ts-helpers\";\nimport { throwPlNotFoundError } from \"./errors\";\n\nconst ResourceErrorField = \"resourceError\";\n\nexport function resourceIsDeleted(proto: Resource): boolean {\n return proto.deletedTime !== undefined && proto.deletedTime.seconds !== 0n;\n}\n\nfunction protoIdToOptionalResourceId(id: bigint, signature?: Uint8Array): OptionalSignedResourceId {\n if (id === NullResourceId) return NullSignedResourceId;\n return createSignedResourceId(id, toResourceSignature(signature));\n}\n\n/** Throws \"native\" pl not found error, if resource is marked as deleted. */\nexport function protoToResource(proto: Resource): ResourceData {\n if (resourceIsDeleted(proto)) throwPlNotFoundError(\"resource deleted\");\n return {\n id: createSignedResourceId(proto.resourceId, toResourceSignature(proto.resourceSignature)),\n originalResourceId: protoIdToOptionalResourceId(\n proto.originalResourceId,\n proto.originalResourceSignature,\n ),\n type: notEmpty(proto.type),\n data: proto.data,\n inputsLocked: proto.inputsLocked,\n outputsLocked: proto.outputsLocked,\n resourceReady: proto.resourceReady,\n kind: protoToResourceKind(proto.kind),\n error: protoToError(proto),\n final: proto.isFinal,\n fields: proto.fields?.filter((f) => f.id!.fieldName !== ResourceErrorField).map(protoToField),\n };\n}\n\nfunction protoToResourceKind(proto: Resource_Kind): ResourceKind {\n switch (proto) {\n case Resource_Kind.STRUCTURAL:\n return \"Structural\";\n case Resource_Kind.VALUE:\n return \"Value\";\n }\n\n throw new Error(\"invalid ResourceKind: \" + proto);\n}\n\nfunction protoToError(proto: Resource): OptionalSignedResourceId {\n const f = proto.fields.find((f) => f?.id?.fieldName === ResourceErrorField);\n if (!f) return NullSignedResourceId;\n const errId = f.error ?? 0n;\n if (errId === 0n) return NullSignedResourceId;\n return createSignedResourceId(errId, toResourceSignature(f.errorSignature));\n}\n\nexport function protoToField(proto: Field): FieldData {\n return {\n name: notEmpty(proto.id?.fieldName),\n type: protoToFieldType(proto.type),\n status: protoToFieldStatus(proto.valueStatus),\n value: protoIdToOptionalResourceId(proto.value, proto.valueSignature),\n error: protoIdToOptionalResourceId(proto.error, proto.errorSignature),\n valueIsFinal: proto.valueIsFinal,\n };\n}\n\nfunction protoToFieldType(proto: GrpcFieldType): FieldType {\n switch (proto) {\n case GrpcFieldType.INPUT:\n return \"Input\";\n case GrpcFieldType.OUTPUT:\n return \"Output\";\n case GrpcFieldType.SERVICE:\n return \"Service\";\n case GrpcFieldType.ONE_TIME_WRITABLE:\n return \"OTW\";\n case GrpcFieldType.DYNAMIC:\n return \"Dynamic\";\n case GrpcFieldType.MULTIPLE_TIMES_WRITABLE:\n return \"MTW\";\n default:\n throw new Error(\"invalid FieldType: \" + proto);\n }\n}\n\nfunction protoToFieldStatus(proto: Field_ValueStatus): FieldStatus {\n switch (proto) {\n case Field_ValueStatus.EMPTY:\n return \"Empty\";\n case Field_ValueStatus.ASSIGNED:\n return \"Assigned\";\n case Field_ValueStatus.RESOLVED:\n return \"Resolved\";\n default:\n throw new Error(\"invalid FieldStatus: \" + proto);\n }\n}\n\nexport function fieldTypeToProto(type: FieldType): GrpcFieldType {\n switch (type) {\n case \"Input\":\n return GrpcFieldType.INPUT;\n case \"Output\":\n return GrpcFieldType.OUTPUT;\n case \"Dynamic\":\n return GrpcFieldType.DYNAMIC;\n case \"Service\":\n return GrpcFieldType.SERVICE;\n case \"MTW\":\n return GrpcFieldType.MULTIPLE_TIMES_WRITABLE;\n case \"OTW\":\n return GrpcFieldType.ONE_TIME_WRITABLE;\n default:\n return assertNever(type);\n }\n}\n"],"mappings":";;;;;;AA0BA,MAAM,qBAAqB;AAE3B,SAAgB,kBAAkB,OAA0B;AAC1D,QAAO,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,YAAY;;AAG1E,SAAS,4BAA4B,IAAY,WAAkD;AACjG,KAAI,OAAA,GAAuB,QAAA;AAC3B,QAAO,uBAAuB,IAAI,oBAAoB,UAAU,CAAC;;;AAInE,SAAgB,gBAAgB,OAA+B;AAC7D,KAAI,kBAAkB,MAAM,CAAE,sBAAqB,mBAAmB;AACtE,QAAO;EACL,IAAI,uBAAuB,MAAM,YAAY,oBAAoB,MAAM,kBAAkB,CAAC;EAC1F,oBAAoB,4BAClB,MAAM,oBACN,MAAM,0BACP;EACD,MAAM,SAAS,MAAM,KAAK;EAC1B,MAAM,MAAM;EACZ,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,eAAe,MAAM;EACrB,MAAM,oBAAoB,MAAM,KAAK;EACrC,OAAO,aAAa,MAAM;EAC1B,OAAO,MAAM;EACb,QAAQ,MAAM,QAAQ,QAAQ,MAAM,EAAE,GAAI,cAAc,mBAAmB,CAAC,IAAI,aAAa;EAC9F;;AAGH,SAAS,oBAAoB,OAAoC;AAC/D,SAAQ,OAAR;EACE,KAAK,cAAc,WACjB,QAAO;EACT,KAAK,cAAc,MACjB,QAAO;;AAGX,OAAM,IAAI,MAAM,2BAA2B,MAAM;;AAGnD,SAAS,aAAa,OAA2C;CAC/D,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,GAAG,IAAI,cAAc,mBAAmB;AAC3E,KAAI,CAAC,EAAG,QAAA;CACR,MAAM,QAAQ,EAAE,SAAS;AACzB,KAAI,UAAU,GAAI,QAAA;AAClB,QAAO,uBAAuB,OAAO,oBAAoB,EAAE,eAAe,CAAC;;AAG7E,SAAgB,aAAa,OAAyB;AACpD,QAAO;EACL,MAAM,SAAS,MAAM,IAAI,UAAU;EACnC,MAAM,iBAAiB,MAAM,KAAK;EAClC,QAAQ,mBAAmB,MAAM,YAAY;EAC7C,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,OAAO,4BAA4B,MAAM,OAAO,MAAM,eAAe;EACrE,cAAc,MAAM;EACrB;;AAGH,SAAS,iBAAiB,OAAiC;AACzD,SAAQ,OAAR;EACE,KAAKA,UAAc,MACjB,QAAO;EACT,KAAKA,UAAc,OACjB,QAAO;EACT,KAAKA,UAAc,QACjB,QAAO;EACT,KAAKA,UAAc,kBACjB,QAAO;EACT,KAAKA,UAAc,QACjB,QAAO;EACT,KAAKA,UAAc,wBACjB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,wBAAwB,MAAM;;;AAIpD,SAAS,mBAAmB,OAAuC;AACjE,SAAQ,OAAR;EACE,KAAK,kBAAkB,MACrB,QAAO;EACT,KAAK,kBAAkB,SACrB,QAAO;EACT,KAAK,kBAAkB,SACrB,QAAO;EACT,QACE,OAAM,IAAI,MAAM,0BAA0B,MAAM;;;AAItD,SAAgB,iBAAiB,MAAgC;AAC/D,SAAQ,MAAR;EACE,KAAK,QACH,QAAOA,UAAc;EACvB,KAAK,SACH,QAAOA,UAAc;EACvB,KAAK,UACH,QAAOA,UAAc;EACvB,KAAK,UACH,QAAOA,UAAc;EACvB,KAAK,MACH,QAAOA,UAAc;EACvB,KAAK,MACH,QAAOA,UAAc;EACvB,QACE,QAAO,YAAY,KAAK"}
@@ -118,6 +118,15 @@ function ensureSignedResourceIdNotNull(resourceId) {
118
118
  function isSignedResourceId(resourceId) {
119
119
  return typeof resourceId === "string" && resourceId.includes("|");
120
120
  }
121
+ /** Validate a string as a SignedResourceId and return it with the branded type.
122
+ * Requires the format "<globalId>|<signatureHex>" with a non-empty signature. */
123
+ function asSignedResourceId(str) {
124
+ const pipeIdx = str.indexOf("|");
125
+ if (pipeIdx < 0) throw new Error(`Not a signed resource id (no '|' separator): ${str}`);
126
+ if (pipeIdx === 0) throw new Error(`Signed resource id has empty globalId: ${str}`);
127
+ if (pipeIdx === str.length - 1) throw new Error(`Signed resource id has empty signature: ${str}`);
128
+ return str;
129
+ }
121
130
  /** Encode resource signature to base64url for embedding in URL-based handles. */
122
131
  function signatureToBase64Url(sig) {
123
132
  return sig && sig.length > 0 ? Buffer.from(sig).toString("base64url") : "";
@@ -157,6 +166,7 @@ exports.MaxTxId = MaxTxId;
157
166
  exports.NullResourceId = NullResourceId;
158
167
  exports.NullSignedResourceId = NullSignedResourceId;
159
168
  exports.anyResourceIdToBigint = anyResourceIdToBigint;
169
+ exports.asSignedResourceId = asSignedResourceId;
160
170
  exports.base64UrlToSignature = base64UrlToSignature;
161
171
  exports.checkLocalityOfResourceId = checkLocalityOfResourceId;
162
172
  exports.createGlobalResourceId = createGlobalResourceId;
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","names":[],"sources":["../../src/core/types.ts"],"sourcesContent":["import type { Branded } from \"@milaboratories/pl-model-common\";\nimport { cachedDeserialize, notEmpty } from \"@milaboratories/ts-helpers\";\n\n/** Null resource id */\nexport type NullResourceId = Branded<bigint, \"null\", \"__resource_id__\">;\n\n/** Global resource id */\nexport type GlobalResourceId = Branded<bigint, \"global\", \"__resource_id__\">;\n\n/** Local resource id */\nexport type LocalResourceId = Branded<bigint, \"local\", \"__resource_id__\">;\n\n/** Any non-null resource id */\nexport type AnyResourceId = GlobalResourceId | LocalResourceId;\n\n/** All possible resource flavours */\nexport type OptionalAnyResourceId = NullResourceId | GlobalResourceId | LocalResourceId;\n\nexport const NullResourceId = 0n as NullResourceId;\n\nfunction isNullResourceId(resourceId: bigint | string): resourceId is NullResourceId {\n return resourceId === NullResourceId;\n}\n\nexport function isAnyResourceId(resourceId: bigint): resourceId is AnyResourceId {\n return resourceId !== 0n;\n}\n\n// see local / global resource logic below...\n\nexport type ResourceKind = \"Structural\" | \"Value\";\n\nexport type FieldType = \"Input\" | \"Output\" | \"Service\" | \"OTW\" | \"Dynamic\" | \"MTW\";\n\nexport type FutureFieldType = \"Output\" | \"Input\" | \"Service\";\n\nexport type FieldStatus = \"Empty\" | \"Assigned\" | \"Resolved\";\n\nexport interface ResourceType {\n readonly name: string;\n readonly version: string;\n}\n\nexport function resourceType(name: string, version: string): ResourceType {\n return { name, version };\n}\n\nexport function resourceTypeToString(rt: ResourceType): string {\n return `${rt.name}:${rt.version}`;\n}\n\nexport function parseResourceType(str: string): ResourceType {\n const [name, version] = str.split(\":\");\n return { name, version };\n}\n\nexport function resourceTypesEqual(type1: ResourceType, type2: ResourceType): boolean {\n return type1.name === type2.name && type1.version === type2.version;\n}\n\n/** Color proof used for resource creation requests (alias for ResourceSignature). */\nexport type ColorProof = ResourceSignature;\n\n/** Readonly fields here marks properties of resource that can't change according to pl's state machine. */\nexport type BasicResourceData = {\n readonly id: SignedResourceId;\n readonly originalResourceId: OptionalSignedResourceId;\n\n readonly kind: ResourceKind;\n readonly type: ResourceType;\n\n readonly data?: Uint8Array;\n\n readonly error: OptionalSignedResourceId;\n\n readonly inputsLocked: boolean;\n readonly outputsLocked: boolean;\n readonly resourceReady: boolean;\n\n /** This value is derived from resource state by the server and can be used as\n * a robust criteria to determine resource is in final state. */\n readonly final: boolean;\n};\n\nexport function extractBasicResourceData(rd: ResourceData): BasicResourceData {\n const {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n } = rd;\n return {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n };\n}\n\nexport const jsonToData = (data: unknown) => Buffer.from(JSON.stringify(data));\n\nexport const resDataToJson = (res: ResourceData) => cachedDeserialize(notEmpty(res.data));\n\nexport type ResourceData = BasicResourceData & {\n readonly fields: FieldData[];\n};\n\nexport function getField(r: ResourceData, name: string): FieldData {\n return notEmpty(r.fields.find((f) => f.name === name));\n}\n\nexport type FieldData = {\n readonly name: string;\n readonly type: FieldType;\n readonly status: FieldStatus;\n readonly value: OptionalSignedResourceId;\n readonly error: OptionalSignedResourceId;\n\n /** True if value the fields points to is in final state. */\n readonly valueIsFinal: boolean;\n};\n\n//\n// Local / Global ResourceId arithmetics\n//\n\n// Note: txId and other numerical values are made numbers but not bigint intentionally,\n// after implementing security model based on signed resource ids this will make\n// much more sense\n\nconst ResourceIdRootMask = 1n << 63n;\nconst ResourceIdLocalMask = 1n << 62n;\nconst NoFlagsIdMask = 0x3fffffffffffffffn;\nconst LocalResourceIdTxIdOffset = 24n;\nexport const MaxLocalId = 0xffffff;\nexport const MaxTxId = 0xffffffff;\n/** Mask valid after applying shift */\nconst TxIdMask = BigInt(MaxTxId);\nconst LocalIdMask = BigInt(MaxLocalId);\n\n// /** Basically removes embedded tx id */\n// const LocalIdCleanMask = 0xFF00000000FFFFFFn;\n\nexport function isRootResourceId(id: bigint) {\n return (id & ResourceIdRootMask) !== 0n;\n}\n\nexport function isLocalResourceId(id: bigint | string): id is LocalResourceId {\n if (typeof id === \"string\") {\n return false;\n }\n\n return (id & ResourceIdLocalMask) !== 0n;\n}\n\nexport function createLocalResourceId(\n isRoot: boolean,\n localCounterValue: number,\n localTxId: number,\n): LocalResourceId {\n if (\n localCounterValue > MaxLocalId ||\n localTxId > MaxTxId ||\n localCounterValue < 0 ||\n localTxId <= 0\n )\n throw Error(\"wrong local id or tx id\");\n return ((isRoot ? ResourceIdRootMask : 0n) |\n ResourceIdLocalMask |\n BigInt(localCounterValue) |\n (BigInt(localTxId) << LocalResourceIdTxIdOffset)) as LocalResourceId;\n}\n\nexport function createGlobalResourceId(isRoot: boolean, unmaskedId: bigint): GlobalResourceId {\n return ((isRoot ? ResourceIdRootMask : 0n) | unmaskedId) as GlobalResourceId;\n}\n\nexport function extractTxId(localResourceId: LocalResourceId): number {\n return Number((localResourceId >> LocalResourceIdTxIdOffset) & TxIdMask);\n}\n\nexport function checkLocalityOfResourceId(resourceId: AnyResourceId, expectedTxId: number): void {\n if (!isLocalResourceId(resourceId)) return;\n if (extractTxId(resourceId) !== expectedTxId)\n throw Error(\n \"local id from another transaction, globalize id before leaking it from the transaction\",\n );\n}\n\nexport function resourceIdToString(\n resourceId: OptionalAnyResourceId | OptionalSignedResourceId,\n): string {\n if (isSignedResourceId(resourceId)) {\n // Strip signature\n resourceId = anyResourceIdToBigint(resourceId) as GlobalResourceId;\n }\n\n if (isNullSignedResourceId(resourceId)) return \"XX:0x0\";\n if (isNullResourceId(resourceId)) return \"XX:0x0\";\n\n if (isLocalResourceId(resourceId))\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"L:0x\" +\n (LocalIdMask & resourceId).toString(16) +\n \"[0x\" +\n extractTxId(resourceId).toString(16) +\n \"]\"\n );\n else\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"G:0x\" +\n (NoFlagsIdMask & resourceId).toString(16)\n );\n}\n\nconst resourceIdRegexp =\n /^(?:(?<xx>XX)|(?<rn>[XRN])(?<lg>[XLG])):0x(?<rid>[0-9a-fA-F]+)(?:\\[0x(?<txid>[0-9a-fA-F]+)])?$/;\n\nexport function resourceIdFromString(str: string): OptionalAnyResourceId | undefined {\n const match = str.match(resourceIdRegexp);\n if (match === null) return undefined;\n const { xx, rn, lg, rid, txid } = match.groups!;\n if (xx) return NullResourceId;\n if (lg === \"L\")\n return createLocalResourceId(rn === \"R\", Number.parseInt(rid, 16), Number.parseInt(txid, 16));\n else return createGlobalResourceId(rn === \"R\", BigInt(\"0x\" + rid));\n}\n\nexport function anyResourceIdToBigint(resourceId: bigint | SignedResourceId): bigint {\n if (typeof resourceId !== \"string\") {\n return resourceId;\n }\n\n const parsed = parseSignedResourceId(resourceId);\n return parsed.globalId as bigint;\n}\n\nexport function stringifyWithResourceId(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === \"bigint\") return resourceIdToString(value as OptionalAnyResourceId);\n if (isSignedResourceId(value)) return resourceIdToString(value);\n return value;\n });\n}\n\n/** Opaque authorization signature attached to a resource. */\nexport type ResourceSignature = Branded<Uint8Array, \"ResourceSignature\">;\n\n/**\n * Signed resource id is \"<global ID>|<resource signature hex>\", encoded as string\n * (e.g. \"NG:0x123EC|1234567890abcdef\")\n */\nexport type SignedResourceId = Branded<string, \"signed\", \"__signed_resource_id__\">;\n\nexport type NullSignedResourceId = Branded<string, \"null\", \"__signed_resource_id__\">;\n\nexport const NullSignedResourceId = \"\" as NullSignedResourceId;\n\n/** Nullable signed resource ID */\nexport type OptionalSignedResourceId = NullSignedResourceId | SignedResourceId;\n\nexport function isNullSignedResourceId(\n resourceId: bigint | string,\n): resourceId is NullSignedResourceId {\n return resourceId === NullSignedResourceId;\n}\n\nexport function isNotNullSignedResourceId(\n resourceId: OptionalSignedResourceId,\n): resourceId is SignedResourceId {\n // lint-allow-cast\n return resourceId !== NullSignedResourceId;\n}\n\nexport function ensureSignedResourceIdNotNull(\n resourceId: OptionalSignedResourceId,\n): SignedResourceId {\n if (!isNotNullSignedResourceId(resourceId)) throw new Error(\"null resource id\");\n return resourceId;\n}\n\nexport function isSignedResourceId(resourceId: bigint | string): resourceId is SignedResourceId {\n // lint-allow-cast\n return typeof resourceId === \"string\" && resourceId.includes(\"|\");\n}\n\n/** Encode resource signature to base64url for embedding in URL-based handles. */\nexport function signatureToBase64Url(sig?: ResourceSignature): string {\n return sig && sig.length > 0 ? Buffer.from(sig).toString(\"base64url\") : \"\";\n}\n\n/** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */\nexport function toResourceSignature(raw?: Uint8Array): ResourceSignature {\n return raw && raw.length > 0\n ? (raw as ResourceSignature)\n : (new Uint8Array(0) as ResourceSignature);\n}\n\n/** Decode base64url-encoded string back to a branded ResourceSignature. */\nexport function base64UrlToSignature(str: string): ResourceSignature {\n return toResourceSignature(Buffer.from(str, \"base64url\"))!;\n}\n\n/** Converts bigint global resource id and signature to a SignedResourceId string.\n * Format: \"<globalIdString>|<signatureHex>\" */\nexport function createSignedResourceId(\n globalId: bigint,\n signature?: ResourceSignature,\n): SignedResourceId {\n if (isLocalResourceId(globalId))\n throw new Error(`Local resource id: ${resourceIdToString(globalId)}`);\n if (isNullResourceId(globalId)) throw new Error(`Null resource id.`);\n\n const sigHex = signature ? Buffer.from(signature).toString(\"hex\") : \"\";\n return `${String(globalId)}|${sigHex}` as SignedResourceId; // lint-allow-cast\n}\n\nexport function parseSignedResourceId(resourceId: SignedResourceId): {\n globalId: GlobalResourceId;\n signature: ResourceSignature;\n} {\n if (typeof resourceId !== \"string\") {\n throw new Error(`Not a signed resource id: ${resourceId}`);\n }\n\n const pipeIdx = resourceId.indexOf(\"|\");\n if (pipeIdx < 0) throw new Error(`Malformed signed resource id (no '|'): ${resourceId}`);\n\n const globalIdStr = resourceId.substring(0, pipeIdx);\n const signatureHex = resourceId.substring(pipeIdx + 1);\n\n const globalId = BigInt(globalIdStr);\n if (isNullSignedResourceId(globalId) || isLocalResourceId(globalId))\n throw new Error(`Invalid global id portion in signed resource id: ${globalIdStr}`);\n\n const signature: ResourceSignature = (\n signatureHex.length > 0 ? Buffer.from(signatureHex, \"hex\") : new Uint8Array(0)\n ) as ResourceSignature;\n\n return { globalId: globalId as GlobalResourceId, signature };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"types.cjs","names":[],"sources":["../../src/core/types.ts"],"sourcesContent":["/* eslint-disable eslint-js/no-restricted-syntax -- this file is the canonical place to construct SignedResourceId values; outside callers must use asSignedResourceId(). */\n\nimport type { Branded } from \"@milaboratories/pl-model-common\";\nimport { cachedDeserialize, notEmpty } from \"@milaboratories/ts-helpers\";\n\n/** Null resource id */\nexport type NullResourceId = Branded<bigint, \"null\", \"__resource_id__\">;\n\n/** Global resource id */\nexport type GlobalResourceId = Branded<bigint, \"global\", \"__resource_id__\">;\n\n/** Local resource id */\nexport type LocalResourceId = Branded<bigint, \"local\", \"__resource_id__\">;\n\n/** Any non-null resource id */\nexport type AnyResourceId = GlobalResourceId | LocalResourceId;\n\n/** All possible resource flavours */\nexport type OptionalAnyResourceId = NullResourceId | GlobalResourceId | LocalResourceId;\n\nexport const NullResourceId = 0n as NullResourceId;\n\nfunction isNullResourceId(resourceId: bigint | string): resourceId is NullResourceId {\n return resourceId === NullResourceId;\n}\n\nexport function isAnyResourceId(resourceId: bigint): resourceId is AnyResourceId {\n return resourceId !== 0n;\n}\n\n// see local / global resource logic below...\n\nexport type ResourceKind = \"Structural\" | \"Value\";\n\nexport type FieldType = \"Input\" | \"Output\" | \"Service\" | \"OTW\" | \"Dynamic\" | \"MTW\";\n\nexport type FutureFieldType = \"Output\" | \"Input\" | \"Service\";\n\nexport type FieldStatus = \"Empty\" | \"Assigned\" | \"Resolved\";\n\nexport interface ResourceType {\n readonly name: string;\n readonly version: string;\n}\n\nexport function resourceType(name: string, version: string): ResourceType {\n return { name, version };\n}\n\nexport function resourceTypeToString(rt: ResourceType): string {\n return `${rt.name}:${rt.version}`;\n}\n\nexport function parseResourceType(str: string): ResourceType {\n const [name, version] = str.split(\":\");\n return { name, version };\n}\n\nexport function resourceTypesEqual(type1: ResourceType, type2: ResourceType): boolean {\n return type1.name === type2.name && type1.version === type2.version;\n}\n\n/** Color proof used for resource creation requests (alias for ResourceSignature). */\nexport type ColorProof = ResourceSignature;\n\n/** Readonly fields here marks properties of resource that can't change according to pl's state machine. */\nexport type BasicResourceData = {\n readonly id: SignedResourceId;\n readonly originalResourceId: OptionalSignedResourceId;\n\n readonly kind: ResourceKind;\n readonly type: ResourceType;\n\n readonly data?: Uint8Array;\n\n readonly error: OptionalSignedResourceId;\n\n readonly inputsLocked: boolean;\n readonly outputsLocked: boolean;\n readonly resourceReady: boolean;\n\n /** This value is derived from resource state by the server and can be used as\n * a robust criteria to determine resource is in final state. */\n readonly final: boolean;\n};\n\nexport function extractBasicResourceData(rd: ResourceData): BasicResourceData {\n const {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n } = rd;\n return {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n };\n}\n\nexport const jsonToData = (data: unknown) => Buffer.from(JSON.stringify(data));\n\nexport const resDataToJson = (res: ResourceData) => cachedDeserialize(notEmpty(res.data));\n\nexport type ResourceData = BasicResourceData & {\n readonly fields: FieldData[];\n};\n\nexport function getField(r: ResourceData, name: string): FieldData {\n return notEmpty(r.fields.find((f) => f.name === name));\n}\n\nexport type FieldData = {\n readonly name: string;\n readonly type: FieldType;\n readonly status: FieldStatus;\n readonly value: OptionalSignedResourceId;\n readonly error: OptionalSignedResourceId;\n\n /** True if value the fields points to is in final state. */\n readonly valueIsFinal: boolean;\n};\n\n//\n// Local / Global ResourceId arithmetics\n//\n\n// Note: txId and other numerical values are made numbers but not bigint intentionally,\n// after implementing security model based on signed resource ids this will make\n// much more sense\n\nconst ResourceIdRootMask = 1n << 63n;\nconst ResourceIdLocalMask = 1n << 62n;\nconst NoFlagsIdMask = 0x3fffffffffffffffn;\nconst LocalResourceIdTxIdOffset = 24n;\nexport const MaxLocalId = 0xffffff;\nexport const MaxTxId = 0xffffffff;\n/** Mask valid after applying shift */\nconst TxIdMask = BigInt(MaxTxId);\nconst LocalIdMask = BigInt(MaxLocalId);\n\n// /** Basically removes embedded tx id */\n// const LocalIdCleanMask = 0xFF00000000FFFFFFn;\n\nexport function isRootResourceId(id: bigint) {\n return (id & ResourceIdRootMask) !== 0n;\n}\n\nexport function isLocalResourceId(id: bigint | string): id is LocalResourceId {\n if (typeof id === \"string\") {\n return false;\n }\n\n return (id & ResourceIdLocalMask) !== 0n;\n}\n\nexport function createLocalResourceId(\n isRoot: boolean,\n localCounterValue: number,\n localTxId: number,\n): LocalResourceId {\n if (\n localCounterValue > MaxLocalId ||\n localTxId > MaxTxId ||\n localCounterValue < 0 ||\n localTxId <= 0\n )\n throw Error(\"wrong local id or tx id\");\n return ((isRoot ? ResourceIdRootMask : 0n) |\n ResourceIdLocalMask |\n BigInt(localCounterValue) |\n (BigInt(localTxId) << LocalResourceIdTxIdOffset)) as LocalResourceId;\n}\n\nexport function createGlobalResourceId(isRoot: boolean, unmaskedId: bigint): GlobalResourceId {\n return ((isRoot ? ResourceIdRootMask : 0n) | unmaskedId) as GlobalResourceId;\n}\n\nexport function extractTxId(localResourceId: LocalResourceId): number {\n return Number((localResourceId >> LocalResourceIdTxIdOffset) & TxIdMask);\n}\n\nexport function checkLocalityOfResourceId(resourceId: AnyResourceId, expectedTxId: number): void {\n if (!isLocalResourceId(resourceId)) return;\n if (extractTxId(resourceId) !== expectedTxId)\n throw Error(\n \"local id from another transaction, globalize id before leaking it from the transaction\",\n );\n}\n\nexport function resourceIdToString(\n resourceId: OptionalAnyResourceId | OptionalSignedResourceId,\n): string {\n if (isSignedResourceId(resourceId)) {\n // Strip signature\n resourceId = anyResourceIdToBigint(resourceId) as GlobalResourceId;\n }\n\n if (isNullSignedResourceId(resourceId)) return \"XX:0x0\";\n if (isNullResourceId(resourceId)) return \"XX:0x0\";\n\n if (isLocalResourceId(resourceId))\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"L:0x\" +\n (LocalIdMask & resourceId).toString(16) +\n \"[0x\" +\n extractTxId(resourceId).toString(16) +\n \"]\"\n );\n else\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"G:0x\" +\n (NoFlagsIdMask & resourceId).toString(16)\n );\n}\n\nconst resourceIdRegexp =\n /^(?:(?<xx>XX)|(?<rn>[XRN])(?<lg>[XLG])):0x(?<rid>[0-9a-fA-F]+)(?:\\[0x(?<txid>[0-9a-fA-F]+)])?$/;\n\nexport function resourceIdFromString(str: string): OptionalAnyResourceId | undefined {\n const match = str.match(resourceIdRegexp);\n if (match === null) return undefined;\n const { xx, rn, lg, rid, txid } = match.groups!;\n if (xx) return NullResourceId;\n if (lg === \"L\")\n return createLocalResourceId(rn === \"R\", Number.parseInt(rid, 16), Number.parseInt(txid, 16));\n else return createGlobalResourceId(rn === \"R\", BigInt(\"0x\" + rid));\n}\n\nexport function anyResourceIdToBigint(resourceId: bigint | SignedResourceId): bigint {\n if (typeof resourceId !== \"string\") {\n return resourceId;\n }\n\n const parsed = parseSignedResourceId(resourceId);\n return parsed.globalId as bigint;\n}\n\nexport function stringifyWithResourceId(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === \"bigint\") return resourceIdToString(value as OptionalAnyResourceId);\n if (isSignedResourceId(value)) return resourceIdToString(value);\n return value;\n });\n}\n\n/** Opaque authorization signature attached to a resource. */\nexport type ResourceSignature = Branded<Uint8Array, \"ResourceSignature\">;\n\n/**\n * Signed resource id is \"<global ID>|<resource signature hex>\", encoded as string\n * (e.g. \"NG:0x123EC|1234567890abcdef\")\n */\nexport type SignedResourceId = Branded<string, \"signed\", \"__signed_resource_id__\">;\n\nexport type NullSignedResourceId = Branded<string, \"null\", \"__signed_resource_id__\">;\n\nexport const NullSignedResourceId = \"\" as NullSignedResourceId;\n\n/** Nullable signed resource ID */\nexport type OptionalSignedResourceId = NullSignedResourceId | SignedResourceId;\n\nexport function isNullSignedResourceId(\n resourceId: bigint | string,\n): resourceId is NullSignedResourceId {\n return resourceId === NullSignedResourceId;\n}\n\nexport function isNotNullSignedResourceId(\n resourceId: OptionalSignedResourceId,\n): resourceId is SignedResourceId {\n return resourceId !== NullSignedResourceId;\n}\n\nexport function ensureSignedResourceIdNotNull(\n resourceId: OptionalSignedResourceId,\n): SignedResourceId {\n if (!isNotNullSignedResourceId(resourceId)) throw new Error(\"null resource id\");\n return resourceId;\n}\n\nexport function isSignedResourceId(resourceId: bigint | string): resourceId is SignedResourceId {\n return typeof resourceId === \"string\" && resourceId.includes(\"|\");\n}\n\n/** Validate a string as a SignedResourceId and return it with the branded type.\n * Requires the format \"<globalId>|<signatureHex>\" with a non-empty signature. */\nexport function asSignedResourceId(str: string): SignedResourceId {\n const pipeIdx = str.indexOf(\"|\");\n if (pipeIdx < 0) throw new Error(`Not a signed resource id (no '|' separator): ${str}`);\n if (pipeIdx === 0) throw new Error(`Signed resource id has empty globalId: ${str}`);\n if (pipeIdx === str.length - 1) throw new Error(`Signed resource id has empty signature: ${str}`);\n return str as SignedResourceId;\n}\n\n/** Encode resource signature to base64url for embedding in URL-based handles. */\nexport function signatureToBase64Url(sig?: ResourceSignature): string {\n return sig && sig.length > 0 ? Buffer.from(sig).toString(\"base64url\") : \"\";\n}\n\n/** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */\nexport function toResourceSignature(raw?: Uint8Array): ResourceSignature {\n return raw && raw.length > 0\n ? (raw as ResourceSignature)\n : (new Uint8Array(0) as ResourceSignature);\n}\n\n/** Decode base64url-encoded string back to a branded ResourceSignature. */\nexport function base64UrlToSignature(str: string): ResourceSignature {\n return toResourceSignature(Buffer.from(str, \"base64url\"))!;\n}\n\n/** Converts bigint global resource id and signature to a SignedResourceId string.\n * Format: \"<globalIdString>|<signatureHex>\" */\nexport function createSignedResourceId(\n globalId: bigint,\n signature?: ResourceSignature,\n): SignedResourceId {\n if (isLocalResourceId(globalId))\n throw new Error(`Local resource id: ${resourceIdToString(globalId)}`);\n if (isNullResourceId(globalId)) throw new Error(`Null resource id.`);\n\n const sigHex = signature ? Buffer.from(signature).toString(\"hex\") : \"\";\n return `${String(globalId)}|${sigHex}` as SignedResourceId;\n}\n\nexport function parseSignedResourceId(resourceId: SignedResourceId): {\n globalId: GlobalResourceId;\n signature: ResourceSignature;\n} {\n if (typeof resourceId !== \"string\") {\n throw new Error(`Not a signed resource id: ${resourceId}`);\n }\n\n const pipeIdx = resourceId.indexOf(\"|\");\n if (pipeIdx < 0) throw new Error(`Malformed signed resource id (no '|'): ${resourceId}`);\n\n const globalIdStr = resourceId.substring(0, pipeIdx);\n const signatureHex = resourceId.substring(pipeIdx + 1);\n\n const globalId = BigInt(globalIdStr);\n if (isNullSignedResourceId(globalId) || isLocalResourceId(globalId))\n throw new Error(`Invalid global id portion in signed resource id: ${globalIdStr}`);\n\n const signature: ResourceSignature = (\n signatureHex.length > 0 ? Buffer.from(signatureHex, \"hex\") : new Uint8Array(0)\n ) as ResourceSignature;\n\n return { globalId: globalId as GlobalResourceId, signature };\n}\n"],"mappings":"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"}
@@ -84,6 +84,9 @@ declare function isNullSignedResourceId(resourceId: bigint | string): resourceId
84
84
  declare function isNotNullSignedResourceId(resourceId: OptionalSignedResourceId): resourceId is SignedResourceId;
85
85
  declare function ensureSignedResourceIdNotNull(resourceId: OptionalSignedResourceId): SignedResourceId;
86
86
  declare function isSignedResourceId(resourceId: bigint | string): resourceId is SignedResourceId;
87
+ /** Validate a string as a SignedResourceId and return it with the branded type.
88
+ * Requires the format "<globalId>|<signatureHex>" with a non-empty signature. */
89
+ declare function asSignedResourceId(str: string): SignedResourceId;
87
90
  /** Encode resource signature to base64url for embedding in URL-based handles. */
88
91
  declare function signatureToBase64Url(sig?: ResourceSignature): string;
89
92
  /** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */
@@ -98,5 +101,5 @@ declare function parseSignedResourceId(resourceId: SignedResourceId): {
98
101
  signature: ResourceSignature;
99
102
  };
100
103
  //#endregion
101
- export { AnyResourceId, BasicResourceData, ColorProof, FieldData, FieldStatus, FieldType, FutureFieldType, GlobalResourceId, LocalResourceId, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, OptionalAnyResourceId, OptionalSignedResourceId, ResourceData, ResourceKind, ResourceSignature, ResourceType, SignedResourceId, anyResourceIdToBigint, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature };
104
+ export { AnyResourceId, BasicResourceData, ColorProof, FieldData, FieldStatus, FieldType, FutureFieldType, GlobalResourceId, LocalResourceId, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, OptionalAnyResourceId, OptionalSignedResourceId, ResourceData, ResourceKind, ResourceSignature, ResourceType, SignedResourceId, anyResourceIdToBigint, asSignedResourceId, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature };
102
105
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/core/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/core/types.ts"],"mappings":"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"}
@@ -117,6 +117,15 @@ function ensureSignedResourceIdNotNull(resourceId) {
117
117
  function isSignedResourceId(resourceId) {
118
118
  return typeof resourceId === "string" && resourceId.includes("|");
119
119
  }
120
+ /** Validate a string as a SignedResourceId and return it with the branded type.
121
+ * Requires the format "<globalId>|<signatureHex>" with a non-empty signature. */
122
+ function asSignedResourceId(str) {
123
+ const pipeIdx = str.indexOf("|");
124
+ if (pipeIdx < 0) throw new Error(`Not a signed resource id (no '|' separator): ${str}`);
125
+ if (pipeIdx === 0) throw new Error(`Signed resource id has empty globalId: ${str}`);
126
+ if (pipeIdx === str.length - 1) throw new Error(`Signed resource id has empty signature: ${str}`);
127
+ return str;
128
+ }
120
129
  /** Encode resource signature to base64url for embedding in URL-based handles. */
121
130
  function signatureToBase64Url(sig) {
122
131
  return sig && sig.length > 0 ? Buffer.from(sig).toString("base64url") : "";
@@ -151,6 +160,6 @@ function parseSignedResourceId(resourceId) {
151
160
  };
152
161
  }
153
162
  //#endregion
154
- export { MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, anyResourceIdToBigint, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature };
163
+ export { MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, anyResourceIdToBigint, asSignedResourceId, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature };
155
164
 
156
165
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/core/types.ts"],"sourcesContent":["import type { Branded } from \"@milaboratories/pl-model-common\";\nimport { cachedDeserialize, notEmpty } from \"@milaboratories/ts-helpers\";\n\n/** Null resource id */\nexport type NullResourceId = Branded<bigint, \"null\", \"__resource_id__\">;\n\n/** Global resource id */\nexport type GlobalResourceId = Branded<bigint, \"global\", \"__resource_id__\">;\n\n/** Local resource id */\nexport type LocalResourceId = Branded<bigint, \"local\", \"__resource_id__\">;\n\n/** Any non-null resource id */\nexport type AnyResourceId = GlobalResourceId | LocalResourceId;\n\n/** All possible resource flavours */\nexport type OptionalAnyResourceId = NullResourceId | GlobalResourceId | LocalResourceId;\n\nexport const NullResourceId = 0n as NullResourceId;\n\nfunction isNullResourceId(resourceId: bigint | string): resourceId is NullResourceId {\n return resourceId === NullResourceId;\n}\n\nexport function isAnyResourceId(resourceId: bigint): resourceId is AnyResourceId {\n return resourceId !== 0n;\n}\n\n// see local / global resource logic below...\n\nexport type ResourceKind = \"Structural\" | \"Value\";\n\nexport type FieldType = \"Input\" | \"Output\" | \"Service\" | \"OTW\" | \"Dynamic\" | \"MTW\";\n\nexport type FutureFieldType = \"Output\" | \"Input\" | \"Service\";\n\nexport type FieldStatus = \"Empty\" | \"Assigned\" | \"Resolved\";\n\nexport interface ResourceType {\n readonly name: string;\n readonly version: string;\n}\n\nexport function resourceType(name: string, version: string): ResourceType {\n return { name, version };\n}\n\nexport function resourceTypeToString(rt: ResourceType): string {\n return `${rt.name}:${rt.version}`;\n}\n\nexport function parseResourceType(str: string): ResourceType {\n const [name, version] = str.split(\":\");\n return { name, version };\n}\n\nexport function resourceTypesEqual(type1: ResourceType, type2: ResourceType): boolean {\n return type1.name === type2.name && type1.version === type2.version;\n}\n\n/** Color proof used for resource creation requests (alias for ResourceSignature). */\nexport type ColorProof = ResourceSignature;\n\n/** Readonly fields here marks properties of resource that can't change according to pl's state machine. */\nexport type BasicResourceData = {\n readonly id: SignedResourceId;\n readonly originalResourceId: OptionalSignedResourceId;\n\n readonly kind: ResourceKind;\n readonly type: ResourceType;\n\n readonly data?: Uint8Array;\n\n readonly error: OptionalSignedResourceId;\n\n readonly inputsLocked: boolean;\n readonly outputsLocked: boolean;\n readonly resourceReady: boolean;\n\n /** This value is derived from resource state by the server and can be used as\n * a robust criteria to determine resource is in final state. */\n readonly final: boolean;\n};\n\nexport function extractBasicResourceData(rd: ResourceData): BasicResourceData {\n const {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n } = rd;\n return {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n };\n}\n\nexport const jsonToData = (data: unknown) => Buffer.from(JSON.stringify(data));\n\nexport const resDataToJson = (res: ResourceData) => cachedDeserialize(notEmpty(res.data));\n\nexport type ResourceData = BasicResourceData & {\n readonly fields: FieldData[];\n};\n\nexport function getField(r: ResourceData, name: string): FieldData {\n return notEmpty(r.fields.find((f) => f.name === name));\n}\n\nexport type FieldData = {\n readonly name: string;\n readonly type: FieldType;\n readonly status: FieldStatus;\n readonly value: OptionalSignedResourceId;\n readonly error: OptionalSignedResourceId;\n\n /** True if value the fields points to is in final state. */\n readonly valueIsFinal: boolean;\n};\n\n//\n// Local / Global ResourceId arithmetics\n//\n\n// Note: txId and other numerical values are made numbers but not bigint intentionally,\n// after implementing security model based on signed resource ids this will make\n// much more sense\n\nconst ResourceIdRootMask = 1n << 63n;\nconst ResourceIdLocalMask = 1n << 62n;\nconst NoFlagsIdMask = 0x3fffffffffffffffn;\nconst LocalResourceIdTxIdOffset = 24n;\nexport const MaxLocalId = 0xffffff;\nexport const MaxTxId = 0xffffffff;\n/** Mask valid after applying shift */\nconst TxIdMask = BigInt(MaxTxId);\nconst LocalIdMask = BigInt(MaxLocalId);\n\n// /** Basically removes embedded tx id */\n// const LocalIdCleanMask = 0xFF00000000FFFFFFn;\n\nexport function isRootResourceId(id: bigint) {\n return (id & ResourceIdRootMask) !== 0n;\n}\n\nexport function isLocalResourceId(id: bigint | string): id is LocalResourceId {\n if (typeof id === \"string\") {\n return false;\n }\n\n return (id & ResourceIdLocalMask) !== 0n;\n}\n\nexport function createLocalResourceId(\n isRoot: boolean,\n localCounterValue: number,\n localTxId: number,\n): LocalResourceId {\n if (\n localCounterValue > MaxLocalId ||\n localTxId > MaxTxId ||\n localCounterValue < 0 ||\n localTxId <= 0\n )\n throw Error(\"wrong local id or tx id\");\n return ((isRoot ? ResourceIdRootMask : 0n) |\n ResourceIdLocalMask |\n BigInt(localCounterValue) |\n (BigInt(localTxId) << LocalResourceIdTxIdOffset)) as LocalResourceId;\n}\n\nexport function createGlobalResourceId(isRoot: boolean, unmaskedId: bigint): GlobalResourceId {\n return ((isRoot ? ResourceIdRootMask : 0n) | unmaskedId) as GlobalResourceId;\n}\n\nexport function extractTxId(localResourceId: LocalResourceId): number {\n return Number((localResourceId >> LocalResourceIdTxIdOffset) & TxIdMask);\n}\n\nexport function checkLocalityOfResourceId(resourceId: AnyResourceId, expectedTxId: number): void {\n if (!isLocalResourceId(resourceId)) return;\n if (extractTxId(resourceId) !== expectedTxId)\n throw Error(\n \"local id from another transaction, globalize id before leaking it from the transaction\",\n );\n}\n\nexport function resourceIdToString(\n resourceId: OptionalAnyResourceId | OptionalSignedResourceId,\n): string {\n if (isSignedResourceId(resourceId)) {\n // Strip signature\n resourceId = anyResourceIdToBigint(resourceId) as GlobalResourceId;\n }\n\n if (isNullSignedResourceId(resourceId)) return \"XX:0x0\";\n if (isNullResourceId(resourceId)) return \"XX:0x0\";\n\n if (isLocalResourceId(resourceId))\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"L:0x\" +\n (LocalIdMask & resourceId).toString(16) +\n \"[0x\" +\n extractTxId(resourceId).toString(16) +\n \"]\"\n );\n else\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"G:0x\" +\n (NoFlagsIdMask & resourceId).toString(16)\n );\n}\n\nconst resourceIdRegexp =\n /^(?:(?<xx>XX)|(?<rn>[XRN])(?<lg>[XLG])):0x(?<rid>[0-9a-fA-F]+)(?:\\[0x(?<txid>[0-9a-fA-F]+)])?$/;\n\nexport function resourceIdFromString(str: string): OptionalAnyResourceId | undefined {\n const match = str.match(resourceIdRegexp);\n if (match === null) return undefined;\n const { xx, rn, lg, rid, txid } = match.groups!;\n if (xx) return NullResourceId;\n if (lg === \"L\")\n return createLocalResourceId(rn === \"R\", Number.parseInt(rid, 16), Number.parseInt(txid, 16));\n else return createGlobalResourceId(rn === \"R\", BigInt(\"0x\" + rid));\n}\n\nexport function anyResourceIdToBigint(resourceId: bigint | SignedResourceId): bigint {\n if (typeof resourceId !== \"string\") {\n return resourceId;\n }\n\n const parsed = parseSignedResourceId(resourceId);\n return parsed.globalId as bigint;\n}\n\nexport function stringifyWithResourceId(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === \"bigint\") return resourceIdToString(value as OptionalAnyResourceId);\n if (isSignedResourceId(value)) return resourceIdToString(value);\n return value;\n });\n}\n\n/** Opaque authorization signature attached to a resource. */\nexport type ResourceSignature = Branded<Uint8Array, \"ResourceSignature\">;\n\n/**\n * Signed resource id is \"<global ID>|<resource signature hex>\", encoded as string\n * (e.g. \"NG:0x123EC|1234567890abcdef\")\n */\nexport type SignedResourceId = Branded<string, \"signed\", \"__signed_resource_id__\">;\n\nexport type NullSignedResourceId = Branded<string, \"null\", \"__signed_resource_id__\">;\n\nexport const NullSignedResourceId = \"\" as NullSignedResourceId;\n\n/** Nullable signed resource ID */\nexport type OptionalSignedResourceId = NullSignedResourceId | SignedResourceId;\n\nexport function isNullSignedResourceId(\n resourceId: bigint | string,\n): resourceId is NullSignedResourceId {\n return resourceId === NullSignedResourceId;\n}\n\nexport function isNotNullSignedResourceId(\n resourceId: OptionalSignedResourceId,\n): resourceId is SignedResourceId {\n // lint-allow-cast\n return resourceId !== NullSignedResourceId;\n}\n\nexport function ensureSignedResourceIdNotNull(\n resourceId: OptionalSignedResourceId,\n): SignedResourceId {\n if (!isNotNullSignedResourceId(resourceId)) throw new Error(\"null resource id\");\n return resourceId;\n}\n\nexport function isSignedResourceId(resourceId: bigint | string): resourceId is SignedResourceId {\n // lint-allow-cast\n return typeof resourceId === \"string\" && resourceId.includes(\"|\");\n}\n\n/** Encode resource signature to base64url for embedding in URL-based handles. */\nexport function signatureToBase64Url(sig?: ResourceSignature): string {\n return sig && sig.length > 0 ? Buffer.from(sig).toString(\"base64url\") : \"\";\n}\n\n/** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */\nexport function toResourceSignature(raw?: Uint8Array): ResourceSignature {\n return raw && raw.length > 0\n ? (raw as ResourceSignature)\n : (new Uint8Array(0) as ResourceSignature);\n}\n\n/** Decode base64url-encoded string back to a branded ResourceSignature. */\nexport function base64UrlToSignature(str: string): ResourceSignature {\n return toResourceSignature(Buffer.from(str, \"base64url\"))!;\n}\n\n/** Converts bigint global resource id and signature to a SignedResourceId string.\n * Format: \"<globalIdString>|<signatureHex>\" */\nexport function createSignedResourceId(\n globalId: bigint,\n signature?: ResourceSignature,\n): SignedResourceId {\n if (isLocalResourceId(globalId))\n throw new Error(`Local resource id: ${resourceIdToString(globalId)}`);\n if (isNullResourceId(globalId)) throw new Error(`Null resource id.`);\n\n const sigHex = signature ? Buffer.from(signature).toString(\"hex\") : \"\";\n return `${String(globalId)}|${sigHex}` as SignedResourceId; // lint-allow-cast\n}\n\nexport function parseSignedResourceId(resourceId: SignedResourceId): {\n globalId: GlobalResourceId;\n signature: ResourceSignature;\n} {\n if (typeof resourceId !== \"string\") {\n throw new Error(`Not a signed resource id: ${resourceId}`);\n }\n\n const pipeIdx = resourceId.indexOf(\"|\");\n if (pipeIdx < 0) throw new Error(`Malformed signed resource id (no '|'): ${resourceId}`);\n\n const globalIdStr = resourceId.substring(0, pipeIdx);\n const signatureHex = resourceId.substring(pipeIdx + 1);\n\n const globalId = BigInt(globalIdStr);\n if (isNullSignedResourceId(globalId) || isLocalResourceId(globalId))\n throw new Error(`Invalid global id portion in signed resource id: ${globalIdStr}`);\n\n const signature: ResourceSignature = (\n signatureHex.length > 0 ? Buffer.from(signatureHex, \"hex\") : new Uint8Array(0)\n ) as ResourceSignature;\n\n return { globalId: globalId as GlobalResourceId, signature };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/core/types.ts"],"sourcesContent":["/* eslint-disable eslint-js/no-restricted-syntax -- this file is the canonical place to construct SignedResourceId values; outside callers must use asSignedResourceId(). */\n\nimport type { Branded } from \"@milaboratories/pl-model-common\";\nimport { cachedDeserialize, notEmpty } from \"@milaboratories/ts-helpers\";\n\n/** Null resource id */\nexport type NullResourceId = Branded<bigint, \"null\", \"__resource_id__\">;\n\n/** Global resource id */\nexport type GlobalResourceId = Branded<bigint, \"global\", \"__resource_id__\">;\n\n/** Local resource id */\nexport type LocalResourceId = Branded<bigint, \"local\", \"__resource_id__\">;\n\n/** Any non-null resource id */\nexport type AnyResourceId = GlobalResourceId | LocalResourceId;\n\n/** All possible resource flavours */\nexport type OptionalAnyResourceId = NullResourceId | GlobalResourceId | LocalResourceId;\n\nexport const NullResourceId = 0n as NullResourceId;\n\nfunction isNullResourceId(resourceId: bigint | string): resourceId is NullResourceId {\n return resourceId === NullResourceId;\n}\n\nexport function isAnyResourceId(resourceId: bigint): resourceId is AnyResourceId {\n return resourceId !== 0n;\n}\n\n// see local / global resource logic below...\n\nexport type ResourceKind = \"Structural\" | \"Value\";\n\nexport type FieldType = \"Input\" | \"Output\" | \"Service\" | \"OTW\" | \"Dynamic\" | \"MTW\";\n\nexport type FutureFieldType = \"Output\" | \"Input\" | \"Service\";\n\nexport type FieldStatus = \"Empty\" | \"Assigned\" | \"Resolved\";\n\nexport interface ResourceType {\n readonly name: string;\n readonly version: string;\n}\n\nexport function resourceType(name: string, version: string): ResourceType {\n return { name, version };\n}\n\nexport function resourceTypeToString(rt: ResourceType): string {\n return `${rt.name}:${rt.version}`;\n}\n\nexport function parseResourceType(str: string): ResourceType {\n const [name, version] = str.split(\":\");\n return { name, version };\n}\n\nexport function resourceTypesEqual(type1: ResourceType, type2: ResourceType): boolean {\n return type1.name === type2.name && type1.version === type2.version;\n}\n\n/** Color proof used for resource creation requests (alias for ResourceSignature). */\nexport type ColorProof = ResourceSignature;\n\n/** Readonly fields here marks properties of resource that can't change according to pl's state machine. */\nexport type BasicResourceData = {\n readonly id: SignedResourceId;\n readonly originalResourceId: OptionalSignedResourceId;\n\n readonly kind: ResourceKind;\n readonly type: ResourceType;\n\n readonly data?: Uint8Array;\n\n readonly error: OptionalSignedResourceId;\n\n readonly inputsLocked: boolean;\n readonly outputsLocked: boolean;\n readonly resourceReady: boolean;\n\n /** This value is derived from resource state by the server and can be used as\n * a robust criteria to determine resource is in final state. */\n readonly final: boolean;\n};\n\nexport function extractBasicResourceData(rd: ResourceData): BasicResourceData {\n const {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n } = rd;\n return {\n id,\n originalResourceId,\n kind,\n type,\n data,\n error,\n inputsLocked,\n outputsLocked,\n resourceReady,\n final,\n };\n}\n\nexport const jsonToData = (data: unknown) => Buffer.from(JSON.stringify(data));\n\nexport const resDataToJson = (res: ResourceData) => cachedDeserialize(notEmpty(res.data));\n\nexport type ResourceData = BasicResourceData & {\n readonly fields: FieldData[];\n};\n\nexport function getField(r: ResourceData, name: string): FieldData {\n return notEmpty(r.fields.find((f) => f.name === name));\n}\n\nexport type FieldData = {\n readonly name: string;\n readonly type: FieldType;\n readonly status: FieldStatus;\n readonly value: OptionalSignedResourceId;\n readonly error: OptionalSignedResourceId;\n\n /** True if value the fields points to is in final state. */\n readonly valueIsFinal: boolean;\n};\n\n//\n// Local / Global ResourceId arithmetics\n//\n\n// Note: txId and other numerical values are made numbers but not bigint intentionally,\n// after implementing security model based on signed resource ids this will make\n// much more sense\n\nconst ResourceIdRootMask = 1n << 63n;\nconst ResourceIdLocalMask = 1n << 62n;\nconst NoFlagsIdMask = 0x3fffffffffffffffn;\nconst LocalResourceIdTxIdOffset = 24n;\nexport const MaxLocalId = 0xffffff;\nexport const MaxTxId = 0xffffffff;\n/** Mask valid after applying shift */\nconst TxIdMask = BigInt(MaxTxId);\nconst LocalIdMask = BigInt(MaxLocalId);\n\n// /** Basically removes embedded tx id */\n// const LocalIdCleanMask = 0xFF00000000FFFFFFn;\n\nexport function isRootResourceId(id: bigint) {\n return (id & ResourceIdRootMask) !== 0n;\n}\n\nexport function isLocalResourceId(id: bigint | string): id is LocalResourceId {\n if (typeof id === \"string\") {\n return false;\n }\n\n return (id & ResourceIdLocalMask) !== 0n;\n}\n\nexport function createLocalResourceId(\n isRoot: boolean,\n localCounterValue: number,\n localTxId: number,\n): LocalResourceId {\n if (\n localCounterValue > MaxLocalId ||\n localTxId > MaxTxId ||\n localCounterValue < 0 ||\n localTxId <= 0\n )\n throw Error(\"wrong local id or tx id\");\n return ((isRoot ? ResourceIdRootMask : 0n) |\n ResourceIdLocalMask |\n BigInt(localCounterValue) |\n (BigInt(localTxId) << LocalResourceIdTxIdOffset)) as LocalResourceId;\n}\n\nexport function createGlobalResourceId(isRoot: boolean, unmaskedId: bigint): GlobalResourceId {\n return ((isRoot ? ResourceIdRootMask : 0n) | unmaskedId) as GlobalResourceId;\n}\n\nexport function extractTxId(localResourceId: LocalResourceId): number {\n return Number((localResourceId >> LocalResourceIdTxIdOffset) & TxIdMask);\n}\n\nexport function checkLocalityOfResourceId(resourceId: AnyResourceId, expectedTxId: number): void {\n if (!isLocalResourceId(resourceId)) return;\n if (extractTxId(resourceId) !== expectedTxId)\n throw Error(\n \"local id from another transaction, globalize id before leaking it from the transaction\",\n );\n}\n\nexport function resourceIdToString(\n resourceId: OptionalAnyResourceId | OptionalSignedResourceId,\n): string {\n if (isSignedResourceId(resourceId)) {\n // Strip signature\n resourceId = anyResourceIdToBigint(resourceId) as GlobalResourceId;\n }\n\n if (isNullSignedResourceId(resourceId)) return \"XX:0x0\";\n if (isNullResourceId(resourceId)) return \"XX:0x0\";\n\n if (isLocalResourceId(resourceId))\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"L:0x\" +\n (LocalIdMask & resourceId).toString(16) +\n \"[0x\" +\n extractTxId(resourceId).toString(16) +\n \"]\"\n );\n else\n return (\n (isRootResourceId(resourceId) ? \"R\" : \"N\") +\n \"G:0x\" +\n (NoFlagsIdMask & resourceId).toString(16)\n );\n}\n\nconst resourceIdRegexp =\n /^(?:(?<xx>XX)|(?<rn>[XRN])(?<lg>[XLG])):0x(?<rid>[0-9a-fA-F]+)(?:\\[0x(?<txid>[0-9a-fA-F]+)])?$/;\n\nexport function resourceIdFromString(str: string): OptionalAnyResourceId | undefined {\n const match = str.match(resourceIdRegexp);\n if (match === null) return undefined;\n const { xx, rn, lg, rid, txid } = match.groups!;\n if (xx) return NullResourceId;\n if (lg === \"L\")\n return createLocalResourceId(rn === \"R\", Number.parseInt(rid, 16), Number.parseInt(txid, 16));\n else return createGlobalResourceId(rn === \"R\", BigInt(\"0x\" + rid));\n}\n\nexport function anyResourceIdToBigint(resourceId: bigint | SignedResourceId): bigint {\n if (typeof resourceId !== \"string\") {\n return resourceId;\n }\n\n const parsed = parseSignedResourceId(resourceId);\n return parsed.globalId as bigint;\n}\n\nexport function stringifyWithResourceId(object: unknown): string {\n return JSON.stringify(object, (key, value) => {\n if (typeof value === \"bigint\") return resourceIdToString(value as OptionalAnyResourceId);\n if (isSignedResourceId(value)) return resourceIdToString(value);\n return value;\n });\n}\n\n/** Opaque authorization signature attached to a resource. */\nexport type ResourceSignature = Branded<Uint8Array, \"ResourceSignature\">;\n\n/**\n * Signed resource id is \"<global ID>|<resource signature hex>\", encoded as string\n * (e.g. \"NG:0x123EC|1234567890abcdef\")\n */\nexport type SignedResourceId = Branded<string, \"signed\", \"__signed_resource_id__\">;\n\nexport type NullSignedResourceId = Branded<string, \"null\", \"__signed_resource_id__\">;\n\nexport const NullSignedResourceId = \"\" as NullSignedResourceId;\n\n/** Nullable signed resource ID */\nexport type OptionalSignedResourceId = NullSignedResourceId | SignedResourceId;\n\nexport function isNullSignedResourceId(\n resourceId: bigint | string,\n): resourceId is NullSignedResourceId {\n return resourceId === NullSignedResourceId;\n}\n\nexport function isNotNullSignedResourceId(\n resourceId: OptionalSignedResourceId,\n): resourceId is SignedResourceId {\n return resourceId !== NullSignedResourceId;\n}\n\nexport function ensureSignedResourceIdNotNull(\n resourceId: OptionalSignedResourceId,\n): SignedResourceId {\n if (!isNotNullSignedResourceId(resourceId)) throw new Error(\"null resource id\");\n return resourceId;\n}\n\nexport function isSignedResourceId(resourceId: bigint | string): resourceId is SignedResourceId {\n return typeof resourceId === \"string\" && resourceId.includes(\"|\");\n}\n\n/** Validate a string as a SignedResourceId and return it with the branded type.\n * Requires the format \"<globalId>|<signatureHex>\" with a non-empty signature. */\nexport function asSignedResourceId(str: string): SignedResourceId {\n const pipeIdx = str.indexOf(\"|\");\n if (pipeIdx < 0) throw new Error(`Not a signed resource id (no '|' separator): ${str}`);\n if (pipeIdx === 0) throw new Error(`Signed resource id has empty globalId: ${str}`);\n if (pipeIdx === str.length - 1) throw new Error(`Signed resource id has empty signature: ${str}`);\n return str as SignedResourceId;\n}\n\n/** Encode resource signature to base64url for embedding in URL-based handles. */\nexport function signatureToBase64Url(sig?: ResourceSignature): string {\n return sig && sig.length > 0 ? Buffer.from(sig).toString(\"base64url\") : \"\";\n}\n\n/** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */\nexport function toResourceSignature(raw?: Uint8Array): ResourceSignature {\n return raw && raw.length > 0\n ? (raw as ResourceSignature)\n : (new Uint8Array(0) as ResourceSignature);\n}\n\n/** Decode base64url-encoded string back to a branded ResourceSignature. */\nexport function base64UrlToSignature(str: string): ResourceSignature {\n return toResourceSignature(Buffer.from(str, \"base64url\"))!;\n}\n\n/** Converts bigint global resource id and signature to a SignedResourceId string.\n * Format: \"<globalIdString>|<signatureHex>\" */\nexport function createSignedResourceId(\n globalId: bigint,\n signature?: ResourceSignature,\n): SignedResourceId {\n if (isLocalResourceId(globalId))\n throw new Error(`Local resource id: ${resourceIdToString(globalId)}`);\n if (isNullResourceId(globalId)) throw new Error(`Null resource id.`);\n\n const sigHex = signature ? Buffer.from(signature).toString(\"hex\") : \"\";\n return `${String(globalId)}|${sigHex}` as SignedResourceId;\n}\n\nexport function parseSignedResourceId(resourceId: SignedResourceId): {\n globalId: GlobalResourceId;\n signature: ResourceSignature;\n} {\n if (typeof resourceId !== \"string\") {\n throw new Error(`Not a signed resource id: ${resourceId}`);\n }\n\n const pipeIdx = resourceId.indexOf(\"|\");\n if (pipeIdx < 0) throw new Error(`Malformed signed resource id (no '|'): ${resourceId}`);\n\n const globalIdStr = resourceId.substring(0, pipeIdx);\n const signatureHex = resourceId.substring(pipeIdx + 1);\n\n const globalId = BigInt(globalIdStr);\n if (isNullSignedResourceId(globalId) || isLocalResourceId(globalId))\n throw new Error(`Invalid global id portion in signed resource id: ${globalIdStr}`);\n\n const signature: ResourceSignature = (\n signatureHex.length > 0 ? Buffer.from(signatureHex, \"hex\") : new Uint8Array(0)\n ) as ResourceSignature;\n\n return { globalId: globalId as GlobalResourceId, signature };\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  require("./_virtual/_rolldown/runtime.cjs");
3
3
  const require_types = require("./core/types.cjs");
4
+ const require_api = require("./proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs");
4
5
  const require_errors = require("./core/errors.cjs");
5
6
  const require_transaction = require("./core/transaction.cjs");
6
7
  const require_pl = require("./helpers/pl.cjs");
@@ -13,6 +14,7 @@ const require_client = require("./core/client.cjs");
13
14
  const require_driver = require("./core/driver.cjs");
14
15
  const require_unauth_client = require("./core/unauth_client.cjs");
15
16
  const require_default_client = require("./core/default_client.cjs");
17
+ const require_tree_filter = require("./core/tree_filter.cjs");
16
18
  const require_tx_helpers = require("./helpers/tx_helpers.cjs");
17
19
  const require_poll = require("./helpers/poll.cjs");
18
20
  const require_test_config = require("./test/test_config.cjs");
@@ -35,6 +37,8 @@ exports.DefaultFinalResourceDataPredicate = require_final.DefaultFinalResourceDa
35
37
  exports.DefaultPollingRetryOptions = require_poll.DefaultPollingRetryOptions;
36
38
  exports.DefaultRetryOptions = require_config.DefaultRetryOptions;
37
39
  exports.DisconnectedError = require_errors.DisconnectedError;
40
+ exports.FilterOperatorType = require_api.ResourceAPI_Tree_Filter_OperatorType;
41
+ exports.FilterProperty = require_api.ResourceAPI_Tree_Filter_Property;
38
42
  exports.MaxLocalId = require_types.MaxLocalId;
39
43
  exports.MaxTxId = require_types.MaxTxId;
40
44
  exports.NullResourceId = require_types.NullResourceId;
@@ -76,6 +80,7 @@ exports.UnrecoverablePlError = require_errors.UnrecoverablePlError;
76
80
  exports.UserResources = require_user_resources.UserResources;
77
81
  exports.addRTypeToMetadata = require_driver.addRTypeToMetadata;
78
82
  exports.anyResourceIdToBigint = require_types.anyResourceIdToBigint;
83
+ exports.asSignedResourceId = require_types.asSignedResourceId;
79
84
  exports.base64UrlToSignature = require_types.base64UrlToSignature;
80
85
  exports.checkLocalityOfResourceId = require_types.checkLocalityOfResourceId;
81
86
  exports.createGlobalResourceId = require_types.createGlobalResourceId;
@@ -129,5 +134,6 @@ exports.toFieldId = require_transaction.toFieldId;
129
134
  exports.toGlobalFieldId = require_transaction.toGlobalFieldId;
130
135
  exports.toGlobalResourceId = require_transaction.toGlobalResourceId;
131
136
  exports.toResourceSignature = require_types.toResourceSignature;
137
+ exports.treeFilter = require_tree_filter.treeFilter;
132
138
  exports.tryGetFileConfig = require_default_client.tryGetFileConfig;
133
139
  exports.valErr = require_tx_helpers.valErr;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { AnyResourceId, BasicResourceData, ColorProof, FieldData, FieldStatus, FieldType, FutureFieldType, GlobalResourceId, LocalResourceId, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, OptionalAnyResourceId, OptionalSignedResourceId, ResourceData, ResourceKind, ResourceSignature, ResourceType, SignedResourceId, anyResourceIdToBigint, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature } from "./core/types.js";
1
+ import { AnyResourceId, BasicResourceData, ColorProof, FieldData, FieldStatus, FieldType, FutureFieldType, GlobalResourceId, LocalResourceId, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, OptionalAnyResourceId, OptionalSignedResourceId, ResourceData, ResourceKind, ResourceSignature, ResourceType, SignedResourceId, anyResourceIdToBigint, asSignedResourceId, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature } from "./core/types.js";
2
+ import { ResourceAPI_Tree_Filter, ResourceAPI_Tree_Filter_OperatorType, ResourceAPI_Tree_Filter_Property } from "./proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js";
2
3
  import { DefaultFinalResourceDataPredicate, FinalResourceDataPredicate, ResourceTypeName, ResourceTypePrefix } from "./core/final.js";
3
- import { AnyFieldId, AnyFieldRef, AnyRef, AnyResourceRef, FieldId, FieldRef, KeyValue, KeyValueString, LocalFieldId, PlTransaction, ResourceIdWithSignature, ResourceRef, TxCommitConflict, field, isField, isFieldRef, isResource, isResourceId, isResourceRef, toFieldId, toGlobalFieldId, toGlobalResourceId } from "./core/transaction.js";
4
+ import { AnyFieldId, AnyFieldRef, AnyRef, AnyResourceRef, FieldId, FieldRef, KeyValue, KeyValueString, LocalFieldId, PlTransaction, ResourceIdWithSignature, ResourceRef, ResourceTreeFrame, ResourceTreeItem, TxCommitConflict, field, isField, isFieldRef, isResource, isResourceId, isResourceRef, toFieldId, toGlobalFieldId, toGlobalResourceId } from "./core/transaction.js";
4
5
  import { pl_d_exports } from "./helpers/pl.js";
5
6
  import { AnonymousAuthInformation, AuthInformation, AuthOps, DEFAULT_AUTH_MAX_REFRESH, DEFAULT_MAX_CACHE_BYTES, DEFAULT_REQUEST_TIMEOUT, DEFAULT_RETRY_BACKOFF_ALGORITHM, DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY, DEFAULT_RETRY_JITTER, DEFAULT_RETRY_LINEAR_BACKOFF_STEP, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RO_TX_TIMEOUT, DEFAULT_RW_TX_TIMEOUT, DEFAULT_TOKEN_TTL_SECONDS, DefaultRetryOptions, PlClientConfig, PlConnectionStatus, PlConnectionStatusListener, SUPPORTED_WIRE_PROTOCOLS, plAddressToConfig, wireProtocol } from "./core/config.js";
6
7
  import { GrpcConnection, RestConnection, WireClientProvider, WireClientProviderFactory, WireConnection } from "./core/wire.js";
@@ -12,7 +13,8 @@ import { DisconnectedError, PermissionDeniedError, PlError, PlErrorCodeNotFound,
12
13
  import { defaultPlClient, tryGetFileConfig } from "./core/default_client.js";
13
14
  import { UnauthenticatedPlClient } from "./core/unauth_client.js";
14
15
  import { expirationFromAuthInformation, inferAuthRefreshTime } from "./core/auth.js";
16
+ import { Filter, Property, treeFilter } from "./core/tree_filter.js";
15
17
  import { ValErr, valErr } from "./helpers/tx_helpers.js";
16
18
  import { ContinuePolling, DefaultPollingRetryOptions, PollFieldTraverseOps, PollResourceAccessor, PollTxAccessor, poll } from "./helpers/poll.js";
17
19
  import { test_config_d_exports } from "./test/test_config.js";
18
- export { AnonymousAuthInformation, AnyFieldId, AnyFieldRef, AnyRef, AnyResourceId, AnyResourceRef, AuthInformation, AuthOps, BasicResourceData, ColorProof, ContinuePolling, DEFAULT_AUTH_MAX_REFRESH, DEFAULT_MAX_CACHE_BYTES, DEFAULT_REQUEST_TIMEOUT, DEFAULT_RETRY_BACKOFF_ALGORITHM, DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY, DEFAULT_RETRY_JITTER, DEFAULT_RETRY_LINEAR_BACKOFF_STEP, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RO_TX_TIMEOUT, DEFAULT_RW_TX_TIMEOUT, DEFAULT_TOKEN_TTL_SECONDS, DefaultFinalResourceDataPredicate, DefaultPollingRetryOptions, DefaultRetryOptions, DisconnectedError, FieldData, FieldId, FieldRef, FieldStatus, FieldType, FinalResourceDataPredicate, FutureFieldType, GlobalResourceId, GrpcConnection, KeyValue, KeyValueString, LocalFieldId, LocalResourceId, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, OptionalAnyResourceId, OptionalSignedResourceId, PermissionDeniedError, pl_d_exports as Pl, PlClient, PlClientConfig, PlConnectionStatus, PlConnectionStatusListener, PlDriver, PlDriverDefinition, PlError, PlErrorCodeNotFound, PlTransaction, PollFieldTraverseOps, PollResourceAccessor, PollTxAccessor, RESTError, RecoverablePlError, ResourceData, ResourceIdWithSignature, ResourceKind, ResourceRef, ResourceSignature, ResourceType, ResourceTypeName, ResourceTypePrefix, index_d_exports as RestAPI, RestConnection, SUPPORTED_WIRE_PROTOCOLS, SignedResourceId, StorageInfo, test_config_d_exports as TestHelpers, TxCommitConflict, TxOps, TxRunner, UnauthenticatedError, UnauthenticatedPlClient, UnrecoverablePlError, UserResources, ValErr, WireClientProvider, WireClientProviderFactory, WireConnection, addRTypeToMetadata, anyResourceIdToBigint, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createRTypeRoutingHeader, createSignedResourceId, defaultPlClient, ensureSignedResourceIdNotNull, expirationFromAuthInformation, extractBasicResourceData, extractTxId, field, getField, inferAuthRefreshTime, isAbortedError, isAnyResourceId, isCancelError, isConnectionProblem, isField, isFieldRef, isLocalResourceId, isNotFoundError, isNotNullSignedResourceId, isNullSignedResourceId, isPermissionDenied, isResource, isResourceId, isResourceRef, isRootResourceId, isSignedResourceId, isTimeoutError, isTimeoutOrCancelError, isUnauthenticated, isUnimplementedError, jsonToData, parseResourceType, parseSignedResourceId, plAddressToConfig, poll, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, rethrowMeaningfulError, signatureToBase64Url, stringifyWithResourceId, throwPlNotFoundError, toFieldId, toGlobalFieldId, toGlobalResourceId, toResourceSignature, tryGetFileConfig, valErr, wireProtocol };
20
+ export { AnonymousAuthInformation, AnyFieldId, AnyFieldRef, AnyRef, AnyResourceId, AnyResourceRef, AuthInformation, AuthOps, BasicResourceData, ColorProof, ContinuePolling, DEFAULT_AUTH_MAX_REFRESH, DEFAULT_MAX_CACHE_BYTES, DEFAULT_REQUEST_TIMEOUT, DEFAULT_RETRY_BACKOFF_ALGORITHM, DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY, DEFAULT_RETRY_JITTER, DEFAULT_RETRY_LINEAR_BACKOFF_STEP, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RO_TX_TIMEOUT, DEFAULT_RW_TX_TIMEOUT, DEFAULT_TOKEN_TTL_SECONDS, DefaultFinalResourceDataPredicate, DefaultPollingRetryOptions, DefaultRetryOptions, DisconnectedError, FieldData, FieldId, FieldRef, FieldStatus, FieldType, Filter, ResourceAPI_Tree_Filter_OperatorType as FilterOperatorType, ResourceAPI_Tree_Filter_Property as FilterProperty, FinalResourceDataPredicate, FutureFieldType, GlobalResourceId, GrpcConnection, KeyValue, KeyValueString, LocalFieldId, LocalResourceId, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, OptionalAnyResourceId, OptionalSignedResourceId, PermissionDeniedError, pl_d_exports as Pl, PlClient, PlClientConfig, PlConnectionStatus, PlConnectionStatusListener, PlDriver, PlDriverDefinition, PlError, PlErrorCodeNotFound, PlTransaction, PollFieldTraverseOps, PollResourceAccessor, PollTxAccessor, Property, RESTError, RecoverablePlError, ResourceAPI_Tree_Filter, ResourceData, ResourceIdWithSignature, ResourceKind, ResourceRef, ResourceSignature, ResourceTreeFrame, ResourceTreeItem, ResourceType, ResourceTypeName, ResourceTypePrefix, index_d_exports as RestAPI, RestConnection, SUPPORTED_WIRE_PROTOCOLS, SignedResourceId, StorageInfo, test_config_d_exports as TestHelpers, TxCommitConflict, TxOps, TxRunner, UnauthenticatedError, UnauthenticatedPlClient, UnrecoverablePlError, UserResources, ValErr, WireClientProvider, WireClientProviderFactory, WireConnection, addRTypeToMetadata, anyResourceIdToBigint, asSignedResourceId, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createRTypeRoutingHeader, createSignedResourceId, defaultPlClient, ensureSignedResourceIdNotNull, expirationFromAuthInformation, extractBasicResourceData, extractTxId, field, getField, inferAuthRefreshTime, isAbortedError, isAnyResourceId, isCancelError, isConnectionProblem, isField, isFieldRef, isLocalResourceId, isNotFoundError, isNotNullSignedResourceId, isNullSignedResourceId, isPermissionDenied, isResource, isResourceId, isResourceRef, isRootResourceId, isSignedResourceId, isTimeoutError, isTimeoutOrCancelError, isUnauthenticated, isUnimplementedError, jsonToData, parseResourceType, parseSignedResourceId, plAddressToConfig, poll, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, rethrowMeaningfulError, signatureToBase64Url, stringifyWithResourceId, throwPlNotFoundError, toFieldId, toGlobalFieldId, toGlobalResourceId, toResourceSignature, treeFilter, tryGetFileConfig, valErr, wireProtocol };
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
- import { MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, anyResourceIdToBigint, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature } from "./core/types.js";
1
+ import { MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, anyResourceIdToBigint, asSignedResourceId, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createSignedResourceId, ensureSignedResourceIdNotNull, extractBasicResourceData, extractTxId, getField, isAnyResourceId, isLocalResourceId, isNotNullSignedResourceId, isNullSignedResourceId, isRootResourceId, isSignedResourceId, jsonToData, parseResourceType, parseSignedResourceId, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, signatureToBase64Url, stringifyWithResourceId, toResourceSignature } from "./core/types.js";
2
+ import { ResourceAPI_Tree_Filter_OperatorType, ResourceAPI_Tree_Filter_Property } from "./proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js";
2
3
  import { DisconnectedError, PermissionDeniedError, PlError, PlErrorCodeNotFound, RESTError, RecoverablePlError, UnauthenticatedError, UnrecoverablePlError, isAbortedError, isCancelError, isConnectionProblem, isNotFoundError, isPermissionDenied, isTimeoutError, isTimeoutOrCancelError, isUnauthenticated, isUnimplementedError, rethrowMeaningfulError, throwPlNotFoundError } from "./core/errors.js";
3
4
  import { PlTransaction, TxCommitConflict, field, isField, isFieldRef, isResource, isResourceId, isResourceRef, toFieldId, toGlobalFieldId, toGlobalResourceId } from "./core/transaction.js";
4
5
  import { pl_exports } from "./helpers/pl.js";
@@ -11,7 +12,8 @@ import { PlClient } from "./core/client.js";
11
12
  import { addRTypeToMetadata, createRTypeRoutingHeader } from "./core/driver.js";
12
13
  import { UnauthenticatedPlClient } from "./core/unauth_client.js";
13
14
  import { defaultPlClient, tryGetFileConfig } from "./core/default_client.js";
15
+ import { treeFilter } from "./core/tree_filter.js";
14
16
  import { valErr } from "./helpers/tx_helpers.js";
15
17
  import { ContinuePolling, DefaultPollingRetryOptions, PollResourceAccessor, PollTxAccessor, poll } from "./helpers/poll.js";
16
18
  import { test_config_exports } from "./test/test_config.js";
17
- export { AnonymousAuthInformation, ContinuePolling, DEFAULT_AUTH_MAX_REFRESH, DEFAULT_MAX_CACHE_BYTES, DEFAULT_REQUEST_TIMEOUT, DEFAULT_RETRY_BACKOFF_ALGORITHM, DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY, DEFAULT_RETRY_JITTER, DEFAULT_RETRY_LINEAR_BACKOFF_STEP, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RO_TX_TIMEOUT, DEFAULT_RW_TX_TIMEOUT, DEFAULT_TOKEN_TTL_SECONDS, DefaultFinalResourceDataPredicate, DefaultPollingRetryOptions, DefaultRetryOptions, DisconnectedError, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, PermissionDeniedError, pl_exports as Pl, PlClient, PlError, PlErrorCodeNotFound, PlTransaction, PollResourceAccessor, PollTxAccessor, RESTError, RecoverablePlError, ResourceTypeName, ResourceTypePrefix, proto_rest_exports as RestAPI, SUPPORTED_WIRE_PROTOCOLS, test_config_exports as TestHelpers, TxCommitConflict, UnauthenticatedError, UnauthenticatedPlClient, UnrecoverablePlError, UserResources, addRTypeToMetadata, anyResourceIdToBigint, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createRTypeRoutingHeader, createSignedResourceId, defaultPlClient, ensureSignedResourceIdNotNull, expirationFromAuthInformation, extractBasicResourceData, extractTxId, field, getField, inferAuthRefreshTime, isAbortedError, isAnyResourceId, isCancelError, isConnectionProblem, isField, isFieldRef, isLocalResourceId, isNotFoundError, isNotNullSignedResourceId, isNullSignedResourceId, isPermissionDenied, isResource, isResourceId, isResourceRef, isRootResourceId, isSignedResourceId, isTimeoutError, isTimeoutOrCancelError, isUnauthenticated, isUnimplementedError, jsonToData, parseResourceType, parseSignedResourceId, plAddressToConfig, poll, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, rethrowMeaningfulError, signatureToBase64Url, stringifyWithResourceId, throwPlNotFoundError, toFieldId, toGlobalFieldId, toGlobalResourceId, toResourceSignature, tryGetFileConfig, valErr };
19
+ export { AnonymousAuthInformation, ContinuePolling, DEFAULT_AUTH_MAX_REFRESH, DEFAULT_MAX_CACHE_BYTES, DEFAULT_REQUEST_TIMEOUT, DEFAULT_RETRY_BACKOFF_ALGORITHM, DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY, DEFAULT_RETRY_JITTER, DEFAULT_RETRY_LINEAR_BACKOFF_STEP, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RO_TX_TIMEOUT, DEFAULT_RW_TX_TIMEOUT, DEFAULT_TOKEN_TTL_SECONDS, DefaultFinalResourceDataPredicate, DefaultPollingRetryOptions, DefaultRetryOptions, DisconnectedError, ResourceAPI_Tree_Filter_OperatorType as FilterOperatorType, ResourceAPI_Tree_Filter_Property as FilterProperty, MaxLocalId, MaxTxId, NullResourceId, NullSignedResourceId, PermissionDeniedError, pl_exports as Pl, PlClient, PlError, PlErrorCodeNotFound, PlTransaction, PollResourceAccessor, PollTxAccessor, RESTError, RecoverablePlError, ResourceTypeName, ResourceTypePrefix, proto_rest_exports as RestAPI, SUPPORTED_WIRE_PROTOCOLS, test_config_exports as TestHelpers, TxCommitConflict, UnauthenticatedError, UnauthenticatedPlClient, UnrecoverablePlError, UserResources, addRTypeToMetadata, anyResourceIdToBigint, asSignedResourceId, base64UrlToSignature, checkLocalityOfResourceId, createGlobalResourceId, createLocalResourceId, createRTypeRoutingHeader, createSignedResourceId, defaultPlClient, ensureSignedResourceIdNotNull, expirationFromAuthInformation, extractBasicResourceData, extractTxId, field, getField, inferAuthRefreshTime, isAbortedError, isAnyResourceId, isCancelError, isConnectionProblem, isField, isFieldRef, isLocalResourceId, isNotFoundError, isNotNullSignedResourceId, isNullSignedResourceId, isPermissionDenied, isResource, isResourceId, isResourceRef, isRootResourceId, isSignedResourceId, isTimeoutError, isTimeoutOrCancelError, isUnauthenticated, isUnimplementedError, jsonToData, parseResourceType, parseSignedResourceId, plAddressToConfig, poll, resDataToJson, resourceIdFromString, resourceIdToString, resourceType, resourceTypeToString, resourceTypesEqual, rethrowMeaningfulError, signatureToBase64Url, stringifyWithResourceId, throwPlNotFoundError, toFieldId, toGlobalFieldId, toGlobalResourceId, toResourceSignature, treeFilter, tryGetFileConfig, valErr };