@shipfox/expression 2.0.0 → 2.2.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 (53) hide show
  1. package/README.md +20 -8
  2. package/dist/evaluator/errors.d.ts.map +1 -1
  3. package/dist/evaluator/evaluate-workflow-expression.d.ts +3 -4
  4. package/dist/evaluator/evaluate-workflow-expression.d.ts.map +1 -1
  5. package/dist/evaluator/evaluate-workflow-expression.js +5 -5
  6. package/dist/evaluator/evaluate-workflow-expression.js.map +1 -1
  7. package/dist/evaluator/index.d.ts +3 -0
  8. package/dist/evaluator/index.d.ts.map +1 -1
  9. package/dist/evaluator/index.js +3 -0
  10. package/dist/evaluator/index.js.map +1 -1
  11. package/dist/evaluator/range.d.ts +2 -3
  12. package/dist/evaluator/range.d.ts.map +1 -1
  13. package/dist/evaluator/range.js +4 -43
  14. package/dist/evaluator/range.js.map +1 -1
  15. package/dist/evaluator/rehydrate-json-expression.d.ts +4 -0
  16. package/dist/evaluator/rehydrate-json-expression.d.ts.map +1 -0
  17. package/dist/evaluator/rehydrate-json-expression.js +44 -0
  18. package/dist/evaluator/rehydrate-json-expression.js.map +1 -0
  19. package/dist/evaluator/workflow-environment.d.ts +3 -0
  20. package/dist/evaluator/workflow-environment.d.ts.map +1 -0
  21. package/dist/evaluator/workflow-environment.js +17 -0
  22. package/dist/evaluator/workflow-environment.js.map +1 -0
  23. package/dist/expression/create-workflow-expression.d.ts.map +1 -1
  24. package/dist/expression/create-workflow-expression.js +48 -12
  25. package/dist/expression/create-workflow-expression.js.map +1 -1
  26. package/dist/expression/errors.d.ts.map +1 -1
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +3 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/json.d.ts +2 -0
  32. package/dist/json.d.ts.map +1 -0
  33. package/dist/json.js +7 -0
  34. package/dist/json.js.map +1 -0
  35. package/dist/plan/context-key-access.d.ts.map +1 -1
  36. package/dist/plan/context-key-access.js +7 -4
  37. package/dist/plan/context-key-access.js.map +1 -1
  38. package/dist/resolver/coerce-workflow-value-to-string.d.ts.map +1 -1
  39. package/dist/resolver/coerce-workflow-value-to-string.js +1 -5
  40. package/dist/resolver/coerce-workflow-value-to-string.js.map +1 -1
  41. package/dist/resolver/errors.d.ts.map +1 -1
  42. package/dist/run/hoist-run-command.d.ts.map +1 -1
  43. package/dist/template/errors.d.ts.map +1 -1
  44. package/dist/tsconfig.test.tsbuildinfo +1 -1
  45. package/dist/workflow-context/workflow-context-docs.d.ts +125 -125
  46. package/dist/workflow-context/workflow-context-docs.d.ts.map +1 -1
  47. package/dist/workflow-context/workflow-context.d.ts +183 -183
  48. package/dist/workflow-context/workflow-context.d.ts.map +1 -1
  49. package/dist/workflow-function-registry.d.ts +21 -0
  50. package/dist/workflow-function-registry.d.ts.map +1 -0
  51. package/dist/workflow-function-registry.js +133 -0
  52. package/dist/workflow-function-registry.js.map +1 -0
  53. package/package.json +2 -2
@@ -0,0 +1,133 @@
1
+ import { stringifyBigint } from './json.js';
2
+ /** Maximum number of values one evaluation's range calls may materialize. */ export const MAX_RANGE_ELEMENTS = 1_000;
3
+ /** Maximum context-byte fan-out one evaluation's range calls may represent. */ export const MAX_RANGE_FANOUT_BYTES = 1_000_000;
4
+ /** Maximum UTF-8 bytes returned by toJson() calls in one evaluation. */ export const MAX_JSON_OUTPUT_BYTES = 1_000_000;
5
+ const utf8Encoder = new TextEncoder();
6
+ const RANGE_FUNCTION_SIGNATURE = 'range(dyn, dyn, dyn): list<int>';
7
+ const TO_JSON_FUNCTION_SIGNATURE = 'toJson(dyn): string';
8
+ const FROM_JSON_FUNCTION_SIGNATURE = 'fromJson(string): dyn';
9
+ const workflowFunctionRegistry = [
10
+ {
11
+ signature: RANGE_FUNCTION_SIGNATURE,
12
+ createHandler: (budget)=>(start, stop, step)=>evaluateRange(budget, start, stop, step)
13
+ },
14
+ {
15
+ signature: TO_JSON_FUNCTION_SIGNATURE,
16
+ createHandler: (budget)=>(value)=>serializeJson(budget, value)
17
+ },
18
+ {
19
+ signature: FROM_JSON_FUNCTION_SIGNATURE,
20
+ createHandler: ()=>(value)=>{
21
+ if (typeof value !== 'string') throw new TypeError('fromJson() expects a JSON string');
22
+ return JSON.parse(value, reviveJsonNumber);
23
+ }
24
+ }
25
+ ];
26
+ /**
27
+ * Register the shared functions and return the budgets their handlers close over.
28
+ *
29
+ * Callers that reuse one environment across evaluations must wrap each evaluation
30
+ * in `isolate` so it gets a full budget without consuming an enclosing one. A
31
+ * context accessor can re-enter the evaluator, so the enclosing budget is
32
+ * restored rather than reset.
33
+ */ export function registerWorkflowFunctions(environment) {
34
+ const budget = {
35
+ remainingRangeElements: MAX_RANGE_ELEMENTS,
36
+ remainingRangeFanoutBytes: MAX_RANGE_FANOUT_BYTES,
37
+ remainingJsonOutputBytes: MAX_JSON_OUTPUT_BYTES,
38
+ context: undefined,
39
+ contextBytes: undefined
40
+ };
41
+ for (const definition of workflowFunctionRegistry){
42
+ environment.registerFunction(definition.signature, definition.createHandler(budget));
43
+ }
44
+ return {
45
+ isolate (context, evaluation) {
46
+ const enclosing = {
47
+ rangeElements: budget.remainingRangeElements,
48
+ rangeFanoutBytes: budget.remainingRangeFanoutBytes,
49
+ jsonOutputBytes: budget.remainingJsonOutputBytes,
50
+ context: budget.context,
51
+ contextBytes: budget.contextBytes
52
+ };
53
+ budget.remainingRangeElements = MAX_RANGE_ELEMENTS;
54
+ budget.remainingRangeFanoutBytes = MAX_RANGE_FANOUT_BYTES;
55
+ budget.remainingJsonOutputBytes = MAX_JSON_OUTPUT_BYTES;
56
+ budget.context = context;
57
+ budget.contextBytes = undefined;
58
+ try {
59
+ return evaluation();
60
+ } finally{
61
+ budget.remainingRangeElements = enclosing.rangeElements;
62
+ budget.remainingRangeFanoutBytes = enclosing.rangeFanoutBytes;
63
+ budget.remainingJsonOutputBytes = enclosing.jsonOutputBytes;
64
+ budget.context = enclosing.context;
65
+ budget.contextBytes = enclosing.contextBytes;
66
+ }
67
+ }
68
+ };
69
+ }
70
+ function materializeRange(start, stop, step) {
71
+ const values = [];
72
+ for(let value = start; value <= stop; value += step)values.push(value);
73
+ return values;
74
+ }
75
+ function rangeElementCount(start, stop, step) {
76
+ if (step <= 0n) throw new RangeError('range step must be positive');
77
+ if (start > stop) return 0n;
78
+ return (stop - start) / step + 1n;
79
+ }
80
+ function toCelInteger(value, name) {
81
+ if (typeof value === 'bigint') return value;
82
+ if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value);
83
+ throw new RangeError(`${name} must be a safe integer`);
84
+ }
85
+ function evaluateRange(budget, start, stop, step) {
86
+ const startValue = toCelInteger(start, 'range start');
87
+ const stopValue = toCelInteger(stop, 'range stop');
88
+ const stepValue = toCelInteger(step, 'range step');
89
+ const count = rangeElementCount(startValue, stopValue, stepValue);
90
+ if (count > BigInt(budget.remainingRangeElements)) {
91
+ throw new RangeError(`range evaluation budget exceeded; ${count} elements requested with ${budget.remainingRangeElements} remaining`);
92
+ }
93
+ const contextBytes = getContextBytes(budget);
94
+ const fanoutBytes = count * BigInt(contextBytes);
95
+ if (fanoutBytes > BigInt(budget.remainingRangeFanoutBytes)) {
96
+ throw new RangeError(`range fan-out budget exceeded; ${count} elements requested for ${contextBytes} context bytes with ${budget.remainingRangeFanoutBytes} remaining`);
97
+ }
98
+ const values = materializeRange(startValue, stopValue, stepValue);
99
+ budget.remainingRangeElements -= values.length;
100
+ budget.remainingRangeFanoutBytes -= Number(fanoutBytes);
101
+ return values;
102
+ }
103
+ function getContextBytes(budget) {
104
+ if (budget.contextBytes !== undefined) return budget.contextBytes;
105
+ try {
106
+ const json = JSON.stringify(budget.context, stringifyBigint);
107
+ if (json === undefined) {
108
+ budget.contextBytes = 0;
109
+ return 0;
110
+ }
111
+ budget.contextBytes = Math.min(MAX_RANGE_FANOUT_BYTES + 1, utf8Encoder.encode(json).byteLength);
112
+ return budget.contextBytes;
113
+ } catch {
114
+ // A context that cannot be serialized is not safe to fan out over.
115
+ budget.contextBytes = MAX_RANGE_FANOUT_BYTES + 1;
116
+ return budget.contextBytes;
117
+ }
118
+ }
119
+ function serializeJson(budget, value) {
120
+ const json = JSON.stringify(value, stringifyBigint);
121
+ if (json === undefined) throw new TypeError('toJson() value must be JSON-serializable');
122
+ const outputBytes = utf8Encoder.encode(json).byteLength;
123
+ if (outputBytes > budget.remainingJsonOutputBytes) {
124
+ throw new RangeError(`toJson evaluation budget exceeded; ${outputBytes} bytes requested with ${budget.remainingJsonOutputBytes} remaining`);
125
+ }
126
+ budget.remainingJsonOutputBytes -= outputBytes;
127
+ return json;
128
+ }
129
+ function reviveJsonNumber(_key, value) {
130
+ return typeof value === 'number' && Number.isSafeInteger(value) ? BigInt(value) : value;
131
+ }
132
+
133
+ //# sourceMappingURL=workflow-function-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/workflow-function-registry.ts"],"sourcesContent":["import type {Environment, RegisteredFunctionHandler} from '@marcbachmann/cel-js';\nimport {stringifyBigint} from './json.js';\n\n/** Maximum number of values one evaluation's range calls may materialize. */\nexport const MAX_RANGE_ELEMENTS = 1_000;\n\n/** Maximum context-byte fan-out one evaluation's range calls may represent. */\nexport const MAX_RANGE_FANOUT_BYTES = 1_000_000;\n\n/** Maximum UTF-8 bytes returned by toJson() calls in one evaluation. */\nexport const MAX_JSON_OUTPUT_BYTES = 1_000_000;\n\nconst utf8Encoder = new TextEncoder();\n\nconst RANGE_FUNCTION_SIGNATURE = 'range(dyn, dyn, dyn): list<int>';\nconst TO_JSON_FUNCTION_SIGNATURE = 'toJson(dyn): string';\nconst FROM_JSON_FUNCTION_SIGNATURE = 'fromJson(string): dyn';\n\ninterface WorkflowFunctionBudget {\n remainingRangeElements: number;\n remainingRangeFanoutBytes: number;\n remainingJsonOutputBytes: number;\n context: unknown;\n contextBytes: number | undefined;\n}\n\n/** Per-evaluation budgets held by the handlers registered on an environment. */\nexport interface WorkflowFunctionBudgets {\n isolate<T>(context: unknown, evaluation: () => T): T;\n}\n\ninterface WorkflowFunctionDefinition {\n readonly signature: string;\n readonly createHandler: (budget: WorkflowFunctionBudget) => RegisteredFunctionHandler;\n}\n\nconst workflowFunctionRegistry = [\n {\n signature: RANGE_FUNCTION_SIGNATURE,\n createHandler:\n (budget: WorkflowFunctionBudget): RegisteredFunctionHandler =>\n (start: unknown, stop: unknown, step: unknown) =>\n evaluateRange(budget, start, stop, step),\n },\n {\n signature: TO_JSON_FUNCTION_SIGNATURE,\n createHandler:\n (budget: WorkflowFunctionBudget): RegisteredFunctionHandler =>\n (value: unknown) =>\n serializeJson(budget, value),\n },\n {\n signature: FROM_JSON_FUNCTION_SIGNATURE,\n createHandler: (): RegisteredFunctionHandler => (value: unknown) => {\n if (typeof value !== 'string') throw new TypeError('fromJson() expects a JSON string');\n return JSON.parse(value, reviveJsonNumber) as unknown;\n },\n },\n] satisfies readonly WorkflowFunctionDefinition[];\n\n/**\n * Register the shared functions and return the budgets their handlers close over.\n *\n * Callers that reuse one environment across evaluations must wrap each evaluation\n * in `isolate` so it gets a full budget without consuming an enclosing one. A\n * context accessor can re-enter the evaluator, so the enclosing budget is\n * restored rather than reset.\n */\nexport function registerWorkflowFunctions(environment: Environment): WorkflowFunctionBudgets {\n const budget: WorkflowFunctionBudget = {\n remainingRangeElements: MAX_RANGE_ELEMENTS,\n remainingRangeFanoutBytes: MAX_RANGE_FANOUT_BYTES,\n remainingJsonOutputBytes: MAX_JSON_OUTPUT_BYTES,\n context: undefined,\n contextBytes: undefined,\n };\n for (const definition of workflowFunctionRegistry) {\n environment.registerFunction(definition.signature, definition.createHandler(budget));\n }\n\n return {\n isolate<T>(context: unknown, evaluation: () => T): T {\n const enclosing = {\n rangeElements: budget.remainingRangeElements,\n rangeFanoutBytes: budget.remainingRangeFanoutBytes,\n jsonOutputBytes: budget.remainingJsonOutputBytes,\n context: budget.context,\n contextBytes: budget.contextBytes,\n };\n budget.remainingRangeElements = MAX_RANGE_ELEMENTS;\n budget.remainingRangeFanoutBytes = MAX_RANGE_FANOUT_BYTES;\n budget.remainingJsonOutputBytes = MAX_JSON_OUTPUT_BYTES;\n budget.context = context;\n budget.contextBytes = undefined;\n try {\n return evaluation();\n } finally {\n budget.remainingRangeElements = enclosing.rangeElements;\n budget.remainingRangeFanoutBytes = enclosing.rangeFanoutBytes;\n budget.remainingJsonOutputBytes = enclosing.jsonOutputBytes;\n budget.context = enclosing.context;\n budget.contextBytes = enclosing.contextBytes;\n }\n },\n };\n}\n\nfunction materializeRange(start: bigint, stop: bigint, step: bigint): bigint[] {\n const values: bigint[] = [];\n for (let value = start; value <= stop; value += step) values.push(value);\n return values;\n}\n\nfunction rangeElementCount(start: bigint, stop: bigint, step: bigint): bigint {\n if (step <= 0n) throw new RangeError('range step must be positive');\n if (start > stop) return 0n;\n\n return (stop - start) / step + 1n;\n}\n\nfunction toCelInteger(value: unknown, name: string): bigint {\n if (typeof value === 'bigint') return value;\n if (typeof value === 'number' && Number.isSafeInteger(value)) return BigInt(value);\n throw new RangeError(`${name} must be a safe integer`);\n}\n\nfunction evaluateRange(\n budget: WorkflowFunctionBudget,\n start: unknown,\n stop: unknown,\n step: unknown,\n): bigint[] {\n const startValue = toCelInteger(start, 'range start');\n const stopValue = toCelInteger(stop, 'range stop');\n const stepValue = toCelInteger(step, 'range step');\n const count = rangeElementCount(startValue, stopValue, stepValue);\n if (count > BigInt(budget.remainingRangeElements)) {\n throw new RangeError(\n `range evaluation budget exceeded; ${count} elements requested with ${budget.remainingRangeElements} remaining`,\n );\n }\n\n const contextBytes = getContextBytes(budget);\n const fanoutBytes = count * BigInt(contextBytes);\n if (fanoutBytes > BigInt(budget.remainingRangeFanoutBytes)) {\n throw new RangeError(\n `range fan-out budget exceeded; ${count} elements requested for ${contextBytes} context bytes with ${budget.remainingRangeFanoutBytes} remaining`,\n );\n }\n\n const values = materializeRange(startValue, stopValue, stepValue);\n budget.remainingRangeElements -= values.length;\n budget.remainingRangeFanoutBytes -= Number(fanoutBytes);\n return values;\n}\n\nfunction getContextBytes(budget: WorkflowFunctionBudget): number {\n if (budget.contextBytes !== undefined) return budget.contextBytes;\n\n try {\n const json = JSON.stringify(budget.context, stringifyBigint);\n if (json === undefined) {\n budget.contextBytes = 0;\n return 0;\n }\n\n budget.contextBytes = Math.min(MAX_RANGE_FANOUT_BYTES + 1, utf8Encoder.encode(json).byteLength);\n return budget.contextBytes;\n } catch {\n // A context that cannot be serialized is not safe to fan out over.\n budget.contextBytes = MAX_RANGE_FANOUT_BYTES + 1;\n return budget.contextBytes;\n }\n}\n\nfunction serializeJson(budget: WorkflowFunctionBudget, value: unknown): string {\n const json = JSON.stringify(value, stringifyBigint);\n if (json === undefined) throw new TypeError('toJson() value must be JSON-serializable');\n\n const outputBytes = utf8Encoder.encode(json).byteLength;\n if (outputBytes > budget.remainingJsonOutputBytes) {\n throw new RangeError(\n `toJson evaluation budget exceeded; ${outputBytes} bytes requested with ${budget.remainingJsonOutputBytes} remaining`,\n );\n }\n\n budget.remainingJsonOutputBytes -= outputBytes;\n return json;\n}\n\nfunction reviveJsonNumber(_key: string, value: unknown): unknown {\n return typeof value === 'number' && Number.isSafeInteger(value) ? BigInt(value) : value;\n}\n"],"names":["stringifyBigint","MAX_RANGE_ELEMENTS","MAX_RANGE_FANOUT_BYTES","MAX_JSON_OUTPUT_BYTES","utf8Encoder","TextEncoder","RANGE_FUNCTION_SIGNATURE","TO_JSON_FUNCTION_SIGNATURE","FROM_JSON_FUNCTION_SIGNATURE","workflowFunctionRegistry","signature","createHandler","budget","start","stop","step","evaluateRange","value","serializeJson","TypeError","JSON","parse","reviveJsonNumber","registerWorkflowFunctions","environment","remainingRangeElements","remainingRangeFanoutBytes","remainingJsonOutputBytes","context","undefined","contextBytes","definition","registerFunction","isolate","evaluation","enclosing","rangeElements","rangeFanoutBytes","jsonOutputBytes","materializeRange","values","push","rangeElementCount","RangeError","toCelInteger","name","Number","isSafeInteger","BigInt","startValue","stopValue","stepValue","count","getContextBytes","fanoutBytes","length","json","stringify","Math","min","encode","byteLength","outputBytes","_key"],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@shipfox/expression",
3
3
  "license": "MIT",
4
4
  "private": false,
5
- "version": "2.0.0",
5
+ "version": "2.2.0",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/ShipfoxHQ/shipfox.git",
@@ -23,7 +23,7 @@
23
23
  "dependencies": {
24
24
  "@marcbachmann/cel-js": "7.6.1",
25
25
  "ajv": "^8.20.0",
26
- "@shipfox/workflow-document": "3.0.0"
26
+ "@shipfox/workflow-document": "3.0.1"
27
27
  },
28
28
  "shipfox": {
29
29
  "architecture": {