@milaboratories/pl-client 3.11.4 → 3.12.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 (193) hide show
  1. package/dist/core/PromiseTracker.cjs.map +1 -1
  2. package/dist/core/PromiseTracker.d.ts.map +1 -1
  3. package/dist/core/PromiseTracker.js.map +1 -1
  4. package/dist/core/StatefulPromise.cjs +2 -0
  5. package/dist/core/StatefulPromise.cjs.map +1 -1
  6. package/dist/core/StatefulPromise.js +2 -0
  7. package/dist/core/StatefulPromise.js.map +1 -1
  8. package/dist/core/abstract_stream.d.ts +1 -1
  9. package/dist/core/advisory_locks.cjs.map +1 -1
  10. package/dist/core/advisory_locks.js.map +1 -1
  11. package/dist/core/auth.cjs.map +1 -1
  12. package/dist/core/auth.d.ts.map +1 -1
  13. package/dist/core/auth.js.map +1 -1
  14. package/dist/core/cache.d.ts.map +1 -1
  15. package/dist/core/capabilities.cjs.map +1 -1
  16. package/dist/core/capabilities.d.ts.map +1 -1
  17. package/dist/core/capabilities.js.map +1 -1
  18. package/dist/core/client.cjs +3 -3
  19. package/dist/core/client.cjs.map +1 -1
  20. package/dist/core/client.d.ts.map +1 -1
  21. package/dist/core/client.js +2 -2
  22. package/dist/core/client.js.map +1 -1
  23. package/dist/core/config.cjs.map +1 -1
  24. package/dist/core/config.d.ts.map +1 -1
  25. package/dist/core/config.js.map +1 -1
  26. package/dist/core/default_client.cjs +5 -5
  27. package/dist/core/default_client.cjs.map +1 -1
  28. package/dist/core/default_client.d.ts.map +1 -1
  29. package/dist/core/default_client.js.map +1 -1
  30. package/dist/core/driver.cjs.map +1 -1
  31. package/dist/core/driver.d.ts.map +1 -1
  32. package/dist/core/driver.js.map +1 -1
  33. package/dist/core/error_resource.cjs.map +1 -1
  34. package/dist/core/error_resource.js.map +1 -1
  35. package/dist/core/errors.cjs +10 -11
  36. package/dist/core/errors.cjs.map +1 -1
  37. package/dist/core/errors.d.ts.map +1 -1
  38. package/dist/core/errors.js +10 -10
  39. package/dist/core/errors.js.map +1 -1
  40. package/dist/core/final.cjs +2 -1
  41. package/dist/core/final.cjs.map +1 -1
  42. package/dist/core/final.d.ts.map +1 -1
  43. package/dist/core/final.js.map +1 -1
  44. package/dist/core/ll_client.cjs +14 -9
  45. package/dist/core/ll_client.cjs.map +1 -1
  46. package/dist/core/ll_client.d.ts +1 -0
  47. package/dist/core/ll_client.d.ts.map +1 -1
  48. package/dist/core/ll_client.js +15 -9
  49. package/dist/core/ll_client.js.map +1 -1
  50. package/dist/core/ll_transaction.cjs +3 -1
  51. package/dist/core/ll_transaction.cjs.map +1 -1
  52. package/dist/core/ll_transaction.d.ts +1 -1
  53. package/dist/core/ll_transaction.d.ts.map +1 -1
  54. package/dist/core/ll_transaction.js +2 -1
  55. package/dist/core/ll_transaction.js.map +1 -1
  56. package/dist/core/stat.cjs.map +1 -1
  57. package/dist/core/stat.js.map +1 -1
  58. package/dist/core/transaction.cjs +11 -5
  59. package/dist/core/transaction.cjs.map +1 -1
  60. package/dist/core/transaction.d.ts.map +1 -1
  61. package/dist/core/transaction.js +11 -4
  62. package/dist/core/transaction.js.map +1 -1
  63. package/dist/core/tree_filter.cjs +73 -18
  64. package/dist/core/tree_filter.cjs.map +1 -1
  65. package/dist/core/tree_filter.d.ts +1 -1
  66. package/dist/core/tree_filter.d.ts.map +1 -1
  67. package/dist/core/tree_filter.js +72 -19
  68. package/dist/core/tree_filter.js.map +1 -1
  69. package/dist/core/type_conversion.cjs +19 -20
  70. package/dist/core/type_conversion.cjs.map +1 -1
  71. package/dist/core/type_conversion.js +19 -19
  72. package/dist/core/type_conversion.js.map +1 -1
  73. package/dist/core/types.cjs +2 -3
  74. package/dist/core/types.cjs.map +1 -1
  75. package/dist/core/types.d.ts.map +1 -1
  76. package/dist/core/types.js +2 -2
  77. package/dist/core/types.js.map +1 -1
  78. package/dist/core/unauth_client.cjs +7 -6
  79. package/dist/core/unauth_client.cjs.map +1 -1
  80. package/dist/core/unauth_client.d.ts +9 -0
  81. package/dist/core/unauth_client.d.ts.map +1 -1
  82. package/dist/core/unauth_client.js +7 -5
  83. package/dist/core/unauth_client.js.map +1 -1
  84. package/dist/core/user_resources.cjs +3 -1
  85. package/dist/core/user_resources.cjs.map +1 -1
  86. package/dist/core/user_resources.d.ts.map +1 -1
  87. package/dist/core/user_resources.js +3 -0
  88. package/dist/core/user_resources.js.map +1 -1
  89. package/dist/core/websocket_stream.cjs +17 -20
  90. package/dist/core/websocket_stream.cjs.map +1 -1
  91. package/dist/core/websocket_stream.js +16 -19
  92. package/dist/core/websocket_stream.js.map +1 -1
  93. package/dist/core/wire.d.ts.map +1 -1
  94. package/dist/helpers/pl.cjs +25 -0
  95. package/dist/helpers/pl.cjs.map +1 -1
  96. package/dist/helpers/pl.d.ts +1 -1
  97. package/dist/helpers/pl.d.ts.map +1 -1
  98. package/dist/helpers/pl.js +1 -1
  99. package/dist/helpers/pl.js.map +1 -1
  100. package/dist/helpers/poll.cjs +5 -1
  101. package/dist/helpers/poll.cjs.map +1 -1
  102. package/dist/helpers/poll.d.ts.map +1 -1
  103. package/dist/helpers/poll.js +4 -0
  104. package/dist/helpers/poll.js.map +1 -1
  105. package/dist/helpers/retry_strategy.cjs +1 -0
  106. package/dist/helpers/retry_strategy.cjs.map +1 -1
  107. package/dist/helpers/retry_strategy.js +1 -1
  108. package/dist/helpers/retry_strategy.js.map +1 -1
  109. package/dist/helpers/tx_helpers.cjs +0 -1
  110. package/dist/helpers/tx_helpers.cjs.map +1 -1
  111. package/dist/helpers/tx_helpers.d.ts.map +1 -1
  112. package/dist/helpers/tx_helpers.js.map +1 -1
  113. package/dist/index.cjs +0 -1
  114. package/dist/index.d.ts +1 -1
  115. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs +0 -1
  116. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs.map +1 -1
  117. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.d.ts.map +1 -1
  118. package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js.map +1 -1
  119. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +531 -77
  120. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
  121. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs +11 -4
  122. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs.map +1 -1
  123. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts +12 -6
  124. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts.map +1 -1
  125. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js +11 -3
  126. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js.map +1 -1
  127. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +106 -1
  128. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +1 -1
  129. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +330 -77
  130. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
  131. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs +23 -7
  132. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs.map +1 -1
  133. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts +10 -3
  134. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts.map +1 -1
  135. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js +18 -7
  136. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js.map +1 -1
  137. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs +1 -2
  138. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs.map +1 -1
  139. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts.map +1 -1
  140. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js +1 -1
  141. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js.map +1 -1
  142. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs +2 -2
  143. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs.map +1 -1
  144. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts +1 -1
  145. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts.map +1 -1
  146. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js +2 -2
  147. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js.map +1 -1
  148. package/dist/proto-grpc/google/protobuf/any.cjs +1 -2
  149. package/dist/proto-grpc/google/protobuf/any.cjs.map +1 -1
  150. package/dist/proto-grpc/google/protobuf/any.d.ts.map +1 -1
  151. package/dist/proto-grpc/google/protobuf/any.js +1 -1
  152. package/dist/proto-grpc/google/protobuf/any.js.map +1 -1
  153. package/dist/proto-grpc/google/protobuf/duration.cjs +0 -1
  154. package/dist/proto-grpc/google/protobuf/duration.cjs.map +1 -1
  155. package/dist/proto-grpc/google/protobuf/duration.d.ts.map +1 -1
  156. package/dist/proto-grpc/google/protobuf/duration.js.map +1 -1
  157. package/dist/proto-grpc/google/protobuf/timestamp.cjs +0 -1
  158. package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
  159. package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +1 -1
  160. package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
  161. package/dist/proto-grpc/google/rpc/code.d.ts.map +1 -1
  162. package/dist/proto-rest/index.cjs +1 -1
  163. package/dist/proto-rest/index.cjs.map +1 -1
  164. package/dist/proto-rest/index.d.ts +1 -1
  165. package/dist/proto-rest/index.d.ts.map +1 -1
  166. package/dist/proto-rest/index.js.map +1 -1
  167. package/dist/proto-rest/plapi.d.ts +30 -9
  168. package/dist/proto-rest/plapi.d.ts.map +1 -1
  169. package/dist/test/tcp-proxy.cjs +2 -2
  170. package/dist/test/tcp-proxy.cjs.map +1 -1
  171. package/dist/test/tcp-proxy.d.ts +1 -1
  172. package/dist/test/tcp-proxy.js.map +1 -1
  173. package/dist/test/test_config.cjs +8 -2
  174. package/dist/test/test_config.cjs.map +1 -1
  175. package/dist/test/test_config.d.ts +1 -1
  176. package/dist/test/test_config.d.ts.map +1 -1
  177. package/dist/test/test_config.js +1 -1
  178. package/dist/test/test_config.js.map +1 -1
  179. package/dist/util/pl.cjs.map +1 -1
  180. package/dist/util/pl.js.map +1 -1
  181. package/dist/util/util.cjs.map +1 -1
  182. package/dist/util/util.js.map +1 -1
  183. package/package.json +6 -6
  184. package/src/core/ll_client.ts +7 -2
  185. package/src/core/unauth_client.ts +17 -2
  186. package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.ts +16 -3
  187. package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.ts +326 -3
  188. package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.ts +21 -7
  189. package/src/proto-rest/plapi.ts +29 -8
  190. package/dist/proto-grpc/google/rpc/code.cjs +0 -224
  191. package/dist/proto-grpc/google/rpc/code.cjs.map +0 -1
  192. package/dist/proto-grpc/google/rpc/code.js +0 -224
  193. package/dist/proto-grpc/google/rpc/code.js.map +0 -1
@@ -11,7 +11,7 @@ import { ResourceAPI_Tree_Filter_OperatorType, ResourceAPI_Tree_Filter_Property
11
11
  const treeFilter = {
12
12
  and(...children) {
13
13
  return {
14
- operator: ResourceAPI_Tree_Filter_OperatorType.AND,
14
+ operator: 4,
15
15
  value: {
16
16
  oneofKind: "filtersValue",
17
17
  filtersValue: { filters: children }
@@ -20,7 +20,7 @@ const treeFilter = {
20
20
  },
21
21
  or(...children) {
22
22
  return {
23
- operator: ResourceAPI_Tree_Filter_OperatorType.OR,
23
+ operator: 3,
24
24
  value: {
25
25
  oneofKind: "filtersValue",
26
26
  filtersValue: { filters: children }
@@ -29,78 +29,131 @@ const treeFilter = {
29
29
  },
30
30
  not(child) {
31
31
  return {
32
- operator: ResourceAPI_Tree_Filter_OperatorType.NOT,
32
+ operator: 5,
33
33
  value: {
34
34
  oneofKind: "filtersValue",
35
35
  filtersValue: { filters: [child] }
36
36
  }
37
37
  };
38
38
  },
39
+ /** Exact-match predicate on a string property. */
39
40
  eq(prop, value) {
40
41
  return {
41
42
  key: prop,
42
- operator: ResourceAPI_Tree_Filter_OperatorType.EQUAL,
43
+ operator: 1,
43
44
  value: {
44
45
  oneofKind: "stringValue",
45
46
  stringValue: value
46
47
  }
47
48
  };
48
49
  },
50
+ /** Regex-match predicate on a string property. */
49
51
  match(prop, pattern) {
50
52
  return {
51
53
  key: prop,
52
- operator: ResourceAPI_Tree_Filter_OperatorType.MATCH,
54
+ operator: 2,
53
55
  value: {
54
56
  oneofKind: "stringValue",
55
57
  stringValue: pattern
56
58
  }
57
59
  };
58
60
  },
61
+ /** Boolean-equality predicate. */
59
62
  boolEq(prop, value) {
60
63
  return {
61
64
  key: prop,
62
- operator: ResourceAPI_Tree_Filter_OperatorType.EQUAL,
65
+ operator: 1,
63
66
  value: {
64
67
  oneofKind: "boolValue",
65
68
  boolValue: value
66
69
  }
67
70
  };
68
71
  },
72
+ /** Match resources whose type string equals `name` exactly. */
69
73
  resourceTypeEq(name) {
70
- return treeFilter.eq(ResourceAPI_Tree_Filter_Property.RESOURCE_TYPE, name);
74
+ return treeFilter.eq(1, name);
71
75
  },
76
+ /** Match resources whose type string satisfies the regex `pattern`. */
72
77
  resourceTypeMatch(pattern) {
73
- return treeFilter.match(ResourceAPI_Tree_Filter_Property.RESOURCE_TYPE, pattern);
78
+ return treeFilter.match(1, pattern);
74
79
  },
80
+ /**
81
+ * Match field edges whose name equals `name` exactly.
82
+ * Valid only inside `fieldFilter`.
83
+ */
75
84
  fieldNameEq(name) {
76
- return treeFilter.eq(ResourceAPI_Tree_Filter_Property.FIELD_NAME, name);
85
+ return treeFilter.eq(0, name);
77
86
  },
87
+ /**
88
+ * Match field edges whose name satisfies the regex `pattern`.
89
+ * Valid only inside `fieldFilter`.
90
+ */
78
91
  fieldNameMatch(pattern) {
79
- return treeFilter.match(ResourceAPI_Tree_Filter_Property.FIELD_NAME, pattern);
92
+ return treeFilter.match(0, pattern);
80
93
  },
94
+ /**
95
+ * Match resources where `is_final == value`.
96
+ * Valid only inside `traverseStopRules`.
97
+ */
81
98
  isFinal(value) {
82
- return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.IS_FINAL, value);
99
+ return treeFilter.boolEq(2, value);
83
100
  },
101
+ /**
102
+ * Match resources where `all_outputs_final == value`.
103
+ * Valid only inside `traverseStopRules`.
104
+ */
84
105
  allOutputsFinal(value) {
85
- return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.ALL_OUTPUTS_FINAL, value);
106
+ return treeFilter.boolEq(3, value);
86
107
  },
108
+ /**
109
+ * Match resources where `resource_ready_for_calculation == value`.
110
+ * True when the resource is Original, inputs are locked, and all inputs are final.
111
+ * Valid only inside `traverseStopRules`.
112
+ */
87
113
  resourceReadyForCalculation(value) {
88
- return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.RESOURCE_READY_FOR_CALCULATION, value);
114
+ return treeFilter.boolEq(4, value);
89
115
  },
116
+ /**
117
+ * Match resources where `is_duplicate == value`.
118
+ * True when the resource has a non-zero original_resource_id.
119
+ * Valid only inside `traverseStopRules`.
120
+ */
90
121
  isDuplicate(value) {
91
- return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.IS_DUPLICATE, value);
92
- },
122
+ return treeFilter.boolEq(5, value);
123
+ },
124
+ /**
125
+ * Match resources where `has_errors == value`.
126
+ * True when the resource has at least one field carrying an error (aggregated
127
+ * has-error flag). Can be true even when the resource's own status is not
128
+ * Error (e.g., an Original resource with a failed input field).
129
+ * Valid only inside `traverseStopRules`.
130
+ */
93
131
  hasErrors(value) {
94
- return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.HAS_ERRORS, value);
132
+ return treeFilter.boolEq(6, value);
95
133
  },
134
+ /**
135
+ * Match resources where `outputs_locked == value`.
136
+ * Valid only inside `traverseStopRules`.
137
+ */
96
138
  outputsLocked(value) {
97
- return treeFilter.boolEq(ResourceAPI_Tree_Filter_Property.OUTPUTS_LOCKED, value);
98
- },
139
+ return treeFilter.boolEq(7, value);
140
+ },
141
+ /**
142
+ * Match resources that are ready-or-duplicate-or-error: mirrors the BFS
143
+ * `readyOrDuplicateOrError` predicate used by pl-tree to decide whether a
144
+ * resource subtree needs further polling.
145
+ *
146
+ * Use this as `traverseStopRules` to stop the server-side tree walk at
147
+ * exactly the same nodes where the client BFS would stop, eliminating
148
+ * unnecessary follow-up calls.
149
+ *
150
+ * Valid only inside `traverseStopRules`.
151
+ */
99
152
  readyOrDuplicateOrError() {
100
153
  return treeFilter.or(treeFilter.resourceReadyForCalculation(true), treeFilter.isDuplicate(true), treeFilter.hasErrors(true));
101
154
  }
102
155
  };
103
156
  //#endregion
104
- export { treeFilter };
157
+ export { ResourceAPI_Tree_Filter_OperatorType as FilterOperatorType, ResourceAPI_Tree_Filter_Property as FilterProperty, treeFilter };
105
158
 
106
159
  //# sourceMappingURL=tree_filter.js.map
@@ -1 +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"}
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;EACjC,OAAO;GACL,UAAA;GACA,OAAO;IAAE,WAAW;IAAgB,cAAc,EAAE,SAAS,SAAS;GAAE;EAC1E;CACF;CAEA,GAAG,GAAG,UAA4B;EAChC,OAAO;GACL,UAAA;GACA,OAAO;IAAE,WAAW;IAAgB,cAAc,EAAE,SAAS,SAAS;GAAE;EAC1E;CACF;CAEA,IAAI,OAAuB;EACzB,OAAO;GACL,UAAA;GACA,OAAO;IAAE,WAAW;IAAgB,cAAc,EAAE,SAAS,CAAC,KAAK,EAAE;GAAE;EACzE;CACF;;CAKA,GAAG,MAAgB,OAAuB;EACxC,OAAO;GACL,KAAK;GACL,UAAA;GACA,OAAO;IAAE,WAAW;IAAe,aAAa;GAAM;EACxD;CACF;;CAGA,MAAM,MAAgB,SAAyB;EAC7C,OAAO;GACL,KAAK;GACL,UAAA;GACA,OAAO;IAAE,WAAW;IAAe,aAAa;GAAQ;EAC1D;CACF;;CAGA,OAAO,MAAgB,OAAwB;EAC7C,OAAO;GACL,KAAK;GACL,UAAA;GACA,OAAO;IAAE,WAAW;IAAa,WAAW;GAAM;EACpD;CACF;;CAKA,eAAe,MAAsB;EACnC,OAAO,WAAW,GAAA,GAAmD,IAAI;CAC3E;;CAGA,kBAAkB,SAAyB;EACzC,OAAO,WAAW,MAAA,GAAsD,OAAO;CACjF;;;;;CAMA,YAAY,MAAsB;EAChC,OAAO,WAAW,GAAA,GAAgD,IAAI;CACxE;;;;;CAMA,eAAe,SAAyB;EACtC,OAAO,WAAW,MAAA,GAAmD,OAAO;CAC9E;;;;;CAMA,QAAQ,OAAwB;EAC9B,OAAO,WAAW,OAAA,GAAkD,KAAK;CAC3E;;;;;CAMA,gBAAgB,OAAwB;EACtC,OAAO,WAAW,OAAA,GAA2D,KAAK;CACpF;;;;;;CAOA,4BAA4B,OAAwB;EAClD,OAAO,WAAW,OAAA,GAEhB,KACF;CACF;;;;;;CAOA,YAAY,OAAwB;EAClC,OAAO,WAAW,OAAA,GAAsD,KAAK;CAC/E;;;;;;;;CASA,UAAU,OAAwB;EAChC,OAAO,WAAW,OAAA,GAAoD,KAAK;CAC7E;;;;;CAMA,cAAc,OAAwB;EACpC,OAAO,WAAW,OAAA,GAAwD,KAAK;CACjF;;;;;;;;;;;;CAaA,0BAAkC;EAChC,OAAO,WAAW,GAChB,WAAW,4BAA4B,IAAI,GAC3C,WAAW,YAAY,IAAI,GAC3B,WAAW,UAAU,IAAI,CAC3B;CACF;AACF"}
@@ -1,7 +1,6 @@
1
- require("../_virtual/_rolldown/runtime.cjs");
2
1
  const require_types = require("./types.cjs");
3
- const require_base_types = require("../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs");
4
- const require_api_types = require("../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs");
2
+ require("../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs");
3
+ require("../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs");
5
4
  const require_errors = require("./errors.cjs");
6
5
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
7
6
  //#region src/core/type_conversion.ts
@@ -32,8 +31,8 @@ function protoToResource(proto) {
32
31
  }
33
32
  function protoToResourceKind(proto) {
34
33
  switch (proto) {
35
- case require_api_types.Resource_Kind.STRUCTURAL: return "Structural";
36
- case require_api_types.Resource_Kind.VALUE: return "Value";
34
+ case 1: return "Structural";
35
+ case 2: return "Value";
37
36
  }
38
37
  throw new Error("invalid ResourceKind: " + proto);
39
38
  }
@@ -56,31 +55,31 @@ function protoToField(proto) {
56
55
  }
57
56
  function protoToFieldType(proto) {
58
57
  switch (proto) {
59
- case require_base_types.FieldType.INPUT: return "Input";
60
- case require_base_types.FieldType.OUTPUT: return "Output";
61
- case require_base_types.FieldType.SERVICE: return "Service";
62
- case require_base_types.FieldType.ONE_TIME_WRITABLE: return "OTW";
63
- case require_base_types.FieldType.DYNAMIC: return "Dynamic";
64
- case require_base_types.FieldType.MULTIPLE_TIMES_WRITABLE: return "MTW";
58
+ case 1: return "Input";
59
+ case 2: return "Output";
60
+ case 6: return "Service";
61
+ case 4: return "OTW";
62
+ case 3: return "Dynamic";
63
+ case 5: return "MTW";
65
64
  default: throw new Error("invalid FieldType: " + proto);
66
65
  }
67
66
  }
68
67
  function protoToFieldStatus(proto) {
69
68
  switch (proto) {
70
- case require_api_types.Field_ValueStatus.EMPTY: return "Empty";
71
- case require_api_types.Field_ValueStatus.ASSIGNED: return "Assigned";
72
- case require_api_types.Field_ValueStatus.RESOLVED: return "Resolved";
69
+ case 1: return "Empty";
70
+ case 2: return "Assigned";
71
+ case 3: return "Resolved";
73
72
  default: throw new Error("invalid FieldStatus: " + proto);
74
73
  }
75
74
  }
76
75
  function fieldTypeToProto(type) {
77
76
  switch (type) {
78
- case "Input": return require_base_types.FieldType.INPUT;
79
- case "Output": return require_base_types.FieldType.OUTPUT;
80
- case "Dynamic": return require_base_types.FieldType.DYNAMIC;
81
- case "Service": return require_base_types.FieldType.SERVICE;
82
- case "MTW": return require_base_types.FieldType.MULTIPLE_TIMES_WRITABLE;
83
- case "OTW": return require_base_types.FieldType.ONE_TIME_WRITABLE;
77
+ case "Input": return 1;
78
+ case "Output": return 2;
79
+ case "Dynamic": return 3;
80
+ case "Service": return 6;
81
+ case "MTW": return 5;
82
+ case "OTW": return 4;
84
83
  default: return (0, _milaboratories_ts_helpers.assertNever)(type);
85
84
  }
86
85
  }
@@ -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\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"}
1
+ {"version":3,"file":"type_conversion.cjs","names":["createSignedResourceId","toResourceSignature"],"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;CAC1D,OAAO,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,YAAY;AAC1E;AAEA,SAAS,4BAA4B,IAAY,WAAkD;CACjG,IAAI,OAAA,IAAuB,OAAA;CAC3B,OAAOA,cAAAA,uBAAuB,IAAIC,cAAAA,oBAAoB,SAAS,CAAC;AAClE;;AAGA,SAAgB,gBAAgB,OAA+B;CAC7D,IAAI,kBAAkB,KAAK,GAAG,eAAA,qBAAqB,kBAAkB;CACrE,OAAO;EACL,IAAID,cAAAA,uBAAuB,MAAM,YAAYC,cAAAA,oBAAoB,MAAM,iBAAiB,CAAC;EACzF,oBAAoB,4BAClB,MAAM,oBACN,MAAM,yBACR;EACA,OAAA,GAAA,2BAAA,SAAA,CAAe,MAAM,IAAI;EACzB,MAAM,MAAM;EACZ,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,eAAe,MAAM;EACrB,MAAM,oBAAoB,MAAM,IAAI;EACpC,OAAO,aAAa,KAAK;EACzB,OAAO,MAAM;EACb,QAAQ,MAAM,QAAQ,QAAQ,MAAM,EAAE,GAAI,cAAc,kBAAkB,CAAC,CAAC,IAAI,YAAY;CAC9F;AACF;AAEA,SAAS,oBAAoB,OAAoC;CAC/D,QAAQ,OAAR;EACE,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;CACX;CAEA,MAAM,IAAI,MAAM,2BAA2B,KAAK;AAClD;AAEA,SAAS,aAAa,OAA2C;CAC/D,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,GAAG,IAAI,cAAc,kBAAkB;CAC1E,IAAI,CAAC,GAAG,OAAA;CACR,MAAM,QAAQ,EAAE,SAAS;CACzB,IAAI,UAAU,IAAI,OAAA;CAClB,OAAOD,cAAAA,uBAAuB,OAAOC,cAAAA,oBAAoB,EAAE,cAAc,CAAC;AAC5E;AAEA,SAAgB,aAAa,OAAyB;CACpD,OAAO;EACL,OAAA,GAAA,2BAAA,SAAA,CAAe,MAAM,IAAI,SAAS;EAClC,MAAM,iBAAiB,MAAM,IAAI;EACjC,QAAQ,mBAAmB,MAAM,WAAW;EAC5C,OAAO,4BAA4B,MAAM,OAAO,MAAM,cAAc;EACpE,OAAO,4BAA4B,MAAM,OAAO,MAAM,cAAc;EACpE,cAAc,MAAM;CACtB;AACF;AAEA,SAAS,iBAAiB,OAAiC;CACzD,QAAQ,OAAR;EACE,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,SACE,MAAM,IAAI,MAAM,wBAAwB,KAAK;CACjD;AACF;AAEA,SAAS,mBAAmB,OAAuC;CACjE,QAAQ,OAAR;EACE,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,SACE,MAAM,IAAI,MAAM,0BAA0B,KAAK;CACnD;AACF;AAEA,SAAgB,iBAAiB,MAAgC;CAC/D,QAAQ,MAAR;EACE,KAAK,SACH,OAAA;EACF,KAAK,UACH,OAAA;EACF,KAAK,WACH,OAAA;EACF,KAAK,WACH,OAAA;EACF,KAAK,OACH,OAAA;EACF,KAAK,OACH,OAAA;EACF,SACE,QAAA,GAAA,2BAAA,YAAA,CAAmB,IAAI;CAC3B;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { createSignedResourceId, toResourceSignature } from "./types.js";
2
- import { FieldType } from "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js";
3
- import { Field_ValueStatus, Resource_Kind } from "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js";
2
+ import "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js";
3
+ import "../proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js";
4
4
  import { throwPlNotFoundError } from "./errors.js";
5
5
  import { assertNever, notEmpty } from "@milaboratories/ts-helpers";
6
6
  //#region src/core/type_conversion.ts
@@ -31,8 +31,8 @@ function protoToResource(proto) {
31
31
  }
32
32
  function protoToResourceKind(proto) {
33
33
  switch (proto) {
34
- case Resource_Kind.STRUCTURAL: return "Structural";
35
- case Resource_Kind.VALUE: return "Value";
34
+ case 1: return "Structural";
35
+ case 2: return "Value";
36
36
  }
37
37
  throw new Error("invalid ResourceKind: " + proto);
38
38
  }
@@ -55,31 +55,31 @@ function protoToField(proto) {
55
55
  }
56
56
  function protoToFieldType(proto) {
57
57
  switch (proto) {
58
- case FieldType.INPUT: return "Input";
59
- case FieldType.OUTPUT: return "Output";
60
- case FieldType.SERVICE: return "Service";
61
- case FieldType.ONE_TIME_WRITABLE: return "OTW";
62
- case FieldType.DYNAMIC: return "Dynamic";
63
- case FieldType.MULTIPLE_TIMES_WRITABLE: return "MTW";
58
+ case 1: return "Input";
59
+ case 2: return "Output";
60
+ case 6: return "Service";
61
+ case 4: return "OTW";
62
+ case 3: return "Dynamic";
63
+ case 5: return "MTW";
64
64
  default: throw new Error("invalid FieldType: " + proto);
65
65
  }
66
66
  }
67
67
  function protoToFieldStatus(proto) {
68
68
  switch (proto) {
69
- case Field_ValueStatus.EMPTY: return "Empty";
70
- case Field_ValueStatus.ASSIGNED: return "Assigned";
71
- case Field_ValueStatus.RESOLVED: return "Resolved";
69
+ case 1: return "Empty";
70
+ case 2: return "Assigned";
71
+ case 3: return "Resolved";
72
72
  default: throw new Error("invalid FieldStatus: " + proto);
73
73
  }
74
74
  }
75
75
  function fieldTypeToProto(type) {
76
76
  switch (type) {
77
- case "Input": return FieldType.INPUT;
78
- case "Output": return FieldType.OUTPUT;
79
- case "Dynamic": return FieldType.DYNAMIC;
80
- case "Service": return FieldType.SERVICE;
81
- case "MTW": return FieldType.MULTIPLE_TIMES_WRITABLE;
82
- case "OTW": return FieldType.ONE_TIME_WRITABLE;
77
+ case "Input": return 1;
78
+ case "Output": return 2;
79
+ case "Dynamic": return 3;
80
+ case "Service": return 6;
81
+ case "MTW": return 5;
82
+ case "OTW": return 4;
83
83
  default: return assertNever(type);
84
84
  }
85
85
  }
@@ -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\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"}
1
+ {"version":3,"file":"type_conversion.js","names":[],"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;CAC1D,OAAO,MAAM,gBAAgB,KAAA,KAAa,MAAM,YAAY,YAAY;AAC1E;AAEA,SAAS,4BAA4B,IAAY,WAAkD;CACjG,IAAI,OAAA,IAAuB,OAAA;CAC3B,OAAO,uBAAuB,IAAI,oBAAoB,SAAS,CAAC;AAClE;;AAGA,SAAgB,gBAAgB,OAA+B;CAC7D,IAAI,kBAAkB,KAAK,GAAG,qBAAqB,kBAAkB;CACrE,OAAO;EACL,IAAI,uBAAuB,MAAM,YAAY,oBAAoB,MAAM,iBAAiB,CAAC;EACzF,oBAAoB,4BAClB,MAAM,oBACN,MAAM,yBACR;EACA,MAAM,SAAS,MAAM,IAAI;EACzB,MAAM,MAAM;EACZ,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,eAAe,MAAM;EACrB,MAAM,oBAAoB,MAAM,IAAI;EACpC,OAAO,aAAa,KAAK;EACzB,OAAO,MAAM;EACb,QAAQ,MAAM,QAAQ,QAAQ,MAAM,EAAE,GAAI,cAAc,kBAAkB,CAAC,CAAC,IAAI,YAAY;CAC9F;AACF;AAEA,SAAS,oBAAoB,OAAoC;CAC/D,QAAQ,OAAR;EACE,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;CACX;CAEA,MAAM,IAAI,MAAM,2BAA2B,KAAK;AAClD;AAEA,SAAS,aAAa,OAA2C;CAC/D,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,GAAG,IAAI,cAAc,kBAAkB;CAC1E,IAAI,CAAC,GAAG,OAAA;CACR,MAAM,QAAQ,EAAE,SAAS;CACzB,IAAI,UAAU,IAAI,OAAA;CAClB,OAAO,uBAAuB,OAAO,oBAAoB,EAAE,cAAc,CAAC;AAC5E;AAEA,SAAgB,aAAa,OAAyB;CACpD,OAAO;EACL,MAAM,SAAS,MAAM,IAAI,SAAS;EAClC,MAAM,iBAAiB,MAAM,IAAI;EACjC,QAAQ,mBAAmB,MAAM,WAAW;EAC5C,OAAO,4BAA4B,MAAM,OAAO,MAAM,cAAc;EACpE,OAAO,4BAA4B,MAAM,OAAO,MAAM,cAAc;EACpE,cAAc,MAAM;CACtB;AACF;AAEA,SAAS,iBAAiB,OAAiC;CACzD,QAAQ,OAAR;EACE,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,SACE,MAAM,IAAI,MAAM,wBAAwB,KAAK;CACjD;AACF;AAEA,SAAS,mBAAmB,OAAuC;CACjE,QAAQ,OAAR;EACE,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,KAAA,GACE,OAAO;EACT,SACE,MAAM,IAAI,MAAM,0BAA0B,KAAK;CACnD;AACF;AAEA,SAAgB,iBAAiB,MAAgC;CAC/D,QAAQ,MAAR;EACE,KAAK,SACH,OAAA;EACF,KAAK,UACH,OAAA;EACF,KAAK,WACH,OAAA;EACF,KAAK,WACH,OAAA;EACF,KAAK,OACH,OAAA;EACF,KAAK,OACH,OAAA;EACF,SACE,OAAO,YAAY,IAAI;CAC3B;AACF"}
@@ -1,4 +1,3 @@
1
- require("../_virtual/_rolldown/runtime.cjs");
2
1
  let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
3
2
  //#region src/core/types.ts
4
3
  const NullResourceId = 0n;
@@ -138,7 +137,7 @@ function signatureToBase64Url(sig) {
138
137
  }
139
138
  /** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */
140
139
  function toResourceSignature(raw) {
141
- return raw && raw.length > 0 ? raw : new Uint8Array(0);
140
+ return raw && raw.length > 0 ? raw : /* @__PURE__ */ new Uint8Array(0);
142
141
  }
143
142
  /** Decode base64url-encoded string back to a branded ResourceSignature. */
144
143
  function base64UrlToSignature(str) {
@@ -162,7 +161,7 @@ function parseSignedResourceId(resourceId) {
162
161
  if (isNullSignedResourceId(globalId) || isLocalResourceId(globalId)) throw new Error(`Invalid global id portion in signed resource id: ${globalIdStr}`);
163
162
  return {
164
163
  globalId,
165
- signature: signatureHex.length > 0 ? Buffer.from(signatureHex, "hex") : new Uint8Array(0)
164
+ signature: signatureHex.length > 0 ? Buffer.from(signatureHex, "hex") : /* @__PURE__ */ new Uint8Array(0)
166
165
  };
167
166
  }
168
167
  //#endregion
@@ -1 +1 @@
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// Process-global switch. Set to false by LLPlClient.build() when the connected\n// backend predates resource signatures (~< 3.3.0). When false, asSignedResourceId\n// accepts ids minted with an empty signature. Single-backend-per-process only:\n// a Node process talking to mixed signed/unsigned backends will share last-wins\n// state. Desktop App is single-backend-per-process, so this is acceptable.\nlet resourceSignaturesRequired = true;\n\nexport function setResourceSignaturesRequired(required: boolean): void {\n resourceSignaturesRequired = required;\n}\n\n/** Validate a string as a SignedResourceId and return it with the branded type.\n * Requires the format \"<globalId>|<signatureHex>\". A non-empty signature is\n * required only when {@link areResourceSignaturesRequired} is true. */\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 (resourceSignaturesRequired && pipeIdx === str.length - 1)\n 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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"}
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// Process-global switch. Set to false by LLPlClient.build() when the connected\n// backend predates resource signatures (~< 3.3.0). When false, asSignedResourceId\n// accepts ids minted with an empty signature. Single-backend-per-process only:\n// a Node process talking to mixed signed/unsigned backends will share last-wins\n// state. Desktop App is single-backend-per-process, so this is acceptable.\nlet resourceSignaturesRequired = true;\n\nexport function setResourceSignaturesRequired(required: boolean): void {\n resourceSignaturesRequired = required;\n}\n\n/** Validate a string as a SignedResourceId and return it with the branded type.\n * Requires the format \"<globalId>|<signatureHex>\". A non-empty signature is\n * required only when {@link areResourceSignaturesRequired} is true. */\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 (resourceSignaturesRequired && pipeIdx === str.length - 1)\n 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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"}
@@ -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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"}
@@ -137,7 +137,7 @@ function signatureToBase64Url(sig) {
137
137
  }
138
138
  /** Cast raw bytes to a branded ResourceSignature, returning undefined for empty/missing input. */
139
139
  function toResourceSignature(raw) {
140
- return raw && raw.length > 0 ? raw : new Uint8Array(0);
140
+ return raw && raw.length > 0 ? raw : /* @__PURE__ */ new Uint8Array(0);
141
141
  }
142
142
  /** Decode base64url-encoded string back to a branded ResourceSignature. */
143
143
  function base64UrlToSignature(str) {
@@ -161,7 +161,7 @@ function parseSignedResourceId(resourceId) {
161
161
  if (isNullSignedResourceId(globalId) || isLocalResourceId(globalId)) throw new Error(`Invalid global id portion in signed resource id: ${globalIdStr}`);
162
162
  return {
163
163
  globalId,
164
- signature: signatureHex.length > 0 ? Buffer.from(signatureHex, "hex") : new Uint8Array(0)
164
+ signature: signatureHex.length > 0 ? Buffer.from(signatureHex, "hex") : /* @__PURE__ */ new Uint8Array(0)
165
165
  };
166
166
  }
167
167
  //#endregion