@divmain/jdm-asm 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2227 -29
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/.github/workflows/ci.yml +0 -53
- package/.oxfmtrc.json +0 -16
- package/.oxlintrc.json +0 -183
- package/AGENTS.md +0 -81
- package/asconfig.json +0 -23
- package/benchmarks/fixtures.ts +0 -111
- package/benchmarks/input-fixtures.ts +0 -80
- package/benchmarks/run.ts +0 -913
- package/benchmarks/worker-pool.ts +0 -223
- package/benchmarks/worker.ts +0 -374
- package/scripts/run-all-tests.ts +0 -220
- package/src/compiler/EXPRESSION_SUBSETS.md +0 -228
- package/src/compiler/asc-compiler.ts +0 -315
- package/src/compiler/ast-types.ts +0 -215
- package/src/compiler/build.ts +0 -56
- package/src/compiler/cache.ts +0 -414
- package/src/compiler/code-generators.ts +0 -211
- package/src/compiler/codegen/index.ts +0 -15
- package/src/compiler/codegen/js-marshal.ts +0 -999
- package/src/compiler/codegen/js-validation.ts +0 -243
- package/src/compiler/codegen.ts +0 -19
- package/src/compiler/compile-time-validation.ts +0 -507
- package/src/compiler/cst-visitor.ts +0 -434
- package/src/compiler/errors.ts +0 -227
- package/src/compiler/expression-parser.ts +0 -536
- package/src/compiler/graph.ts +0 -197
- package/src/compiler/index.ts +0 -199
- package/src/compiler/input-validation.ts +0 -33
- package/src/compiler/marshal-gen.ts +0 -21
- package/src/compiler/nodes/context-resolvers.ts +0 -197
- package/src/compiler/nodes/decision-table.ts +0 -507
- package/src/compiler/nodes/decision.ts +0 -292
- package/src/compiler/nodes/expression-compiler.ts +0 -526
- package/src/compiler/nodes/expression.ts +0 -425
- package/src/compiler/nodes/function.ts +0 -316
- package/src/compiler/nodes/input.ts +0 -60
- package/src/compiler/nodes/switch.ts +0 -547
- package/src/compiler/optimizer.ts +0 -948
- package/src/compiler/orchestrator.ts +0 -352
- package/src/compiler/parser.ts +0 -115
- package/src/compiler/result-selection.ts +0 -161
- package/src/compiler/runtime/index.ts +0 -26
- package/src/compiler/runtime-codegen.ts +0 -211
- package/src/compiler/runtime-validation-codegen.ts +0 -294
- package/src/compiler/runtime.ts +0 -452
- package/src/compiler/schema.ts +0 -245
- package/src/compiler/switch-branch-detection.ts +0 -92
- package/src/compiler/types.ts +0 -136
- package/src/compiler/unary-ast-transforms.ts +0 -148
- package/src/compiler/unary-parser.ts +0 -301
- package/src/compiler/unary-transform.ts +0 -161
- package/src/compiler/utils.ts +0 -27
- package/src/compiler/virtual-fs.ts +0 -90
- package/src/compiler/wasm-instantiate.ts +0 -127
- package/src/index.ts +0 -1
- package/src/runtime/arrays.ts +0 -579
- package/src/runtime/context.ts +0 -189
- package/src/runtime/expressions.ts +0 -1811
- package/src/runtime/index.ts +0 -8
- package/src/runtime/memory.ts +0 -607
- package/src/runtime/strings.ts +0 -260
- package/src/runtime/tables.ts +0 -96
- package/src/runtime/tsconfig.json +0 -4
- package/src/runtime/values.ts +0 -209
- package/test-data/README.md +0 -83
- package/test-data/decision-tables/basic/8k.json +0 -87992
- package/test-data/decision-tables/basic/affiliate-commission-calculator.json +0 -228
- package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +0 -285
- package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +0 -466
- package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +0 -412
- package/test-data/decision-tables/basic/booking-personalization-system.json +0 -553
- package/test-data/decision-tables/basic/care-team-assignment-system.json +0 -585
- package/test-data/decision-tables/basic/claim-validation-system.json +0 -307
- package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +0 -433
- package/test-data/decision-tables/basic/clinical-treatment-protocol.json +0 -474
- package/test-data/decision-tables/basic/credit-limit-adjustment.json +0 -479
- package/test-data/decision-tables/basic/customer-eligibility-engine.json +0 -551
- package/test-data/decision-tables/basic/customer-lifetime-value.json +0 -200
- package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/decision-tables/basic/customer-service-escalation.json +0 -191
- package/test-data/decision-tables/basic/decision-table-discounts.json +0 -168
- package/test-data/decision-tables/basic/decision-table-shipping.json +0 -398
- package/test-data/decision-tables/basic/delivery-route-optimizer.json +0 -271
- package/test-data/decision-tables/basic/device-compatibility-checker.json +0 -303
- package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +0 -296
- package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +0 -289
- package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +0 -325
- package/test-data/decision-tables/basic/empty-column-with-space.json +0 -100
- package/test-data/decision-tables/basic/empty-column-without-space.json +0 -100
- package/test-data/decision-tables/basic/environment-compliance-assessment.json +0 -386
- package/test-data/decision-tables/basic/expression-table-map.json +0 -313
- package/test-data/decision-tables/basic/flash-sale-eligibility.json +0 -366
- package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +0 -455
- package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/decision-tables/basic/government-assistance.json +0 -299
- package/test-data/decision-tables/basic/grant-funding-distribution.json +0 -307
- package/test-data/decision-tables/basic/hazardous-materials-management-system.json +0 -414
- package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +0 -765
- package/test-data/decision-tables/basic/import-duties-calculator.json +0 -318
- package/test-data/decision-tables/basic/insurance-agent-commission.json +0 -228
- package/test-data/decision-tables/basic/insurance-coverage-calculator.json +0 -362
- package/test-data/decision-tables/basic/insurance-underwriting-risk.json +0 -321
- package/test-data/decision-tables/basic/international-roaming-policy-manager.json +0 -199
- package/test-data/decision-tables/basic/legacy-plan-management.json +0 -434
- package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +0 -334
- package/test-data/decision-tables/basic/medication-dosage-calculator.json +0 -318
- package/test-data/decision-tables/basic/merch-bags.json +0 -171
- package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +0 -364
- package/test-data/decision-tables/basic/mvno-partner-enablement.json +0 -313
- package/test-data/decision-tables/basic/partner-revenue-sharing.json +0 -244
- package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/decision-tables/basic/policy-discount-calculator.json +0 -307
- package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +0 -299
- package/test-data/decision-tables/basic/product-listing-scoring.json +0 -358
- package/test-data/decision-tables/basic/realtime-fraud-detection.json +0 -235
- package/test-data/decision-tables/basic/regional-compliance-manager.json +0 -278
- package/test-data/decision-tables/basic/returns-and-refund-policy.json +0 -366
- package/test-data/decision-tables/basic/returns-processing-system.json +0 -448
- package/test-data/decision-tables/basic/school-district-resource-allocation.json +0 -282
- package/test-data/decision-tables/basic/seat-map-optimization.json +0 -325
- package/test-data/decision-tables/basic/seller-fee-calculator.json +0 -307
- package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +0 -575
- package/test-data/decision-tables/basic/smart-financial-product-matcher.json +0 -249
- package/test-data/decision-tables/basic/supply-chain-risk.json +0 -316
- package/test-data/decision-tables/basic/table-loop.json +0 -93
- package/test-data/decision-tables/basic/table.json +0 -76
- package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/decision-tables/basic/transaction-compliance-classifier.json +0 -525
- package/test-data/decision-tables/basic/vehicle-claims-resolution.json +0 -310
- package/test-data/decision-tables/basic/warehouse-storage-location.json +0 -345
- package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +0 -127
- package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-first/first-match.json +0 -103
- package/test-data/decision-tables/hit-policy-first/no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +0 -94
- package/test-data/decision-tables/hit-policy-priority/priority-respected.json +0 -86
- package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-unique/all-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/no-match.json +0 -88
- package/test-data/decision-tables/hit-policy-unique/unique-match.json +0 -99
- package/test-data/expressions/arithmetic/error-cyclic.json +0 -114
- package/test-data/expressions/arithmetic/error-missing-input.json +0 -54
- package/test-data/expressions/arithmetic/error-missing-output.json +0 -54
- package/test-data/expressions/arithmetic/expression-default.json +0 -93
- package/test-data/expressions/arithmetic/expression-fields.json +0 -94
- package/test-data/expressions/arithmetic/expression-loop.json +0 -94
- package/test-data/expressions/arithmetic/expression-passthrough.json +0 -108
- package/test-data/expressions/arithmetic/expression.json +0 -69
- package/test-data/expressions/arithmetic/nested-request.json +0 -125
- package/test-data/expressions/arithmetic/number-function.json +0 -58
- package/test-data/expressions/arithmetic/test-number-functions.json +0 -68
- package/test-data/expressions/functions/all.json +0 -149
- package/test-data/expressions/functions/avg.json +0 -89
- package/test-data/expressions/functions/filter.json +0 -109
- package/test-data/expressions/functions/flat.json +0 -167
- package/test-data/expressions/functions/map-strings.json +0 -65
- package/test-data/expressions/functions/map.json +0 -73
- package/test-data/expressions/functions/reduce.json +0 -49
- package/test-data/expressions/functions/some.json +0 -175
- package/test-data/expressions/functions/sort-strings.json +0 -97
- package/test-data/expressions/functions/sort.json +0 -97
- package/test-data/expressions/logical/logical-and.json +0 -116
- package/test-data/expressions/logical/logical-complex.json +0 -260
- package/test-data/expressions/logical/logical-not.json +0 -111
- package/test-data/expressions/logical/logical-or.json +0 -123
- package/test-data/expressions/string/string-comparison.json +0 -128
- package/test-data/expressions/string/string-concat.json +0 -106
- package/test-data/expressions/string/string-contains.json +0 -125
- package/test-data/expressions/string/string-endsWith.json +0 -113
- package/test-data/expressions/string/string-indexOf.json +0 -131
- package/test-data/expressions/string/string-join.json +0 -92
- package/test-data/expressions/string/string-lower.json +0 -94
- package/test-data/expressions/string/string-replace.json +0 -130
- package/test-data/expressions/string/string-split.json +0 -101
- package/test-data/expressions/string/string-startsWith.json +0 -113
- package/test-data/expressions/string/string-substring.json +0 -138
- package/test-data/expressions/string/string-trim.json +0 -100
- package/test-data/expressions/string/string-upper.json +0 -94
- package/test-data/other/custom.json +0 -51
- package/test-data/other/customer-input-schema.json +0 -34
- package/test-data/other/customer-output-schema.json +0 -34
- package/test-data/other/passthrough.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-child.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-parent.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table1.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table2.json +0 -49
- package/test-data/sub-decisions/complex-multi/approval-decision.json +0 -31
- package/test-data/sub-decisions/complex-multi/complex-dag.json +0 -175
- package/test-data/sub-decisions/complex-multi/credit-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/customer-segmentation.json +0 -31
- package/test-data/sub-decisions/complex-multi/discount-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/eligibility-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/final-offer.json +0 -31
- package/test-data/sub-decisions/complex-multi/income-verification.json +0 -31
- package/test-data/sub-decisions/complex-multi/linear-chain.json +0 -121
- package/test-data/sub-decisions/complex-multi/pricing-calculation.json +0 -31
- package/test-data/sub-decisions/complex-multi/product-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/risk-assessment.json +0 -31
- package/test-data/sub-decisions/complex-multi/shared-validation.json +0 -31
- package/test-data/sub-decisions/complex-multi/validation.json +0 -31
- package/test-data/sub-decisions/diamond/decision-a.json +0 -31
- package/test-data/sub-decisions/diamond/decision-b.json +0 -31
- package/test-data/sub-decisions/diamond/decision-c.json +0 -31
- package/test-data/sub-decisions/diamond/decision-shared.json +0 -31
- package/test-data/sub-decisions/diamond/diamond-pattern.json +0 -109
- package/test-data/sub-decisions/error-propagation/parent-calls-error.json +0 -44
- package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +0 -60
- package/test-data/switch-nodes/basic/account-dormancy-management.json +0 -245
- package/test-data/switch-nodes/basic/application-risk-assessment.json +0 -474
- package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +0 -281
- package/test-data/switch-nodes/basic/clinical-pathway-selection.json +0 -454
- package/test-data/switch-nodes/basic/insurance-prior-authorization.json +0 -467
- package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +0 -373
- package/test-data/switch-nodes/basic/loan-approval.json +0 -469
- package/test-data/switch-nodes/basic/multi-switch.json +0 -498
- package/test-data/switch-nodes/basic/online-checkin-eligibility.json +0 -285
- package/test-data/switch-nodes/basic/order-consolidation-system.json +0 -493
- package/test-data/switch-nodes/basic/seller-approval-workflow.json +0 -383
- package/test-data/switch-nodes/basic/set-fee.json +0 -243
- package/test-data/switch-nodes/basic/shipping-carrier-selector.json +0 -379
- package/test-data/switch-nodes/basic/switch-node.json +0 -167
- package/test-data/switch-nodes/basic/switch-performance-2.json +0 -1307
- package/test-data/switch-nodes/basic/switch-performance.json +0 -691
- package/test-data/switch-nodes/basic/tax-exemption.json +0 -295
- package/test-data/switch-nodes/basic/warehouse-cross-docking.json +0 -313
- package/test-data/switch-nodes/default-cases/switch-with-default.json +0 -134
- package/test-data/zen-reference/$nodes-child.json +0 -69
- package/test-data/zen-reference/$nodes-parent.json +0 -34
- package/test-data/zen-reference/8k.json +0 -87992
- package/test-data/zen-reference/credit-analysis.json +0 -324
- package/test-data/zen-reference/custom.json +0 -51
- package/test-data/zen-reference/customer-input-schema.json +0 -34
- package/test-data/zen-reference/customer-output-schema.json +0 -34
- package/test-data/zen-reference/error-cyclic.json +0 -114
- package/test-data/zen-reference/error-missing-input.json +0 -54
- package/test-data/zen-reference/error-missing-output.json +0 -54
- package/test-data/zen-reference/expression.json +0 -69
- package/test-data/zen-reference/function-v2.json +0 -48
- package/test-data/zen-reference/function.json +0 -46
- package/test-data/zen-reference/graphs/account-dormancy-management.json +0 -245
- package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +0 -228
- package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +0 -285
- package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +0 -466
- package/test-data/zen-reference/graphs/aml.json +0 -537
- package/test-data/zen-reference/graphs/application-risk-assessment.json +0 -474
- package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +0 -412
- package/test-data/zen-reference/graphs/booking-personalization-system.json +0 -553
- package/test-data/zen-reference/graphs/care-team-assignment-system.json +0 -585
- package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +0 -281
- package/test-data/zen-reference/graphs/claim-validation-system.json +0 -307
- package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +0 -433
- package/test-data/zen-reference/graphs/clinical-pathway-selection.json +0 -454
- package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +0 -474
- package/test-data/zen-reference/graphs/company-analysis.json +0 -390
- package/test-data/zen-reference/graphs/credit-limit-adjustment.json +0 -479
- package/test-data/zen-reference/graphs/customer-eligibility-engine.json +0 -551
- package/test-data/zen-reference/graphs/customer-lifetime-value.json +0 -200
- package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/zen-reference/graphs/customer-service-escalation.json +0 -191
- package/test-data/zen-reference/graphs/decision-table-discounts.json +0 -168
- package/test-data/zen-reference/graphs/decision-table-shipping.json +0 -398
- package/test-data/zen-reference/graphs/delivery-route-optimizer.json +0 -271
- package/test-data/zen-reference/graphs/device-compatibility-checker.json +0 -303
- package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +0 -296
- package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +0 -289
- package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +0 -325
- package/test-data/zen-reference/graphs/empty-column-with-space.json +0 -100
- package/test-data/zen-reference/graphs/empty-column-without-space.json +0 -100
- package/test-data/zen-reference/graphs/environment-compliance-assessment.json +0 -386
- package/test-data/zen-reference/graphs/expression-default.json +0 -93
- package/test-data/zen-reference/graphs/expression-fields.json +0 -94
- package/test-data/zen-reference/graphs/expression-loop.json +0 -94
- package/test-data/zen-reference/graphs/expression-passthrough.json +0 -108
- package/test-data/zen-reference/graphs/expression-table-map.json +0 -313
- package/test-data/zen-reference/graphs/flash-sale-eligibility.json +0 -366
- package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +0 -455
- package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/zen-reference/graphs/government-assistance.json +0 -299
- package/test-data/zen-reference/graphs/grant-funding-distribution.json +0 -307
- package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +0 -414
- package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +0 -765
- package/test-data/zen-reference/graphs/import-duties-calculator.json +0 -318
- package/test-data/zen-reference/graphs/insurance-agent-commission.json +0 -228
- package/test-data/zen-reference/graphs/insurance-breakdown.json +0 -421
- package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +0 -362
- package/test-data/zen-reference/graphs/insurance-prior-authorization.json +0 -467
- package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +0 -321
- package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +0 -199
- package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +0 -373
- package/test-data/zen-reference/graphs/legacy-plan-management.json +0 -434
- package/test-data/zen-reference/graphs/loan-approval.json +0 -469
- package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +0 -334
- package/test-data/zen-reference/graphs/medication-dosage-calculator.json +0 -318
- package/test-data/zen-reference/graphs/merch-bags.json +0 -171
- package/test-data/zen-reference/graphs/multi-switch.json +0 -498
- package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +0 -364
- package/test-data/zen-reference/graphs/mvno-partner-enablement.json +0 -313
- package/test-data/zen-reference/graphs/nested-request.json +0 -125
- package/test-data/zen-reference/graphs/online-checkin-eligibility.json +0 -285
- package/test-data/zen-reference/graphs/order-consolidation-system.json +0 -493
- package/test-data/zen-reference/graphs/partner-revenue-sharing.json +0 -244
- package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/zen-reference/graphs/policy-discount-calculator.json +0 -307
- package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +0 -299
- package/test-data/zen-reference/graphs/product-listing-scoring.json +0 -358
- package/test-data/zen-reference/graphs/realtime-fraud-detection.json +0 -235
- package/test-data/zen-reference/graphs/regional-compliance-manager.json +0 -278
- package/test-data/zen-reference/graphs/returns-and-refund-policy.json +0 -366
- package/test-data/zen-reference/graphs/returns-processing-system.json +0 -448
- package/test-data/zen-reference/graphs/school-district-resource-allocation.json +0 -282
- package/test-data/zen-reference/graphs/seat-map-optimization.json +0 -325
- package/test-data/zen-reference/graphs/seller-approval-workflow.json +0 -383
- package/test-data/zen-reference/graphs/seller-fee-calculator.json +0 -307
- package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +0 -575
- package/test-data/zen-reference/graphs/set-fee.json +0 -243
- package/test-data/zen-reference/graphs/shipping-carrier-selector.json +0 -379
- package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +0 -249
- package/test-data/zen-reference/graphs/supply-chain-risk.json +0 -316
- package/test-data/zen-reference/graphs/table-loop.json +0 -93
- package/test-data/zen-reference/graphs/tax-exemption.json +0 -295
- package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +0 -525
- package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +0 -310
- package/test-data/zen-reference/graphs/warehouse-cross-docking.json +0 -313
- package/test-data/zen-reference/graphs/warehouse-storage-location.json +0 -345
- package/test-data/zen-reference/http-function.json +0 -34
- package/test-data/zen-reference/infinite-function.json +0 -46
- package/test-data/zen-reference/js/imports.js +0 -25
- package/test-data/zen-reference/passthrough.json +0 -31
- package/test-data/zen-reference/recursive-table1.json +0 -49
- package/test-data/zen-reference/recursive-table2.json +0 -49
- package/test-data/zen-reference/sleep-function.json +0 -34
- package/test-data/zen-reference/switch-node.json +0 -167
- package/test-data/zen-reference/switch-performance-2.json +0 -1307
- package/test-data/zen-reference/switch-performance.json +0 -691
- package/test-data/zen-reference/table.json +0 -76
- package/tests/helpers/index.ts +0 -73
- package/tests/helpers/mock-context.ts +0 -231
- package/tests/helpers/round-trip.ts +0 -398
- package/tests/helpers/test-harness-comparison.ts +0 -325
- package/tests/helpers/test-harness-wasm.ts +0 -710
- package/tests/helpers/test-harness.ts +0 -28
- package/tests/helpers/wasm-test.ts +0 -659
- package/tests/integration/compilation-errors.test.ts +0 -864
- package/tests/integration/decision-tables.test.ts +0 -531
- package/tests/integration/edge-cases.test.ts +0 -787
- package/tests/integration/expressions.test.ts +0 -513
- package/tests/integration/function-node-integration.test.ts +0 -182
- package/tests/integration/sub-decisions.test.ts +0 -108
- package/tests/integration/switch-nodes.test.ts +0 -399
- package/tests/integration/unary-or-matching.test.ts +0 -53
- package/tests/integration/wasm-data-types.test.ts +0 -398
- package/tests/integration/wasm-errors.test.ts +0 -199
- package/tests/integration/wasm-execution.test.ts +0 -348
- package/tests/integration/wasm-memory.test.ts +0 -228
- package/tests/scripts/analyze-coverage.ts +0 -166
- package/tests/scripts/categorize-tests.ts +0 -396
- package/tests/scripts/coverage-analysis.ts +0 -836
- package/tests/unit/compiler/cache.test.ts +0 -238
- package/tests/unit/compiler/errors.test.ts +0 -316
- package/tests/unit/compiler/graph-scalability.test.ts +0 -510
- package/tests/unit/compiler/graph.test.ts +0 -878
- package/tests/unit/compiler/input-validation.test.ts +0 -447
- package/tests/unit/compiler/logical-and-parser.test.ts +0 -143
- package/tests/unit/compiler/logical-not-parser.test.ts +0 -107
- package/tests/unit/compiler/logical-or-parser.test.ts +0 -236
- package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +0 -97
- package/tests/unit/compiler/nodes/decision-table.test.ts +0 -103
- package/tests/unit/compiler/nodes/decision.test.ts +0 -182
- package/tests/unit/compiler/nodes/function-compile.test.ts +0 -204
- package/tests/unit/compiler/nodes/function.test.ts +0 -176
- package/tests/unit/compiler/nodes/input.test.ts +0 -30
- package/tests/unit/compiler/nodes/switch.test.ts +0 -127
- package/tests/unit/compiler/optimizer-cache.test.ts +0 -327
- package/tests/unit/compiler/optimizer-implementation.test.ts +0 -625
- package/tests/unit/compiler/parser.test.ts +0 -508
- package/tests/unit/compiler/runtime-error-cleanup.test.ts +0 -426
- package/tests/unit/compiler/runtime-validation.test.ts +0 -303
- package/tests/unit/compiler/runtime.test.ts +0 -221
- package/tests/unit/compiler/schema/schema.test.ts +0 -248
- package/tests/unit/compiler/unary-ast-transforms.test.ts +0 -245
- package/tsconfig.json +0 -27
- package/tsup.config.ts +0 -11
- package/vitest.config.ts +0 -12
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
import { Worker } from "worker_threads";
|
|
2
|
-
import { cpus } from "os";
|
|
3
|
-
import { fileURLToPath } from "url";
|
|
4
|
-
import { dirname, join } from "path";
|
|
5
|
-
|
|
6
|
-
// Message types matching worker.ts protocol
|
|
7
|
-
type InitMessage = { type: "init"; wasmBinary: Uint8Array; marshalCode: string };
|
|
8
|
-
type EvaluateMessage = {
|
|
9
|
-
type: "evaluate";
|
|
10
|
-
id: number;
|
|
11
|
-
input: Record<string, unknown>;
|
|
12
|
-
};
|
|
13
|
-
type ShutdownMessage = { type: "shutdown" };
|
|
14
|
-
type ReadyMessage = { type: "ready" };
|
|
15
|
-
type ResultMessage = {
|
|
16
|
-
type: "result";
|
|
17
|
-
id: number;
|
|
18
|
-
output: Record<string, unknown>;
|
|
19
|
-
latencyNs: string; // Worker-side execution latency (renamed to executionLatencyNs in our interface)
|
|
20
|
-
};
|
|
21
|
-
type ErrorMessage = { type: "error"; id: number; message: string };
|
|
22
|
-
|
|
23
|
-
type WorkerMessage = ReadyMessage | ResultMessage | ErrorMessage;
|
|
24
|
-
type ToWorkerMessage = InitMessage | EvaluateMessage | ShutdownMessage;
|
|
25
|
-
|
|
26
|
-
interface PendingRequest {
|
|
27
|
-
resolve: (value: { output: Record<string, unknown>; executionLatencyNs: number; roundTripLatencyNs: number }) => void;
|
|
28
|
-
reject: (error: Error) => void;
|
|
29
|
-
startTime: bigint; // Track when request was sent for round-trip latency calculation
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export class LatencyTracker {
|
|
33
|
-
private samples: number[] = [];
|
|
34
|
-
|
|
35
|
-
record(latencyNs: number): void {
|
|
36
|
-
this.samples.push(latencyNs);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
getPercentile(p: number): number {
|
|
40
|
-
const sorted = [...this.samples].sort((a, b) => a - b);
|
|
41
|
-
const idx = Math.floor((sorted.length * p) / 100);
|
|
42
|
-
return sorted[idx] ?? 0;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
report(): { p50: number; p95: number; p99: number } {
|
|
46
|
-
return {
|
|
47
|
-
p50: this.getPercentile(50),
|
|
48
|
-
p95: this.getPercentile(95),
|
|
49
|
-
p99: this.getPercentile(99),
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
clear(): void {
|
|
54
|
-
this.samples = [];
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export class WorkerPool {
|
|
59
|
-
private workers: Worker[] = [];
|
|
60
|
-
private pendingRequests: Map<number, PendingRequest> = new Map();
|
|
61
|
-
private nextRequestId = 0;
|
|
62
|
-
private nextWorkerIndex = 0;
|
|
63
|
-
private readonly wasmBinary: Uint8Array;
|
|
64
|
-
private readonly marshalCode: string;
|
|
65
|
-
|
|
66
|
-
constructor(wasmBinary: Uint8Array, marshalCode: string) {
|
|
67
|
-
this.wasmBinary = wasmBinary;
|
|
68
|
-
this.marshalCode = marshalCode;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async initialize(): Promise<void> {
|
|
72
|
-
const workerCount = cpus().length;
|
|
73
|
-
const workerPath = join(
|
|
74
|
-
dirname(fileURLToPath(import.meta.url)),
|
|
75
|
-
"worker.ts"
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
const readyPromises: Promise<void>[] = [];
|
|
79
|
-
|
|
80
|
-
for (let i = 0; i < workerCount; i++) {
|
|
81
|
-
const worker = new Worker(workerPath);
|
|
82
|
-
this.workers.push(worker);
|
|
83
|
-
|
|
84
|
-
const readyPromise = new Promise<void>((resolve, reject) => {
|
|
85
|
-
const onMessage = (msg: WorkerMessage) => {
|
|
86
|
-
if (msg.type === "ready") {
|
|
87
|
-
worker.off("message", onMessage);
|
|
88
|
-
worker.off("error", onError);
|
|
89
|
-
resolve();
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const onError = (err: Error) => {
|
|
94
|
-
worker.off("message", onMessage);
|
|
95
|
-
worker.off("error", onError);
|
|
96
|
-
reject(err);
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
worker.on("message", onMessage);
|
|
100
|
-
worker.on("error", onError);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
readyPromises.push(readyPromise);
|
|
104
|
-
|
|
105
|
-
// Set up persistent message handler for results
|
|
106
|
-
worker.on("message", (msg: WorkerMessage) => {
|
|
107
|
-
this.handleWorkerMessage(msg);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
worker.on("error", (err) => {
|
|
111
|
-
console.error("Worker error:", err);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Send init message
|
|
115
|
-
const initMsg: InitMessage = {
|
|
116
|
-
type: "init",
|
|
117
|
-
wasmBinary: this.wasmBinary,
|
|
118
|
-
marshalCode: this.marshalCode,
|
|
119
|
-
};
|
|
120
|
-
worker.postMessage(initMsg);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
await Promise.all(readyPromises);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
private handleWorkerMessage(msg: WorkerMessage): void {
|
|
127
|
-
if (msg.type === "result") {
|
|
128
|
-
const pending = this.pendingRequests.get(msg.id);
|
|
129
|
-
if (pending) {
|
|
130
|
-
this.pendingRequests.delete(msg.id);
|
|
131
|
-
const roundTripLatencyNs = Number(process.hrtime.bigint() - pending.startTime);
|
|
132
|
-
pending.resolve({
|
|
133
|
-
output: msg.output,
|
|
134
|
-
executionLatencyNs: Number(msg.latencyNs),
|
|
135
|
-
roundTripLatencyNs,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
} else if (msg.type === "error") {
|
|
139
|
-
const pending = this.pendingRequests.get(msg.id);
|
|
140
|
-
if (pending) {
|
|
141
|
-
this.pendingRequests.delete(msg.id);
|
|
142
|
-
pending.reject(new Error(msg.message));
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Ignore 'ready' messages here - handled in initialize()
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
async evaluateBatch(
|
|
149
|
-
inputs: Record<string, unknown>[]
|
|
150
|
-
): Promise<{
|
|
151
|
-
outputs: Record<string, unknown>[];
|
|
152
|
-
roundTripLatencies: number[]; // Main thread perspective (fair comparison)
|
|
153
|
-
executionLatencies: number[]; // Worker-side WASM execution only (for analysis)
|
|
154
|
-
}> {
|
|
155
|
-
if (this.workers.length === 0) {
|
|
156
|
-
throw new Error("WorkerPool not initialized");
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const promises: Promise<{ output: Record<string, unknown>; executionLatencyNs: number; roundTripLatencyNs: number }>[] = [];
|
|
160
|
-
|
|
161
|
-
for (const input of inputs) {
|
|
162
|
-
const id = this.nextRequestId++;
|
|
163
|
-
const workerIndex = this.nextWorkerIndex;
|
|
164
|
-
this.nextWorkerIndex = (this.nextWorkerIndex + 1) % this.workers.length;
|
|
165
|
-
|
|
166
|
-
const worker = this.workers[workerIndex];
|
|
167
|
-
|
|
168
|
-
// Record start time BEFORE posting the message to capture full round-trip latency
|
|
169
|
-
const startTime = process.hrtime.bigint();
|
|
170
|
-
|
|
171
|
-
const promise = new Promise<{ output: Record<string, unknown>; executionLatencyNs: number; roundTripLatencyNs: number }>(
|
|
172
|
-
(resolve, reject) => {
|
|
173
|
-
this.pendingRequests.set(id, { resolve, reject, startTime });
|
|
174
|
-
}
|
|
175
|
-
);
|
|
176
|
-
|
|
177
|
-
promises.push(promise);
|
|
178
|
-
|
|
179
|
-
const evalMsg: EvaluateMessage = {
|
|
180
|
-
type: "evaluate",
|
|
181
|
-
id,
|
|
182
|
-
input,
|
|
183
|
-
};
|
|
184
|
-
worker.postMessage(evalMsg);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const results = await Promise.all(promises);
|
|
188
|
-
|
|
189
|
-
const outputs: Record<string, unknown>[] = [];
|
|
190
|
-
const roundTripLatencies: number[] = [];
|
|
191
|
-
const executionLatencies: number[] = [];
|
|
192
|
-
|
|
193
|
-
for (const result of results) {
|
|
194
|
-
outputs.push(result.output);
|
|
195
|
-
roundTripLatencies.push(result.roundTripLatencyNs);
|
|
196
|
-
executionLatencies.push(result.executionLatencyNs);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
return { outputs, roundTripLatencies, executionLatencies };
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
async shutdown(): Promise<void> {
|
|
203
|
-
const terminationPromises: Promise<number>[] = [];
|
|
204
|
-
|
|
205
|
-
for (const worker of this.workers) {
|
|
206
|
-
const shutdownMsg: ShutdownMessage = { type: "shutdown" };
|
|
207
|
-
worker.postMessage(shutdownMsg);
|
|
208
|
-
terminationPromises.push(
|
|
209
|
-
new Promise<number>((resolve) => {
|
|
210
|
-
worker.on("exit", resolve);
|
|
211
|
-
})
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
await Promise.all(terminationPromises);
|
|
216
|
-
this.workers = [];
|
|
217
|
-
this.pendingRequests.clear();
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
getWorkerCount(): number {
|
|
221
|
-
return this.workers.length;
|
|
222
|
-
}
|
|
223
|
-
}
|
package/benchmarks/worker.ts
DELETED
|
@@ -1,374 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Worker thread entry point for multi-threaded benchmarking.
|
|
3
|
-
*
|
|
4
|
-
* This worker receives WASM binary and marshal code on init,
|
|
5
|
-
* creates its own WASM evaluator instance, and handles evaluate
|
|
6
|
-
* requests with high-resolution timing.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { parentPort } from "worker_threads";
|
|
10
|
-
|
|
11
|
-
// ============================================================================
|
|
12
|
-
// Constants and Utilities
|
|
13
|
-
// ============================================================================
|
|
14
|
-
|
|
15
|
-
const WASM_PAGE_SIZE_BYTES = 65536;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Ensure WASM memory is large enough for the required size.
|
|
19
|
-
* Inlined from src/compiler/runtime.ts to avoid module resolution issues in workers.
|
|
20
|
-
*/
|
|
21
|
-
function ensureMemory(memory: WebAssembly.Memory, required: number): void {
|
|
22
|
-
const current = memory.buffer.byteLength;
|
|
23
|
-
if (required <= current) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const pagesNeeded = Math.ceil((required - current) / WASM_PAGE_SIZE_BYTES);
|
|
27
|
-
const oldPages = memory.grow(pagesNeeded);
|
|
28
|
-
if (oldPages < 0) {
|
|
29
|
-
throw new Error(`Failed to grow memory by ${pagesNeeded} pages`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// ============================================================================
|
|
34
|
-
// Message Protocol Types
|
|
35
|
-
// ============================================================================
|
|
36
|
-
|
|
37
|
-
// Main -> Worker messages
|
|
38
|
-
type InitMessage = {
|
|
39
|
-
type: "init";
|
|
40
|
-
wasmBinary: Uint8Array;
|
|
41
|
-
marshalCode: string;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
type EvaluateMessage = {
|
|
45
|
-
type: "evaluate";
|
|
46
|
-
id: number;
|
|
47
|
-
input: Record<string, unknown>;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
type ShutdownMessage = {
|
|
51
|
-
type: "shutdown";
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
type WorkerMessage = InitMessage | EvaluateMessage | ShutdownMessage;
|
|
55
|
-
|
|
56
|
-
// Worker -> Main messages
|
|
57
|
-
type ReadyMessage = {
|
|
58
|
-
type: "ready";
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
type ResultMessage = {
|
|
62
|
-
type: "result";
|
|
63
|
-
id: number;
|
|
64
|
-
output: Record<string, unknown>;
|
|
65
|
-
latencyNs: string; // bigint serialized as string
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
type ErrorMessage = {
|
|
69
|
-
type: "error";
|
|
70
|
-
id: number;
|
|
71
|
-
message: string;
|
|
72
|
-
};
|
|
73
|
-
|
|
74
|
-
type WorkerResponse = ReadyMessage | ResultMessage | ErrorMessage;
|
|
75
|
-
|
|
76
|
-
// ============================================================================
|
|
77
|
-
// Worker State
|
|
78
|
-
// ============================================================================
|
|
79
|
-
|
|
80
|
-
let instance: WebAssembly.Instance | null = null;
|
|
81
|
-
let memory: WebAssembly.Memory | null = null;
|
|
82
|
-
let evaluate: ((ptr: number) => number) | null = null;
|
|
83
|
-
let collect: (() => void) | null = null;
|
|
84
|
-
let unmarshalOutput: ((ptr: number, memory: WebAssembly.Memory) => Record<string, unknown>) | null =
|
|
85
|
-
null;
|
|
86
|
-
let marshalMapInput:
|
|
87
|
-
| ((data: Record<string, unknown>, memory: WebAssembly.Memory, basePtr: number) => number)
|
|
88
|
-
| null = null;
|
|
89
|
-
|
|
90
|
-
// ============================================================================
|
|
91
|
-
// Marshal Map Input Function
|
|
92
|
-
// ============================================================================
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Create the marshalMapInput function.
|
|
96
|
-
* This is copied from ReusableWasmEvaluator in tests/helpers/test-harness-wasm.ts.
|
|
97
|
-
*/
|
|
98
|
-
function createMarshalMapInput(): (
|
|
99
|
-
data: Record<string, unknown>,
|
|
100
|
-
memory: WebAssembly.Memory,
|
|
101
|
-
basePtr: number,
|
|
102
|
-
) => number {
|
|
103
|
-
return (
|
|
104
|
-
data: Record<string, unknown>,
|
|
105
|
-
memory: WebAssembly.Memory,
|
|
106
|
-
basePtr: number,
|
|
107
|
-
): number => {
|
|
108
|
-
const view = new DataView(memory.buffer);
|
|
109
|
-
const entries = Object.entries(data);
|
|
110
|
-
const length = entries.length;
|
|
111
|
-
|
|
112
|
-
// Write map length at basePtr
|
|
113
|
-
view.setUint32(basePtr, length, true);
|
|
114
|
-
|
|
115
|
-
// Allocate and write keys and values
|
|
116
|
-
let currentOffset = basePtr + 4 + length * 8; // Skip map structure
|
|
117
|
-
|
|
118
|
-
const writeValue = (value: unknown): number => {
|
|
119
|
-
// Returns pointer to a fully allocated Value structure
|
|
120
|
-
const valuePtr = currentOffset;
|
|
121
|
-
|
|
122
|
-
if (value === null || value === undefined) {
|
|
123
|
-
view.setUint32(valuePtr, 0, true); // TAG_NULL = 0
|
|
124
|
-
currentOffset += 4;
|
|
125
|
-
} else if (typeof value === "boolean") {
|
|
126
|
-
view.setUint32(valuePtr, 1, true); // TAG_BOOLEAN = 1
|
|
127
|
-
view.setUint8(valuePtr + 4, value ? 1 : 0);
|
|
128
|
-
currentOffset += 5;
|
|
129
|
-
} else if (typeof value === "number") {
|
|
130
|
-
view.setUint32(valuePtr, 3, true); // TAG_FLOAT = 3
|
|
131
|
-
view.setFloat64(valuePtr + 4, value, true);
|
|
132
|
-
currentOffset += 12;
|
|
133
|
-
} else if (typeof value === "string") {
|
|
134
|
-
view.setUint32(valuePtr, 4, true); // TAG_STRING = 4
|
|
135
|
-
currentOffset += 8;
|
|
136
|
-
const stringDataPtr = currentOffset;
|
|
137
|
-
const len = value.length;
|
|
138
|
-
view.setUint32(stringDataPtr, len, true);
|
|
139
|
-
for (let i = 0; i < len; i++) {
|
|
140
|
-
view.setUint16(stringDataPtr + 4 + i * 2, value.charCodeAt(i), true);
|
|
141
|
-
}
|
|
142
|
-
currentOffset += 4 + len * 2;
|
|
143
|
-
view.setUint32(valuePtr + 4, stringDataPtr, true);
|
|
144
|
-
} else if (Array.isArray(value)) {
|
|
145
|
-
const arrLength = value.length;
|
|
146
|
-
currentOffset += 8;
|
|
147
|
-
const arrayPtr = currentOffset;
|
|
148
|
-
currentOffset += 4 + arrLength * 4;
|
|
149
|
-
view.setUint32(arrayPtr, arrLength, true);
|
|
150
|
-
let ptrOffset = arrayPtr + 4;
|
|
151
|
-
for (let i = 0; i < arrLength; i++) {
|
|
152
|
-
const elemPtr = writeValue(value[i]);
|
|
153
|
-
view.setUint32(ptrOffset, elemPtr, true);
|
|
154
|
-
ptrOffset += 4;
|
|
155
|
-
}
|
|
156
|
-
view.setUint32(valuePtr, 5, true); // TAG_ARRAY = 5
|
|
157
|
-
view.setUint32(valuePtr + 4, arrayPtr, true);
|
|
158
|
-
} else if (typeof value === "object") {
|
|
159
|
-
const obj = value as Record<string, unknown>;
|
|
160
|
-
const objEntries = Object.entries(obj);
|
|
161
|
-
currentOffset += 8;
|
|
162
|
-
const mapPtr = currentOffset;
|
|
163
|
-
currentOffset += 4 + objEntries.length * 8;
|
|
164
|
-
view.setUint32(mapPtr, objEntries.length, true);
|
|
165
|
-
let ptrOffset = mapPtr + 4;
|
|
166
|
-
for (const [key, val] of objEntries) {
|
|
167
|
-
const keyStrPtr = currentOffset;
|
|
168
|
-
const keyLen = key.length;
|
|
169
|
-
view.setUint32(keyStrPtr, keyLen, true);
|
|
170
|
-
for (let i = 0; i < keyLen; i++) {
|
|
171
|
-
view.setUint16(keyStrPtr + 4 + i * 2, key.charCodeAt(i), true);
|
|
172
|
-
}
|
|
173
|
-
currentOffset += 4 + keyLen * 2;
|
|
174
|
-
view.setUint32(ptrOffset, keyStrPtr, true);
|
|
175
|
-
const nestedValuePtr = writeValue(val);
|
|
176
|
-
view.setUint32(ptrOffset + 4, nestedValuePtr, true);
|
|
177
|
-
ptrOffset += 8;
|
|
178
|
-
}
|
|
179
|
-
view.setUint32(valuePtr, 6, true); // TAG_OBJECT = 6
|
|
180
|
-
view.setUint32(valuePtr + 4, mapPtr, true);
|
|
181
|
-
} else {
|
|
182
|
-
throw new Error(`Unsupported type: ${typeof value}`);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return valuePtr;
|
|
186
|
-
};
|
|
187
|
-
|
|
188
|
-
let ptrOffset = basePtr + 4;
|
|
189
|
-
for (let i = 0; i < length; i++) {
|
|
190
|
-
const [key, value] = entries[i];
|
|
191
|
-
const keyStrPtr = currentOffset;
|
|
192
|
-
const keyLen = key.length;
|
|
193
|
-
view.setUint32(keyStrPtr, keyLen, true);
|
|
194
|
-
for (let j = 0; j < keyLen; j++) {
|
|
195
|
-
view.setUint16(keyStrPtr + 4 + j * 2, key.charCodeAt(j), true);
|
|
196
|
-
}
|
|
197
|
-
currentOffset += 4 + keyLen * 2;
|
|
198
|
-
const valuePtr = writeValue(value);
|
|
199
|
-
view.setUint32(ptrOffset, keyStrPtr, true);
|
|
200
|
-
view.setUint32(ptrOffset + 4, valuePtr, true);
|
|
201
|
-
ptrOffset += 8;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
return basePtr;
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// ============================================================================
|
|
209
|
-
// Message Handlers
|
|
210
|
-
// ============================================================================
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Handle init message - compile WASM and load marshal code.
|
|
214
|
-
*/
|
|
215
|
-
async function handleInit(msg: InitMessage): Promise<void> {
|
|
216
|
-
// Compile and instantiate the WASM module from the binary
|
|
217
|
-
// Create a proper ArrayBuffer from the Uint8Array for WebAssembly.compile
|
|
218
|
-
const wasmArray = new Uint8Array(msg.wasmBinary);
|
|
219
|
-
const buffer = wasmArray.buffer.slice(
|
|
220
|
-
wasmArray.byteOffset,
|
|
221
|
-
wasmArray.byteOffset + wasmArray.byteLength,
|
|
222
|
-
);
|
|
223
|
-
const wasmModule = await WebAssembly.compile(buffer as ArrayBuffer);
|
|
224
|
-
instance = await WebAssembly.instantiate(wasmModule, {
|
|
225
|
-
env: {
|
|
226
|
-
abort: () => {
|
|
227
|
-
throw new Error("WASM abort called");
|
|
228
|
-
},
|
|
229
|
-
"Date.now": () => Date.now(),
|
|
230
|
-
},
|
|
231
|
-
});
|
|
232
|
-
|
|
233
|
-
memory = instance.exports.memory as WebAssembly.Memory;
|
|
234
|
-
evaluate = instance.exports.evaluate as (ptr: number) => number;
|
|
235
|
-
collect = instance.exports.__collect as (() => void) | null;
|
|
236
|
-
|
|
237
|
-
// Load the generated marshal code using new Function() approach
|
|
238
|
-
const cleanedCode = msg.marshalCode
|
|
239
|
-
.replace(/^export function marshalInput/gm, "function marshalInput")
|
|
240
|
-
.replace(/^export function unmarshalOutput/gm, "function unmarshalOutput")
|
|
241
|
-
.replace(/^export function readString/gm, "function readString")
|
|
242
|
-
.replace(/^export function readArray/gm, "function readArray")
|
|
243
|
-
.replace(/^export function readValue/gm, "function readValue");
|
|
244
|
-
|
|
245
|
-
const marshalCodeModule: Record<string, unknown> = {};
|
|
246
|
-
const executeCode = new Function(
|
|
247
|
-
"module",
|
|
248
|
-
cleanedCode +
|
|
249
|
-
"\nmodule.marshalInput = marshalInput;\nmodule.unmarshalOutput = unmarshalOutput;\nmodule.readString = readString;\nmodule.readArray = readArray;\nmodule.readValue = readValue;",
|
|
250
|
-
);
|
|
251
|
-
executeCode(marshalCodeModule);
|
|
252
|
-
|
|
253
|
-
unmarshalOutput = marshalCodeModule.unmarshalOutput as (
|
|
254
|
-
ptr: number,
|
|
255
|
-
memory: WebAssembly.Memory,
|
|
256
|
-
) => Record<string, unknown>;
|
|
257
|
-
|
|
258
|
-
// Create the marshalMapInput function
|
|
259
|
-
marshalMapInput = createMarshalMapInput();
|
|
260
|
-
|
|
261
|
-
// Ensure enough memory for evaluation
|
|
262
|
-
const requiredMemory = 768 * 1024;
|
|
263
|
-
ensureMemory(memory, requiredMemory);
|
|
264
|
-
|
|
265
|
-
// Send ready message
|
|
266
|
-
const response: ReadyMessage = { type: "ready" };
|
|
267
|
-
parentPort!.postMessage(response);
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
/**
|
|
271
|
-
* Handle evaluate message - run evaluation with timing.
|
|
272
|
-
*/
|
|
273
|
-
function handleEvaluate(msg: EvaluateMessage): void {
|
|
274
|
-
if (!instance || !memory || !evaluate || !unmarshalOutput || !marshalMapInput) {
|
|
275
|
-
const response: ErrorMessage = {
|
|
276
|
-
type: "error",
|
|
277
|
-
id: msg.id,
|
|
278
|
-
message: "Worker not initialized. Send init message first.",
|
|
279
|
-
};
|
|
280
|
-
parentPort!.postMessage(response);
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
try {
|
|
285
|
-
// Record start time with high-resolution timing
|
|
286
|
-
const startTime = process.hrtime.bigint();
|
|
287
|
-
|
|
288
|
-
// Place input data at 640KB - after the custom heap region (512KB+)
|
|
289
|
-
// Memory layout:
|
|
290
|
-
// - Static data: 0 - ~50KB
|
|
291
|
-
// - AS runtime heap: ~50KB - 192KB (grows during evaluation, stub runtime has no GC)
|
|
292
|
-
// - Reserved: 192KB - 512KB
|
|
293
|
-
// - Custom heap (output): 512KB - 640KB
|
|
294
|
-
// - Input data: 640KB - 768KB
|
|
295
|
-
const inputPtr = 640 * 1024;
|
|
296
|
-
|
|
297
|
-
marshalMapInput(msg.input, memory, inputPtr);
|
|
298
|
-
const outputPtr = evaluate(inputPtr);
|
|
299
|
-
const result = unmarshalOutput(outputPtr, memory);
|
|
300
|
-
|
|
301
|
-
// Run garbage collection to free memory used during evaluation
|
|
302
|
-
if (collect) {
|
|
303
|
-
collect();
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Record end time and calculate latency
|
|
307
|
-
const endTime = process.hrtime.bigint();
|
|
308
|
-
const latencyNs = endTime - startTime;
|
|
309
|
-
|
|
310
|
-
// Send result message (bigint converted to string for postMessage)
|
|
311
|
-
const response: ResultMessage = {
|
|
312
|
-
type: "result",
|
|
313
|
-
id: msg.id,
|
|
314
|
-
output: result,
|
|
315
|
-
latencyNs: latencyNs.toString(),
|
|
316
|
-
};
|
|
317
|
-
parentPort!.postMessage(response);
|
|
318
|
-
} catch (error) {
|
|
319
|
-
const response: ErrorMessage = {
|
|
320
|
-
type: "error",
|
|
321
|
-
id: msg.id,
|
|
322
|
-
message: error instanceof Error ? error.message : String(error),
|
|
323
|
-
};
|
|
324
|
-
parentPort!.postMessage(response);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/**
|
|
329
|
-
* Handle shutdown message - exit the worker.
|
|
330
|
-
*/
|
|
331
|
-
function handleShutdown(): void {
|
|
332
|
-
process.exit(0);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
// ============================================================================
|
|
336
|
-
// Main Message Handler
|
|
337
|
-
// ============================================================================
|
|
338
|
-
|
|
339
|
-
if (!parentPort) {
|
|
340
|
-
throw new Error("This module must be run as a worker thread");
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
parentPort.on("message", async (msg: WorkerMessage) => {
|
|
344
|
-
switch (msg.type) {
|
|
345
|
-
case "init":
|
|
346
|
-
try {
|
|
347
|
-
await handleInit(msg);
|
|
348
|
-
} catch (error) {
|
|
349
|
-
const response: ErrorMessage = {
|
|
350
|
-
type: "error",
|
|
351
|
-
id: -1,
|
|
352
|
-
message: `Init failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
353
|
-
};
|
|
354
|
-
parentPort!.postMessage(response);
|
|
355
|
-
}
|
|
356
|
-
break;
|
|
357
|
-
|
|
358
|
-
case "evaluate":
|
|
359
|
-
handleEvaluate(msg);
|
|
360
|
-
break;
|
|
361
|
-
|
|
362
|
-
case "shutdown":
|
|
363
|
-
handleShutdown();
|
|
364
|
-
break;
|
|
365
|
-
|
|
366
|
-
default:
|
|
367
|
-
const response: ErrorMessage = {
|
|
368
|
-
type: "error",
|
|
369
|
-
id: -1,
|
|
370
|
-
message: `Unknown message type: ${(msg as { type: string }).type}`,
|
|
371
|
-
};
|
|
372
|
-
parentPort!.postMessage(response);
|
|
373
|
-
}
|
|
374
|
-
});
|