@velarscript/web 0.10.1

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 (95) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +89 -0
  3. package/dist/analyzer.d.ts +302 -0
  4. package/dist/analyzer.d.ts.map +1 -0
  5. package/dist/analyzer.js +2931 -0
  6. package/dist/analyzer.js.map +1 -0
  7. package/dist/ast.d.ts +220 -0
  8. package/dist/ast.d.ts.map +1 -0
  9. package/dist/ast.js +102 -0
  10. package/dist/ast.js.map +1 -0
  11. package/dist/browser-test.d.ts +29 -0
  12. package/dist/browser-test.d.ts.map +1 -0
  13. package/dist/browser-test.js +33 -0
  14. package/dist/browser-test.js.map +1 -0
  15. package/dist/compiler.d.ts +9 -0
  16. package/dist/compiler.d.ts.map +1 -0
  17. package/dist/compiler.js +715 -0
  18. package/dist/compiler.js.map +1 -0
  19. package/dist/css-tokens.d.ts +46 -0
  20. package/dist/css-tokens.d.ts.map +1 -0
  21. package/dist/css-tokens.js +363 -0
  22. package/dist/css-tokens.js.map +1 -0
  23. package/dist/editor.d.ts +3 -0
  24. package/dist/editor.d.ts.map +1 -0
  25. package/dist/editor.js +147 -0
  26. package/dist/editor.js.map +1 -0
  27. package/dist/elements.d.ts +11 -0
  28. package/dist/elements.d.ts.map +1 -0
  29. package/dist/elements.js +24 -0
  30. package/dist/elements.js.map +1 -0
  31. package/dist/emitter.d.ts +79 -0
  32. package/dist/emitter.d.ts.map +1 -0
  33. package/dist/emitter.js +2699 -0
  34. package/dist/emitter.js.map +1 -0
  35. package/dist/host.d.ts +7 -0
  36. package/dist/host.d.ts.map +1 -0
  37. package/dist/host.js +224 -0
  38. package/dist/host.js.map +1 -0
  39. package/dist/index.d.ts +11 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +23 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/inspection.d.ts +3 -0
  44. package/dist/inspection.d.ts.map +1 -0
  45. package/dist/inspection.js +82 -0
  46. package/dist/inspection.js.map +1 -0
  47. package/dist/keyframes.d.ts +16 -0
  48. package/dist/keyframes.d.ts.map +1 -0
  49. package/dist/keyframes.js +29 -0
  50. package/dist/keyframes.js.map +1 -0
  51. package/dist/lexer.d.ts +85 -0
  52. package/dist/lexer.d.ts.map +1 -0
  53. package/dist/lexer.js +422 -0
  54. package/dist/lexer.js.map +1 -0
  55. package/dist/look-static.d.ts +31 -0
  56. package/dist/look-static.d.ts.map +1 -0
  57. package/dist/look-static.js +266 -0
  58. package/dist/look-static.js.map +1 -0
  59. package/dist/look.d.ts +134 -0
  60. package/dist/look.d.ts.map +1 -0
  61. package/dist/look.js +627 -0
  62. package/dist/look.js.map +1 -0
  63. package/dist/parser.d.ts +71 -0
  64. package/dist/parser.d.ts.map +1 -0
  65. package/dist/parser.js +976 -0
  66. package/dist/parser.js.map +1 -0
  67. package/dist/project-config.d.ts +33 -0
  68. package/dist/project-config.d.ts.map +1 -0
  69. package/dist/project-config.js +199 -0
  70. package/dist/project-config.js.map +1 -0
  71. package/dist/runtime-foundation.d.ts +7 -0
  72. package/dist/runtime-foundation.d.ts.map +1 -0
  73. package/dist/runtime-foundation.js +1245 -0
  74. package/dist/runtime-foundation.js.map +1 -0
  75. package/dist/runtime.d.ts +7 -0
  76. package/dist/runtime.d.ts.map +1 -0
  77. package/dist/runtime.js +3444 -0
  78. package/dist/runtime.js.map +1 -0
  79. package/dist/semantic.d.ts +3 -0
  80. package/dist/semantic.d.ts.map +1 -0
  81. package/dist/semantic.js +150 -0
  82. package/dist/semantic.js.map +1 -0
  83. package/dist/types.d.ts +56 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +178 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/websocket-runtime.d.ts +2 -0
  88. package/dist/websocket-runtime.d.ts.map +1 -0
  89. package/dist/websocket-runtime.js +30 -0
  90. package/dist/websocket-runtime.js.map +1 -0
  91. package/dist/worker-runtime.d.ts +2 -0
  92. package/dist/worker-runtime.d.ts.map +1 -0
  93. package/dist/worker-runtime.js +72 -0
  94. package/dist/worker-runtime.js.map +1 -0
  95. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CompilerSemanticExtension } from "@velarscript/compiler/extension";
2
+ export declare const velarWebSemanticExtension: CompilerSemanticExtension;
3
+ //# sourceMappingURL=semantic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAI1B,MAAM,iCAAiC,CAAC;AAmDzC,eAAO,MAAM,yBAAyB,EAAE,yBA4GtC,CAAC"}
@@ -0,0 +1,150 @@
1
+ import { isWebExpression, isWebJsx, isWebKeyframes, isWebLook, isWebStatement, isWebUnit, } from "./ast.js";
2
+ function visitJsx(expression, context) {
3
+ if (/^[A-Z]/u.test(expression.tag)) {
4
+ context.reference(expression.tag, expression.tagSpan);
5
+ }
6
+ for (const attribute of expression.attributes) {
7
+ const owner = context.jsxAttributeOwner(attribute.span, attribute.name);
8
+ if (owner) {
9
+ context.recordMemberReference(attribute.name, { start: attribute.span.start, end: attribute.span.start + attribute.name.length }, owner, "extension-property");
10
+ }
11
+ if (attribute.value && typeof attribute.value !== "string")
12
+ context.visitExpression(attribute.value);
13
+ }
14
+ for (const child of expression.children) {
15
+ if (child.kind === "JSXExpressionChild")
16
+ context.visitExpression(child.expression);
17
+ else if (child.kind === "ExtensionExpression:web:jsx")
18
+ context.visitExpression(child);
19
+ }
20
+ }
21
+ function visitWatch(statement, context) {
22
+ context.visitExpression(statement.expression);
23
+ context.enterScope(statement.span);
24
+ let cursor = statement.expression.span.end;
25
+ if (statement.currentName) {
26
+ const selection = context.nameSpan(statement.span, statement.currentName, cursor);
27
+ context.declare({ statement, role: "current" }, statement.currentName, "extension:parameter:web-watch-value", statement.span, selection);
28
+ cursor = selection.end;
29
+ }
30
+ if (statement.previousName) {
31
+ const selection = context.nameSpan(statement.span, statement.previousName, cursor);
32
+ context.declare({ statement, role: "previous" }, statement.previousName, "extension:parameter:web-watch-value", statement.span, selection);
33
+ }
34
+ for (const child of statement.body)
35
+ context.visitStatement(child);
36
+ context.exitScope();
37
+ }
38
+ export const velarWebSemanticExtension = Object.freeze({
39
+ predeclare(statement, context) {
40
+ if (!isWebStatement(statement))
41
+ return false;
42
+ if (statement.kind === "ExtensionStatement:web:action") {
43
+ context.declare(statement, statement.name, "extension:function:web-action", statement.span, context.nameSpan(statement.span, statement.name), { exported: statement.exported });
44
+ return true;
45
+ }
46
+ if (statement.kind === "ExtensionStatement:web:component") {
47
+ context.declare(statement, statement.name, "extension:function:web-component", statement.span, context.nameSpan(statement.span, statement.name), {
48
+ exported: statement.exported,
49
+ presentationKind: "class",
50
+ });
51
+ return true;
52
+ }
53
+ return false;
54
+ },
55
+ visitExpression(expression, context) {
56
+ if (isWebJsx(expression)) {
57
+ visitJsx(expression, context);
58
+ return true;
59
+ }
60
+ if (isWebLook(expression)) {
61
+ const visit = (entries) => {
62
+ for (const entry of entries) {
63
+ if (entry.kind === "LookProperty" || entry.kind === "LookSpread")
64
+ context.visitExpression(entry.value);
65
+ else if (entry.kind === "LookIf") {
66
+ context.visitExpression(entry.condition);
67
+ visit(entry.thenEntries);
68
+ visit(entry.elseEntries);
69
+ }
70
+ else
71
+ visit(entry.entries);
72
+ }
73
+ };
74
+ visit(expression.entries);
75
+ return true;
76
+ }
77
+ if (isWebKeyframes(expression)) {
78
+ for (const stop of expression.stops)
79
+ for (const entry of stop.entries)
80
+ context.visitExpression(entry.value);
81
+ return true;
82
+ }
83
+ return isWebUnit(expression) || (isWebExpression(expression) && expression.kind === "ExtensionExpression:web:look-hook");
84
+ },
85
+ visitStatement(statement, context) {
86
+ if (!isWebStatement(statement))
87
+ return false;
88
+ switch (statement.kind) {
89
+ case "ExtensionStatement:web:unsafe-css":
90
+ // Its payload is opaque CSS for editor language injection, never a
91
+ // VelarScript expression or reference graph.
92
+ return true;
93
+ case "ExtensionStatement:web:component":
94
+ context.enterScope(statement.span);
95
+ context.typeReferences(statement.handleType);
96
+ for (const parameter of statement.parameters) {
97
+ if (parameter.defaultValue)
98
+ context.visitExpression(parameter.defaultValue);
99
+ context.typeReferences(parameter.type);
100
+ context.declare(parameter, parameter.name, "parameter", parameter.span, { start: parameter.span.start, end: parameter.span.start + parameter.name.length }, { container: statement.name });
101
+ }
102
+ for (const item of statement.body) {
103
+ if (item.kind === "ExtensionStatement:web:mounted" || item.kind === "ExtensionStatement:web:cleanup")
104
+ context.visitBlock(item.body, item.span);
105
+ else if (item.kind === "ExtensionStatement:web:expose")
106
+ context.visitExpression(item.value);
107
+ else
108
+ context.visitStatement(item);
109
+ }
110
+ context.exitScope();
111
+ return true;
112
+ case "ExtensionStatement:web:state": {
113
+ context.visitExpression(statement.initializer);
114
+ context.typeReferences(statement.type);
115
+ context.declare(statement, statement.name, "extension:variable:web-state", statement.span, context.nameSpan(statement.span, statement.name), {
116
+ exported: statement.exported,
117
+ mutable: true,
118
+ sourceTypeHint: true,
119
+ });
120
+ return true;
121
+ }
122
+ case "ExtensionStatement:web:computed": {
123
+ context.visitExpression(statement.initializer);
124
+ context.typeReferences(statement.type);
125
+ context.declare(statement, statement.name, "extension:variable:web-computed", statement.span, context.nameSpan(statement.span, statement.name), {
126
+ exported: statement.exported,
127
+ mutable: false,
128
+ sourceTypeHint: true,
129
+ });
130
+ return true;
131
+ }
132
+ case "ExtensionStatement:web:resource":
133
+ context.visitExpression(statement.initializer);
134
+ context.typeReferences(statement.type);
135
+ context.declare(statement, statement.name, "extension:variable:web-resource", statement.span, context.nameSpan(statement.span, statement.name));
136
+ return true;
137
+ case "ExtensionStatement:web:action":
138
+ if (!context.hasDeclaration(statement))
139
+ context.declare(statement, statement.name, "extension:function:web-action", statement.span, context.nameSpan(statement.span, statement.name), { exported: statement.exported });
140
+ context.visitFunction(statement);
141
+ return true;
142
+ case "ExtensionStatement:web:watch":
143
+ visitWatch(statement, context);
144
+ return true;
145
+ default:
146
+ return false;
147
+ }
148
+ },
149
+ });
150
+ //# sourceMappingURL=semantic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../src/semantic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { type ExtensionTypeSyntaxResolver, type ExtensionValueType, type ValueType } from "@velarscript/compiler/extension";
2
+ export declare const VELAR_WEB_TYPE_EXTENSION_ID = "@velarscript/web";
3
+ /**
4
+ * D72 rule 186: every type name the Web extension publishes, in one table.
5
+ *
6
+ * It is the single source for three things that used to be written out
7
+ * separately and therefore drifted: the analysis contract's `primitiveTypes`,
8
+ * the `textForm` question, and the refusal of a user declaration that would
9
+ * shadow one of these names. D51 rule 109 settled that such a name is refused
10
+ * where it is introduced rather than where it is used — the use site can only
11
+ * report an ambiguity nobody can act on — and this is what makes that refusal
12
+ * follow the table instead of a hand-copied list of six event types.
13
+ *
14
+ * `Component` and `WebNode` belong here for the same reason the rest do: a user
15
+ * `type Component:` loses to the extension's reading at every use.
16
+ */
17
+ export declare const WEB_OWNED_TYPE_NAMES: ReadonlySet<string>;
18
+ /** The Web event hierarchy, derived from the published table rather than restated. */
19
+ export declare const WEB_EVENT_TYPE_NAMES: ReadonlySet<string>;
20
+ /**
21
+ * D71 rule 184: the interface annotation that says an export is a `computed`
22
+ * declaration rather than a `state` one. Both travel through `reactiveExports`
23
+ * so an imported bare read lowers through `.get()`, and this is what tells the
24
+ * importing module that the derived one is read-only — without it, `bind={...}`
25
+ * on an imported derived value would compile to a write nothing receives.
26
+ */
27
+ export declare const WEB_COMPUTED_EXPORT: Readonly<{
28
+ velarWebExport: "computed";
29
+ }>;
30
+ export declare function isWebComputedExport(value: unknown): boolean;
31
+ export declare const CACHED_INTRINSIC_TYPE: ValueType;
32
+ export type WebExtensionType = ExtensionValueType & {
33
+ readonly extensionId: typeof VELAR_WEB_TYPE_EXTENSION_ID;
34
+ };
35
+ export type WebNodeType = WebExtensionType & {
36
+ readonly family: "node";
37
+ readonly role: "value";
38
+ };
39
+ export type WebComponentType = WebExtensionType & {
40
+ readonly family: "component";
41
+ readonly role: "contract" | "constructor";
42
+ };
43
+ export declare const webNodeType: WebNodeType;
44
+ export declare function webComponentContract(properties?: ReadonlyMap<string, ValueType>, requiredProperties?: ReadonlySet<string>, handle?: ValueType | null): WebComponentType;
45
+ export declare function webComponentConstructor(name: string, properties: ReadonlyMap<string, ValueType>, requiredProperties: ReadonlySet<string>, handle: ValueType | null, intrinsic?: string): WebComponentType;
46
+ export declare function isWebExtensionType(type: ValueType): type is WebExtensionType;
47
+ export declare function isWebNodeType(type: ValueType): type is WebNodeType;
48
+ export declare function isWebComponentType(type: ValueType): type is WebComponentType;
49
+ export declare function isWebComponentConstructor(type: ValueType): type is WebComponentType;
50
+ export declare function webComponentName(type: WebComponentType): string | null;
51
+ export declare function webComponentHandle(type: WebComponentType): ValueType | null;
52
+ export declare function webComponentIntrinsic(type: WebComponentType): string | null;
53
+ export declare const resolveWebTypeSyntax: ExtensionTypeSyntaxResolver;
54
+ export declare function normalizeWebComponentType(type: WebComponentType, normalizeProperty: (type: ValueType) => ValueType, normalizeArgument?: (type: ValueType) => ValueType): WebComponentType;
55
+ export declare function isWebTypeAssignable(actual: ExtensionValueType, expected: ExtensionValueType, assign: (actual: ValueType, expected: ValueType) => boolean): boolean | undefined;
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACf,MAAM,iCAAiC,CAAC;AAGzC,eAAO,MAAM,2BAA2B,qBAAqB,CAAC;AAE9D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAMnD,CAAC;AAEH,sFAAsF;AACtF,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAEpD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB;oBAAmC,UAAU;EAAY,CAAC;AAE1F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAG3D;AAWD,eAAO,MAAM,qBAAqB,EAAE,SAOlC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,OAAO,2BAA2B,CAAA;CAAE,CAAC;AACjH,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AACjG,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CAAA;CAAE,CAAC;AAE9H,eAAO,MAAM,WAAW,EAAE,WASxB,CAAC;AAYH,wBAAgB,oBAAoB,CAClC,UAAU,GAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAa,EACtD,kBAAkB,GAAE,WAAW,CAAC,MAAM,CAAa,EACnD,MAAM,GAAE,SAAS,GAAG,IAAW,GAC9B,gBAAgB,CAYlB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1C,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,EACvC,MAAM,EAAE,SAAS,GAAG,IAAI,EACxB,SAAS,CAAC,EAAE,MAAM,GACjB,gBAAgB,CAalB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,gBAAgB,CAE5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,WAAW,CAElE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,gBAAgB,CAG5E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,IAAI,gBAAgB,CAEnF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAItE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,CAE3E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAE3E;AAED,eAAO,MAAM,oBAAoB,EAAE,2BAiBlC,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,EACtB,iBAAiB,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,EACjD,iBAAiB,GAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAA6B,GACpE,gBAAgB,CAWlB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,KAAK,OAAO,GAC1D,OAAO,GAAG,SAAS,CAerB"}
package/dist/types.js ADDED
@@ -0,0 +1,178 @@
1
+ import { optionalOf, stringType, } from "@velarscript/compiler/extension";
2
+ import { LOOK_PUBLIC_TYPE_NAMES } from "./look.js";
3
+ export const VELAR_WEB_TYPE_EXTENSION_ID = "@velarscript/web";
4
+ /**
5
+ * D72 rule 186: every type name the Web extension publishes, in one table.
6
+ *
7
+ * It is the single source for three things that used to be written out
8
+ * separately and therefore drifted: the analysis contract's `primitiveTypes`,
9
+ * the `textForm` question, and the refusal of a user declaration that would
10
+ * shadow one of these names. D51 rule 109 settled that such a name is refused
11
+ * where it is introduced rather than where it is used — the use site can only
12
+ * report an ambiguity nobody can act on — and this is what makes that refusal
13
+ * follow the table instead of a hand-copied list of six event types.
14
+ *
15
+ * `Component` and `WebNode` belong here for the same reason the rest do: a user
16
+ * `type Component:` loses to the extension's reading at every use.
17
+ */
18
+ export const WEB_OWNED_TYPE_NAMES = new Set([
19
+ "WebNode", "Component",
20
+ "Element", "InputElement", "TextAreaElement", "CanvasElement", "DialogElement",
21
+ "Blob", "File",
22
+ "Event", "KeyboardEvent", "PointerEvent", "InputEvent", "CompositionEvent", "ClipboardEvent",
23
+ ...LOOK_PUBLIC_TYPE_NAMES,
24
+ ]);
25
+ /** The Web event hierarchy, derived from the published table rather than restated. */
26
+ export const WEB_EVENT_TYPE_NAMES = new Set([...WEB_OWNED_TYPE_NAMES].filter((name) => name === "Event" || name.endsWith("Event")));
27
+ /**
28
+ * D71 rule 184: the interface annotation that says an export is a `computed`
29
+ * declaration rather than a `state` one. Both travel through `reactiveExports`
30
+ * so an imported bare read lowers through `.get()`, and this is what tells the
31
+ * importing module that the derived one is read-only — without it, `bind={...}`
32
+ * on an imported derived value would compile to a write nothing receives.
33
+ */
34
+ export const WEB_COMPUTED_EXPORT = Object.freeze({ velarWebExport: "computed" });
35
+ export function isWebComputedExport(value) {
36
+ return typeof value === "object" && value !== null
37
+ && value.velarWebExport === "computed";
38
+ }
39
+ /**
40
+ * D71 rule 183: `cached(read)` returns the reader it caches. The retired
41
+ * `computed(...)` spelling is inferred as the same intrinsic while its
42
+ * migration diagnostic is produced, so the rest of the module still type-checks
43
+ * against one truthful signature rather than against an unknown name.
44
+ */
45
+ const cachedUnknownType = Object.freeze({ kind: "unknown" });
46
+ const cachedReaderType = Object.freeze({ kind: "function", parameters: [], requiredParameters: 0, result: cachedUnknownType });
47
+ export const CACHED_INTRINSIC_TYPE = Object.freeze({
48
+ kind: "intrinsic",
49
+ name: "reactive.computed",
50
+ parameterNames: ["read"],
51
+ parameters: [cachedReaderType],
52
+ requiredParameters: 1,
53
+ result: cachedReaderType,
54
+ });
55
+ export const webNodeType = Object.freeze({
56
+ kind: "extension",
57
+ extensionId: VELAR_WEB_TYPE_EXTENSION_ID,
58
+ family: "node",
59
+ role: "value",
60
+ properties: new Map(),
61
+ requiredProperties: new Set(),
62
+ arguments: [],
63
+ display: { kind: "named", name: "WebNode" },
64
+ });
65
+ const componentDisplay = Object.freeze({
66
+ kind: "properties",
67
+ name: "Component",
68
+ result: "WebNode",
69
+ hiddenOptionalProperties: new Map([
70
+ ["class", "string?"],
71
+ ["look", "Look?"],
72
+ ]),
73
+ });
74
+ export function webComponentContract(properties = new Map(), requiredProperties = new Set(), handle = null) {
75
+ return {
76
+ kind: "extension",
77
+ extensionId: VELAR_WEB_TYPE_EXTENSION_ID,
78
+ family: "component",
79
+ role: "contract",
80
+ properties,
81
+ requiredProperties,
82
+ arguments: handle ? [handle] : [],
83
+ metadata: { semanticSymbolKind: "extension:function:web-component" },
84
+ display: componentDisplay,
85
+ };
86
+ }
87
+ export function webComponentConstructor(name, properties, requiredProperties, handle, intrinsic) {
88
+ return {
89
+ kind: "extension",
90
+ extensionId: VELAR_WEB_TYPE_EXTENSION_ID,
91
+ family: "component",
92
+ role: "constructor",
93
+ nominal: name,
94
+ properties,
95
+ requiredProperties,
96
+ arguments: handle ? [handle] : [],
97
+ metadata: { semanticSymbolKind: "extension:function:web-component", ...(intrinsic ? { intrinsic } : {}) },
98
+ display: { kind: "constructor", prefix: "component", name },
99
+ };
100
+ }
101
+ export function isWebExtensionType(type) {
102
+ return type.kind === "extension" && type.extensionId === VELAR_WEB_TYPE_EXTENSION_ID;
103
+ }
104
+ export function isWebNodeType(type) {
105
+ return isWebExtensionType(type) && type.family === "node" && type.role === "value";
106
+ }
107
+ export function isWebComponentType(type) {
108
+ return isWebExtensionType(type) && type.family === "component"
109
+ && (type.role === "contract" || type.role === "constructor");
110
+ }
111
+ export function isWebComponentConstructor(type) {
112
+ return isWebComponentType(type) && type.role === "constructor";
113
+ }
114
+ export function webComponentName(type) {
115
+ return type.role === "constructor"
116
+ ? type.nominal ?? (type.display.kind === "constructor" ? type.display.name : null)
117
+ : null;
118
+ }
119
+ export function webComponentHandle(type) {
120
+ return type.arguments[0] ?? null;
121
+ }
122
+ export function webComponentIntrinsic(type) {
123
+ return type.metadata?.intrinsic ?? null;
124
+ }
125
+ export const resolveWebTypeSyntax = (syntax, resolve) => {
126
+ if (syntax.kind === "NamedTypeSyntax") {
127
+ if (syntax.name === "WebNode")
128
+ return webNodeType;
129
+ if (syntax.name === "Component")
130
+ return webComponentContract();
131
+ return undefined;
132
+ }
133
+ if (syntax.kind !== "GenericTypeSyntax" || syntax.name !== "Component")
134
+ return undefined;
135
+ const signature = syntax.arguments[0];
136
+ if (signature?.kind !== "FunctionTypeSyntax" || signature.parameters.some((parameter) => !parameter.name)) {
137
+ return webComponentContract();
138
+ }
139
+ const parameters = signature.parameters.filter((parameter) => !parameter.rest);
140
+ return webComponentContract(new Map(parameters.map((parameter) => [parameter.name, resolve(parameter.type)])), new Set(parameters.filter((parameter) => !parameter.optional).map((parameter) => parameter.name)), syntax.arguments[1] ? resolve(syntax.arguments[1]) : null);
141
+ };
142
+ export function normalizeWebComponentType(type, normalizeProperty, normalizeArgument = normalizeProperty) {
143
+ const properties = new Map([...type.properties]
144
+ .map(([name, value]) => [name, normalizeProperty(value)]));
145
+ if (!properties.has("class"))
146
+ properties.set("class", optionalOf(stringType));
147
+ if (!properties.has("look"))
148
+ properties.set("look", optionalOf({ kind: "named", name: "Look" }));
149
+ const handle = webComponentHandle(type);
150
+ return {
151
+ ...type,
152
+ properties,
153
+ arguments: handle ? [normalizeArgument(handle)] : [],
154
+ };
155
+ }
156
+ export function isWebTypeAssignable(actual, expected, assign) {
157
+ if (actual.extensionId !== VELAR_WEB_TYPE_EXTENSION_ID || expected.extensionId !== VELAR_WEB_TYPE_EXTENSION_ID)
158
+ return undefined;
159
+ if (actual.family !== expected.family)
160
+ return false;
161
+ if (actual.family === "node")
162
+ return actual.role === "value" && expected.role === "value";
163
+ if (actual.family !== "component" || expected.family !== "component")
164
+ return false;
165
+ for (const required of actual.requiredProperties) {
166
+ if (!expected.requiredProperties.has(required))
167
+ return false;
168
+ }
169
+ for (const [name, supplied] of expected.properties) {
170
+ const accepted = actual.properties.get(name);
171
+ if (!accepted || !assign(supplied, accepted))
172
+ return false;
173
+ }
174
+ const actualHandle = actual.arguments[0];
175
+ const expectedHandle = expected.arguments[0];
176
+ return !expectedHandle || !!actualHandle && assign(actualHandle, expectedHandle);
177
+ }
178
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VELAR_WEB_WEBSOCKET_RUNTIME: string;
2
+ //# sourceMappingURL=websocket-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-runtime.d.ts","sourceRoot":"","sources":["../src/websocket-runtime.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,QA4B3B,CAAC"}
@@ -0,0 +1,30 @@
1
+ export const VELAR_WEB_WEBSOCKET_RUNTIME = String.raw `
2
+ const __velarNativeWebSocket = globalThis.WebSocket;
3
+ const __velarWebSocketConnections = new WeakMap();
4
+ function __velarWsInteger(value, fallback, minimum, maximum, name) { if (value === undefined || value === null) return fallback; if (!Number.isSafeInteger(value) || value < minimum || value > maximum) throw new RangeError(name + " must be an integer from " + minimum + " through " + maximum); return value; }
5
+ function __velarWsDuration(value, fallback) { if (value === undefined || value === null) return fallback; if (typeof value !== "string") throw new TypeError("WebSocket timeout must be Duration"); const match = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(ms|s)$/.exec(value); if (!match) throw new TypeError("WebSocket timeout must be Duration such as 5s"); const result = Number(match[1]) * (match[2] === "s" ? 1000 : 1); if (!Number.isFinite(result) || result < 0 || result > 2147483647) throw new RangeError("WebSocket timeout is outside the supported range"); return result; }
6
+ function __velarWsOptions(options = {}) { if (options === null || typeof options !== "object" || Array.isArray(options)) throw new TypeError("WebSocket options must be a record"); return { maxMessageBytes: __velarWsInteger(options.maxMessageBytes, 16 * 1024 * 1024, 1, 64 * 1024 * 1024, "maxMessageBytes"), maxQueuedMessages: __velarWsInteger(options.maxQueuedMessages, 256, 1, 10000, "maxQueuedMessages"), maxQueuedBytes: __velarWsInteger(options.maxQueuedBytes, 16 * 1024 * 1024, 1, 64 * 1024 * 1024, "maxQueuedBytes"), maxPendingSendBytes: __velarWsInteger(options.maxPendingSendBytes, 16 * 1024 * 1024, 1, 64 * 1024 * 1024, "maxPendingSendBytes") }; }
7
+ function __velarWsUtf8(value) { return new TextEncoder().encode(value).byteLength; }
8
+ function __velarWsBytes(value) { if (!(value instanceof Uint8Array)) return null; const output = new Uint8Array(value.byteLength); output.set(value); return output; }
9
+ export class WebSocketBackpressureError extends Error { constructor(message = "WebSocket backpressure limit exceeded") { super(message); this.name = "WebSocketBackpressureError"; } }
10
+ export class WebSocketClosedError extends Error { constructor(message = "WebSocket is closed") { super(message); this.name = "WebSocketClosedError"; } }
11
+ export class WebSocketProtocolError extends Error { constructor(message = "WebSocket protocol error") { super(message); this.name = "WebSocketProtocolError"; } }
12
+ export class WebSocketTimeoutError extends Error { constructor(message = "WebSocket timed out") { super(message); this.name = "WebSocketTimeoutError"; } }
13
+ function __velarWsFinish(state) { if (state.finished) return; state.finished = true; if (state.waiter) { state.waiter.resolve(null); state.waiter = null; } }
14
+ function __velarWsAbort(state) { state.finished = true; state.queue.length = 0; state.queuedBytes = 0; if (state.waiter) { state.waiter.resolve(null); state.waiter = null; } }
15
+ function __velarWsRejectReceive(state, socket, code, reason) { __velarWsAbort(state); socket.close(code, reason); }
16
+ function __velarWsWrap(socket, options) { const value = Object.create(__velarWsConnectionPrototype); const state = { socket, options, queue: [], queuedBytes: 0, waiter: null, finished: false, closePromise: null, sendWaiters: new Set() }; __velarWebSocketConnections.set(value, state); socket.binaryType = "arraybuffer";
17
+ socket.addEventListener("message", event => { if (state.finished) return; let message; let size; if (typeof event.data === "string") { size = __velarWsUtf8(event.data); if (size > options.maxMessageBytes) { __velarWsRejectReceive(state, socket, 4009, "Message too large"); return; } message = event.data; } else if (event.data instanceof ArrayBuffer) { size = event.data.byteLength; if (size > options.maxMessageBytes) { __velarWsRejectReceive(state, socket, 4009, "Message too large"); return; } message = new Uint8Array(event.data); } else { __velarWsRejectReceive(state, socket, 4003, "Unsupported message type"); return; } if (state.waiter) { const waiter = state.waiter; state.waiter = null; waiter.resolve(message); } else if (state.queue.length >= options.maxQueuedMessages || state.queuedBytes + size > options.maxQueuedBytes) __velarWsRejectReceive(state, socket, 4009, "Unread message queue full"); else { state.queue.push(message); state.queuedBytes += size; } });
18
+ socket.addEventListener("close", () => { __velarWsFinish(state); for (const reject of state.sendWaiters) reject(new WebSocketClosedError()); state.sendWaiters.clear(); }); socket.addEventListener("error", () => { if (state.waiter) { state.waiter.reject(new WebSocketProtocolError()); state.waiter = null; } __velarWsAbort(state); }); return Object.freeze(value); }
19
+ const __velarWsConnectionPrototype = Object.freeze({
20
+ state() { const state = __velarWebSocketConnections.get(this); if (!state) throw new TypeError("WebSocket state requires a connection"); return state.socket.readyState === __velarNativeWebSocket.CONNECTING ? "connecting" : state.socket.readyState === __velarNativeWebSocket.OPEN ? "open" : state.socket.readyState === __velarNativeWebSocket.CLOSING ? "closing" : "closed"; },
21
+ send(message) { const state = __velarWebSocketConnections.get(this); if (!state) throw new TypeError("WebSocket.send requires a connection"); if (state.socket.readyState !== __velarNativeWebSocket.OPEN) return Promise.reject(new WebSocketClosedError()); const bytes = typeof message === "string" ? null : __velarWsBytes(message); if (bytes === null && typeof message !== "string") return Promise.reject(new TypeError("WebSocket.send requires text or Bytes")); const size = bytes?.byteLength ?? __velarWsUtf8(message); if (size > state.options.maxMessageBytes) return Promise.reject(new RangeError("WebSocket message exceeds maxMessageBytes")); if (state.socket.bufferedAmount + size > state.options.maxPendingSendBytes) return Promise.reject(new WebSocketBackpressureError()); state.socket.send(bytes ?? message); return new Promise((resolve, reject) => { state.sendWaiters.add(reject); const poll = () => { if (state.finished) { state.sendWaiters.delete(reject); reject(new WebSocketClosedError()); } else if (state.socket.bufferedAmount === 0) { state.sendWaiters.delete(reject); resolve(null); } else setTimeout(poll, 1); }; poll(); }); },
22
+ next() { const state = __velarWebSocketConnections.get(this); if (!state) throw new TypeError("WebSocket.next requires a connection"); if (state.queue.length) { const message = state.queue.shift(); state.queuedBytes -= typeof message === "string" ? __velarWsUtf8(message) : message.byteLength; return Promise.resolve(message); } if (state.finished) return Promise.resolve(null); if (state.waiter) return Promise.reject(new WebSocketBackpressureError("Only one WebSocket.next call may wait at a time")); return new Promise((resolve, reject) => { state.waiter = { resolve, reject }; }); },
23
+ close(code = 1000, reason = "") { const state = __velarWebSocketConnections.get(this); if (!state) throw new TypeError("WebSocket.close requires a connection"); if (!Number.isSafeInteger(code) || code < 1000 || code > 4999) return Promise.reject(new RangeError("WebSocket close code must be from 1000 through 4999")); if (typeof reason !== "string" || __velarWsUtf8(reason) > 123) return Promise.reject(new RangeError("WebSocket close reason cannot exceed 123 UTF-8 bytes")); if (state.finished) return Promise.resolve(null); if (!state.closePromise) { state.closePromise = new Promise(resolve => state.socket.addEventListener("close", () => resolve(null), { once: true })); state.socket.close(code, reason); } return state.closePromise; },
24
+ });
25
+ const __velarWsConnectionType = Object.freeze({ is(value) { return __velarWebSocketConnections.has(value); }, parse(value) { if (!this.is(value)) throw new TypeError("Value does not match WebSocketConnection"); return value; } });
26
+ export const WebSocketConnection = __velarWsConnectionType; export const WebSocketServer = Object.freeze({ is() { return false; }, parse() { throw new TypeError("WebSocketServer is available only on Node"); } });
27
+ export function connect(url, options = {}) { if (typeof __velarNativeWebSocket !== "function") return Promise.reject(new Error("The browser WebSocket API is unavailable")); if (typeof url !== "string" || !/^wss?:\/\//u.test(url)) return Promise.reject(new TypeError("WebSocket URL must start with ws:// or wss://")); const limits = __velarWsOptions(options); const timeout = __velarWsDuration(options.timeout, 10000); return new Promise((resolve, reject) => { const socket = new __velarNativeWebSocket(url); const timer = setTimeout(() => { socket.close(); reject(new WebSocketTimeoutError("WebSocket connection timed out")); }, timeout); socket.addEventListener("open", () => { clearTimeout(timer); resolve(__velarWsWrap(socket, limits)); }, { once: true }); socket.addEventListener("error", () => { clearTimeout(timer); reject(new WebSocketProtocolError("WebSocket connection failed")); }, { once: true }); }); }
28
+ export function listen() { return Promise.reject(new Error("WebSocket.listen is available only on Node")); }
29
+ `.trimStart();
30
+ //# sourceMappingURL=websocket-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-runtime.js","sourceRoot":"","sources":["../src/websocket-runtime.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BpD,CAAC,SAAS,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VELAR_WEB_WORKER_RUNTIME: string;
2
+ //# sourceMappingURL=worker-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-runtime.d.ts","sourceRoot":"","sources":["../src/worker-runtime.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,QAsExB,CAAC"}
@@ -0,0 +1,72 @@
1
+ export const VELAR_WEB_WORKER_RUNTIME = String.raw `
2
+ import { workerEntries as __velarWorkerEntries } from "velar/worker-manifest";
3
+ import { Cancellation, CancellationError, TaskTimeoutError } from "velar/task";
4
+
5
+ const __velarNativeWorker = globalThis.Worker;
6
+ const __velarWorkerStates = new WeakMap();
7
+ const __velarWorkerPoolStates = new WeakMap();
8
+ let __velarWorkerServerInstalled = false;
9
+ const __velarWorkerStructuredClone = globalThis.structuredClone;
10
+ function __velarWorkerInteger(value, minimum, maximum, name) { if (!Number.isSafeInteger(value) || value < minimum || value > maximum) throw new RangeError(name + " must be an integer from " + minimum + " through " + maximum); return value; }
11
+ function __velarWorkerRuntimeType(value, name) { if ((typeof value !== "object" && typeof value !== "function") || value === null || typeof value.parse !== "function" || typeof value.is !== "function") throw new TypeError(name + " must be a runtime Type"); return value; }
12
+ function __velarWorkerDuration(value) { if (value === null) return 0; if (typeof value !== "string") throw new TypeError("Worker timeout must be Duration or null"); const match = /^([+-]?(?:\d+(?:\.\d+)?|\.\d+))(ms|s)$/.exec(value); if (!match) throw new TypeError("Worker timeout must be Duration such as 200ms or 2s"); const milliseconds = Number(match[1]) * (match[2] === "s" ? 1000 : 1); if (!Number.isFinite(milliseconds) || milliseconds < 0 || milliseconds > 2147483647) throw new RangeError("Worker timeout is outside the supported range"); return milliseconds; }
13
+ function __velarWorkerTransfer(value) {
14
+ const transfers = []; const buffers = new Set(); const objects = new Set(); const pending = [{ value, depth: 0 }]; let visited = 0; let transferBytes = 0;
15
+ while (pending.length > 0 && visited < 10000 && transfers.length < 1024) {
16
+ const current = pending.pop(); const item = current.value; visited += 1;
17
+ if (item === null || (typeof item !== "object" && typeof item !== "function") || objects.has(item)) continue; objects.add(item);
18
+ if (ArrayBuffer.isView(item)) { const supported = item instanceof Uint8Array || item instanceof Uint16Array || item instanceof Uint32Array || item instanceof Float32Array; const buffer = item.buffer; if (supported && buffer instanceof ArrayBuffer && item.byteOffset === 0 && item.byteLength === buffer.byteLength && buffer.byteLength > 0 && transferBytes + buffer.byteLength <= 64 * 1024 * 1024 && !buffers.has(buffer)) { buffers.add(buffer); transfers.push(buffer); transferBytes += buffer.byteLength; } continue; }
19
+ if (current.depth >= 32) continue; const depth = current.depth + 1;
20
+ if (item instanceof Map) { for (const [key, nested] of item) pending.push({ value: key, depth }, { value: nested, depth }); continue; }
21
+ if (item instanceof Set) { for (const nested of item) pending.push({ value: nested, depth }); continue; }
22
+ for (const key of Object.keys(item)) pending.push({ value: item[key], depth });
23
+ }
24
+ return transfers;
25
+ }
26
+ function __velarWorkerOutbound(value) {
27
+ const sourceTransfers = __velarWorkerTransfer(value);
28
+ if (sourceTransfers.length === 0) return { value, transfers: sourceTransfers };
29
+ if (typeof __velarWorkerStructuredClone !== "function") throw new Error("The structured clone API is unavailable");
30
+ const snapshot = __velarWorkerStructuredClone(value);
31
+ return { value: snapshot, transfers: __velarWorkerTransfer(snapshot) };
32
+ }
33
+ function __velarWorkerFailure(error) { return { name: typeof error?.name === "string" ? error.name : "Error", message: typeof error?.message === "string" ? error.message : String(error), stack: typeof error?.stack === "string" ? error.stack : "" }; }
34
+ export class WorkerBackpressureError extends Error { constructor(message = "Worker queue is full") { super(message); this.name = "WorkerBackpressureError"; } }
35
+ export class WorkerCallError extends Error { constructor(message = "Worker call failed") { super(message); this.name = "WorkerCallError"; } }
36
+ export class WorkerCrashedError extends Error { constructor(message = "Worker crashed") { super(message); this.name = "WorkerCrashedError"; } }
37
+ export class WorkerClosedError extends Error { constructor(message = "Worker is closed") { super(message); this.name = "WorkerClosedError"; } }
38
+ function __velarWorkerRejectAll(state, failure) { if (state.closed) return; state.closed = true; for (const pending of state.pending.values()) { if (pending.timer) clearTimeout(pending.timer); pending.unsubscribe(); pending.reject(failure); } state.pending.clear(); }
39
+ const __velarWorkerPrototype = Object.freeze({
40
+ call(request, cancellation = null, timeout = null) {
41
+ const state = __velarWorkerStates.get(this); if (!state) throw new TypeError("Worker.call requires a Worker receiver"); if (state.closed) return Promise.reject(new WorkerClosedError());
42
+ if (state.pending.size >= state.capacity) return Promise.reject(new WorkerBackpressureError("Worker queue capacity " + state.capacity + " is full"));
43
+ if (cancellation !== null && !Cancellation.is(cancellation)) return Promise.reject(new TypeError("Worker cancellation must be Cancellation or null"));
44
+ let validated; try { validated = state.RequestType.parse(request); } catch (error) { return Promise.reject(error); }
45
+ let outbound; try { outbound = __velarWorkerOutbound(validated); } catch (error) { return Promise.reject(error); }
46
+ const milliseconds = __velarWorkerDuration(timeout); const id = state.nextId++;
47
+ return new Promise((resolve, reject) => { const pending = { resolve, reject, cancel: null, reason: "Worker call cancelled", timeout, timer: null, unsubscribe: () => null }; state.pending.set(id, pending); state.instance.postMessage({ kind: "call", id, value: outbound.value }, outbound.transfers); if (cancellation !== null) pending.unsubscribe = Cancellation.__velarOn(cancellation, reason => { if (!state.pending.has(id) || pending.cancel) return; pending.cancel = "cancel"; pending.reason = reason ?? pending.reason; state.instance.postMessage({ kind: "cancel", id, reason: pending.reason }); }); if (milliseconds > 0) pending.timer = setTimeout(() => { if (!state.pending.has(id) || pending.cancel) return; pending.cancel = "timeout"; state.instance.postMessage({ kind: "cancel", id, reason: "Worker call timed out" }); }, milliseconds); });
48
+ },
49
+ async close() { const state = __velarWorkerStates.get(this); if (!state) throw new TypeError("Worker.close requires a Worker receiver"); if (state.closed) return null; __velarWorkerRejectAll(state, new WorkerClosedError()); state.instance.terminate(); return null; },
50
+ });
51
+ function __velarWorkerClient(name, RequestType, ResponseType, capacity) {
52
+ if (typeof __velarNativeWorker !== "function") throw new Error("The browser Worker API is unavailable"); if (typeof name !== "string" || !Object.hasOwn(__velarWorkerEntries, name)) throw new RangeError("Unknown worker entry '" + String(name) + "'"); RequestType = __velarWorkerRuntimeType(RequestType, "Worker request Type"); ResponseType = __velarWorkerRuntimeType(ResponseType, "Worker response Type"); capacity = __velarWorkerInteger(capacity, 1, 10000, "Worker capacity");
53
+ const instance = new __velarNativeWorker(new URL("../" + __velarWorkerEntries[name], import.meta.url), { type: "module", name: "velar:" + name }); const value = Object.create(__velarWorkerPrototype); const state = { instance, RequestType, ResponseType, capacity, nextId: 1, pending: new Map(), closed: false }; __velarWorkerStates.set(value, state);
54
+ instance.addEventListener("message", event => { const message = event.data; if (!message || !Number.isSafeInteger(message.id)) { __velarWorkerRejectAll(state, new WorkerCrashedError("Worker returned an invalid message")); instance.terminate(); return; } const pending = state.pending.get(message.id); if (!pending) return; state.pending.delete(message.id); if (pending.timer) clearTimeout(pending.timer); pending.unsubscribe(); if (pending.cancel === "timeout") { pending.reject(new TaskTimeoutError("Worker call timed out after " + pending.timeout)); return; } if (pending.cancel === "cancel") { pending.reject(new CancellationError(pending.reason)); return; } if (!message.ok) { const remote = message.error ?? {}; const failure = new WorkerCallError((remote.name ? remote.name + ": " : "") + (remote.message ?? "Worker call failed")); if (typeof remote.stack === "string" && remote.stack) failure.stack += "\nRemote worker:\n" + remote.stack; pending.reject(failure); return; } try { pending.resolve(state.ResponseType.parse(message.value)); } catch (error) { pending.reject(error); } });
55
+ instance.addEventListener("error", event => __velarWorkerRejectAll(state, new WorkerCrashedError(event.message || "Worker crashed"))); instance.addEventListener("messageerror", () => __velarWorkerRejectAll(state, new WorkerCrashedError("Worker returned an unreadable message"))); return Object.freeze(value);
56
+ }
57
+ const __velarWorkerPoolPrototype = Object.freeze({
58
+ call(request, cancellation = null, timeout = null) { const state = __velarWorkerPoolStates.get(this); if (!state) throw new TypeError("WorkerPool.call requires a WorkerPool receiver"); if (state.closed) return Promise.reject(new WorkerClosedError("Worker pool is closed")); const total = state.workers.reduce((sum, item) => sum + __velarWorkerStates.get(item).pending.size, 0); if (total >= state.capacity) return Promise.reject(new WorkerBackpressureError("Worker pool queue capacity " + state.capacity + " is full")); let selected = state.workers[0]; for (const item of state.workers) if (__velarWorkerStates.get(item).pending.size < __velarWorkerStates.get(selected).pending.size) selected = item; return selected.call(request, cancellation, timeout); },
59
+ async close() { const state = __velarWorkerPoolStates.get(this); if (!state) throw new TypeError("WorkerPool.close requires a WorkerPool receiver"); if (state.closed) return null; state.closed = true; await Promise.all(state.workers.map(item => item.close())); return null; },
60
+ });
61
+ const __velarWorkerType = Object.freeze({ is(value) { return __velarWorkerStates.has(value); }, parse(value) { if (!this.is(value)) throw new TypeError("Value does not match Worker"); return value; } });
62
+ const __velarWorkerPoolType = Object.freeze({ is(value) { return __velarWorkerPoolStates.has(value); }, parse(value) { if (!this.is(value)) throw new TypeError("Value does not match WorkerPool"); return value; } });
63
+ export const Worker = Object.freeze({ ...__velarWorkerType, of() { return __velarWorkerType; } }); export const WorkerPool = Object.freeze({ ...__velarWorkerPoolType, of() { return __velarWorkerPoolType; } });
64
+ export function worker(name, RequestType, ResponseType, capacity = 64) { return __velarWorkerClient(name, RequestType, ResponseType, capacity); }
65
+ export function workerPool(name, RequestType, ResponseType, size, capacity = 256) { size = __velarWorkerInteger(size, 1, 32, "Worker pool size"); capacity = __velarWorkerInteger(capacity, size, 10000, "Worker pool capacity"); const workers = Array.from({ length: size }, () => __velarWorkerClient(name, RequestType, ResponseType, Math.ceil(capacity / size))); const value = Object.create(__velarWorkerPoolPrototype); __velarWorkerPoolStates.set(value, { workers, capacity, closed: false }); return Object.freeze(value); }
66
+ export function serveWorker(RequestType, ResponseType, handler, capacity = 64) {
67
+ if (__velarWorkerServerInstalled) throw new Error("A worker entry may call serveWorker() only once"); RequestType = __velarWorkerRuntimeType(RequestType, "Worker request Type"); ResponseType = __velarWorkerRuntimeType(ResponseType, "Worker response Type"); if (typeof handler !== "function") throw new TypeError("serveWorker handler must be an async function"); capacity = __velarWorkerInteger(capacity, 1, 10000, "Worker capacity"); __velarWorkerServerInstalled = true;
68
+ const queue = []; const active = new Map(); let running = false; const drain = async () => { if (running) return; running = true; while (queue.length) { const message = queue.shift(); const cancellation = Cancellation.__velarCreate(); active.set(message.id, cancellation); try { const request = RequestType.parse(message.value); const result = ResponseType.parse(await handler(request, cancellation)); const outbound = __velarWorkerOutbound(result); globalThis.postMessage({ id: message.id, ok: true, value: outbound.value }, { transfer: outbound.transfers }); } catch (error) { globalThis.postMessage({ id: message.id, ok: false, error: __velarWorkerFailure(error) }); } finally { active.delete(message.id); } } running = false; };
69
+ globalThis.addEventListener("message", event => { const message = event.data; if (!message || !Number.isSafeInteger(message.id)) return; if (message.kind === "cancel") { const cancellation = active.get(message.id); if (cancellation) Cancellation.__velarCancel(cancellation, typeof message.reason === "string" ? message.reason : "Worker call cancelled"); else { const index = queue.findIndex(item => item.id === message.id); if (index >= 0) { queue.splice(index, 1); globalThis.postMessage({ id: message.id, ok: false, error: __velarWorkerFailure(new CancellationError(typeof message.reason === "string" ? message.reason : "Worker call cancelled")) }); } } return; } if (message.kind !== "call") return; if (queue.length + active.size >= capacity) { globalThis.postMessage({ id: message.id, ok: false, error: __velarWorkerFailure(new WorkerBackpressureError()) }); return; } queue.push(message); drain(); }); return null;
70
+ }
71
+ `.trimStart();
72
+ //# sourceMappingURL=worker-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-runtime.js","sourceRoot":"","sources":["../src/worker-runtime.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEjD,CAAC,SAAS,EAAE,CAAC"}