@hew-lang/sandbox-vm 0.6.1 → 0.6.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.
Files changed (52) hide show
  1. package/README.md +48 -4
  2. package/cli/test-runner.mjs +4 -1
  3. package/dist/interpreter/interpreter.d.ts +1 -1
  4. package/dist/interpreter/interpreter.js +1 -1
  5. package/dist/interpreter/parity-runner.js +1 -1
  6. package/dist/interpreter/run-program.d.ts +3 -2
  7. package/dist/interpreter/run-program.js +5 -3
  8. package/dist/interpreter/schema-validator.d.ts +9 -4
  9. package/dist/interpreter/schema-validator.js +15 -49
  10. package/dist/interpreter/strings.d.ts +21 -0
  11. package/dist/interpreter/strings.js +191 -0
  12. package/dist/interpreter/types.d.ts +6 -0
  13. package/dist/interpreter/unicode-data.d.ts +4 -0
  14. package/dist/interpreter/unicode-data.js +1673 -0
  15. package/dist/interpreter/unicode.d.ts +3 -0
  16. package/dist/interpreter/unicode.js +35 -0
  17. package/dist/interpreter/v1/actor-identity.d.ts +3 -0
  18. package/dist/interpreter/v1/actor-identity.js +7 -0
  19. package/dist/interpreter/v1/actor-waits.d.ts +6 -0
  20. package/dist/interpreter/v1/actor-waits.js +33 -0
  21. package/dist/interpreter/v1/browser-directory.d.ts +107 -0
  22. package/dist/interpreter/v1/browser-directory.js +288 -0
  23. package/dist/interpreter/v1/calendar.d.ts +4 -0
  24. package/dist/interpreter/v1/calendar.js +64 -0
  25. package/dist/interpreter/v1/codecs.js +8 -11
  26. package/dist/interpreter/v1/exec.d.ts +2 -2
  27. package/dist/interpreter/v1/exec.js +1761 -489
  28. package/dist/interpreter/v1/instructions.generated.d.ts +1135 -0
  29. package/dist/interpreter/v1/instructions.generated.js +106 -0
  30. package/dist/interpreter/v1/package-graph.d.ts +2 -0
  31. package/dist/interpreter/v1/package-graph.js +729 -0
  32. package/dist/interpreter/v1/package-validator.generated.d.ts +3 -0
  33. package/dist/interpreter/v1/package-validator.generated.js +75902 -0
  34. package/dist/interpreter/v1/package.d.ts +5 -645
  35. package/dist/interpreter/v1/package.js +0 -12
  36. package/dist/interpreter/v1/pipes.d.ts +1 -0
  37. package/dist/interpreter/v1/pipes.js +9 -6
  38. package/dist/interpreter/v1/scheduler.d.ts +8 -1
  39. package/dist/interpreter/v1/scheduler.js +50 -11
  40. package/dist/interpreter/v1/shims.d.ts +260 -7
  41. package/dist/interpreter/v1/shims.js +647 -175
  42. package/dist/interpreter/v1/structural.d.ts +2 -28
  43. package/dist/interpreter/v1/timestamp.d.ts +7 -0
  44. package/dist/interpreter/v1/timestamp.js +54 -0
  45. package/dist/interpreter/v1/validate.d.ts +8 -2
  46. package/dist/interpreter/v1/validate.js +284 -200
  47. package/dist/interpreter/v1/value-operations.d.ts +11 -3
  48. package/dist/interpreter/v1/value-operations.js +70 -18
  49. package/dist/interpreter/values.d.ts +30 -8
  50. package/dist/interpreter/values.js +31 -5
  51. package/dist/interpreter/worker.js +4 -3
  52. package/package.json +4 -4
@@ -1,647 +1,7 @@
1
- export type Own = "none" | "owned" | "guaranteed";
2
- export type BoundaryDecision = "borrow" | "borrow_mut" | "copy" | "move" | "snapshot";
3
- export type TrapName = "integer_overflow" | "divide_by_zero" | "shift_out_of_range" | "vector_bounds" | "actor_refused";
4
- export interface SpanV1 {
5
- start: number;
6
- end: number;
7
- }
1
+ import type { TermV1, VariantShape, RuntimeVariantRole } from "./instructions.generated.js";
2
+ export type { Own, BoundaryDecision, TrapName, SpanV1, BoundaryOperand, Edge, ValueDef, CallResult, OpV1, OpName, TermV1, TermName, SwitchArm, CheckedFailure, RequestShapes, ActorProtocol, ActorOperation, RuntimeFamilyEntry, AggregateShape, VariantCase, VariantShape, RuntimeVariantRole, ExternEntry, PlaceDecl, ValueCapability, ValueComponentCapabilities, ClosureShape, VtableShape, FunctionV1, BlockV1, EntryPlan, ActorShape, SupervisorShape, PackageV1, Resource, StructuralRecipe, } from "./instructions.generated.js";
8
3
  export type Operand = number;
9
- export interface BoundaryOperand {
10
- value: number;
11
- decision: BoundaryDecision;
12
- }
13
- export interface Edge {
14
- to: number;
15
- args: Operand[];
16
- }
17
- export interface ValueDef {
18
- value: number;
19
- own: Own;
20
- }
21
- export type CallResult = null | "never" | ValueDef;
22
- export interface AggregateShape {
23
- id: number;
24
- name: string;
25
- fields: string[];
26
- }
27
- export interface VariantCase {
28
- name: string;
29
- fields: string[];
30
- }
31
- export interface VariantShape {
32
- id: number;
33
- name: string;
34
- cases: VariantCase[];
35
- runtime_tags?: Partial<Record<RuntimeVariantRole, number>>;
36
- }
37
- export type RuntimeVariantRole = "OptionSome" | "OptionNone" | "ResultOk" | "ResultErr" | "ActorErrorRejected" | "ActorErrorFailed" | "ActorErrorTrapped" | "ActorErrorRefused" | "CallerActor" | "CallerTask" | "CallerTimer" | "CallerNode" | "ActorErrorDead" | "ActorErrorTimedOut" | "ActorErrorNodeNotRunning" | "ActorErrorRoutingFailed" | "ActorErrorEncodeFailed" | "ActorErrorConnectionDropped" | "ActorErrorPartition" | "SendErrorFull" | "SendErrorClosed" | "SendErrorPartition" | "SendErrorStaleRef" | "SendErrorLocalShutdown" | "SendErrorCancelled" | "SendErrorVersionMismatch" | "SendErrorBackpressure" | "SendErrorDead" | "SendErrorWriteTimedOut" | "DeliveryAccepted" | "DeliveryDiscarded" | "LinkErrorNoContext";
38
- export declare function runtimeTag(shape: VariantShape, role: RuntimeVariantRole): number;
39
- export interface RuntimeFamilyEntry {
40
- id: number;
41
- family: string;
42
- detail?: unknown;
43
- }
44
- export interface ExternEntry {
45
- id: number;
46
- symbol: string;
47
- native_capability?: string;
48
- }
49
- export type PlaceDecl = {
50
- id: number;
51
- origin: "local";
52
- } | {
53
- id: number;
54
- origin: "aggregate";
55
- base: {
56
- place: number;
57
- } | {
58
- value: number;
59
- };
60
- shape?: number;
61
- field: number;
62
- } | {
63
- id: number;
64
- origin: "capture";
65
- environment: number;
66
- field: number;
67
- } | {
68
- id: number;
69
- origin: "actor_state";
70
- environment: number;
71
- field: number;
72
- initialized: boolean;
73
- } | {
74
- id: number;
75
- origin: "runtime";
76
- };
77
- export interface ValueCapability {
78
- id: number;
79
- capability: "Eq" | "Hash" | "Less" | "LessEqual" | "Greater" | "GreaterEqual";
80
- ty: string;
81
- callable?: number;
82
- components?: ValueComponentCapabilities[];
83
- variants?: ValueComponentCapabilities[][];
84
- }
85
- export interface ValueComponentCapabilities {
86
- selected: number;
87
- ordering?: {
88
- less: number;
89
- less_equal: number;
90
- greater: number;
91
- greater_equal: number;
92
- };
93
- }
94
- export interface ClosureShape {
95
- id: number;
96
- entries: Array<{
97
- body: number;
98
- specialization: number | null;
99
- }>;
100
- fields: number;
101
- }
102
- export interface VtableShape {
103
- id: number;
104
- slots: Array<{
105
- slot: number;
106
- method: string;
107
- callee: number;
108
- receiver: BoundaryDecision;
109
- receiver_handback?: boolean;
110
- }>;
111
- }
112
- export interface FunctionV1 {
113
- id: number;
114
- name: string;
115
- params: ValueDef[];
116
- entry: number;
117
- places: PlaceDecl[];
118
- blocks: BlockV1[];
119
- }
120
- export interface BlockV1 {
121
- id: number;
122
- params: ValueDef[];
123
- ops: OpV1[];
124
- term: TermV1;
125
- }
126
- interface OpBase {
127
- own?: Own;
128
- dst?: number | null;
129
- span?: SpanV1 | null;
130
- }
131
- export type OpV1 = (OpBase & {
132
- op: "coverage.hit";
133
- counter: number;
134
- }) | (OpBase & {
135
- op: "const.int";
136
- dst: number;
137
- value: string;
138
- ty: string;
139
- }) | (OpBase & {
140
- op: "const.bool";
141
- dst: number;
142
- value: boolean;
143
- }) | (OpBase & {
144
- op: "const.float";
145
- dst: number;
146
- value?: number;
147
- ty: string;
148
- nonfinite?: "nan" | "inf" | "-inf";
149
- }) | (OpBase & {
150
- op: "const.char";
151
- dst: number;
152
- value: string;
153
- }) | (OpBase & {
154
- op: "const.unit";
155
- dst: number;
156
- }) | (OpBase & {
157
- op: "const.duration";
158
- dst: number;
159
- nanos: string;
160
- }) | (OpBase & {
161
- op: "const.str";
162
- dst: number;
163
- str: number;
164
- }) | (OpBase & {
165
- op: "const.bytes";
166
- dst: number;
167
- bytes: number;
168
- }) | (OpBase & {
169
- op: "copy_value";
170
- dst: number;
171
- source: Operand;
172
- }) | (OpBase & {
173
- op: "move";
174
- dst: number;
175
- source: Operand;
176
- }) | (OpBase & {
177
- op: "fork";
178
- dst: number;
179
- source: Operand;
180
- }) | (OpBase & {
181
- op: "destroy_value";
182
- value: Operand;
183
- }) | (OpBase & {
184
- op: "begin_borrow";
185
- dst: number;
186
- owner: Operand;
187
- }) | (OpBase & {
188
- op: "end_borrow";
189
- borrow: Operand;
190
- }) | (OpBase & {
191
- op: "finish_linear_receiver";
192
- }) | (OpBase & {
193
- op: "alloc_place";
194
- place: number;
195
- }) | (OpBase & {
196
- op: "store.init";
197
- place: number;
198
- value: Operand;
199
- }) | (OpBase & {
200
- op: "store.assign";
201
- place: number;
202
- value: Operand;
203
- }) | (OpBase & {
204
- op: "load.copy";
205
- dst: number;
206
- place: number;
207
- }) | (OpBase & {
208
- op: "load.take";
209
- dst: number;
210
- place: number;
211
- }) | (OpBase & {
212
- op: "load.borrow";
213
- dst: number;
214
- place: number;
215
- }) | (OpBase & {
216
- op: "end_lifetime";
217
- place: number;
218
- }) | (OpBase & {
219
- op: "tuple.make";
220
- dst: number;
221
- elements: Operand[];
222
- }) | (OpBase & {
223
- op: "tuple.get";
224
- dst: number;
225
- tuple: Operand;
226
- index: number;
227
- }) | (OpBase & {
228
- op: "aggregate.make";
229
- dst: number;
230
- shape: number;
231
- fields: Operand[];
232
- }) | (OpBase & {
233
- op: "aggregate.project_copy";
234
- dst: number;
235
- shape: number;
236
- aggregate: Operand;
237
- field: number;
238
- }) | (OpBase & {
239
- op: "aggregate.project_borrow";
240
- dst: number;
241
- shape: number;
242
- aggregate: Operand;
243
- field: number;
244
- }) | (OpBase & {
245
- op: "destructure";
246
- shape: number | null;
247
- aggregate: Operand;
248
- results: number[];
249
- }) | (OpBase & {
250
- op: "array.make";
251
- dst: number;
252
- elements: Operand[];
253
- }) | (OpBase & {
254
- op: "array.repeat";
255
- dst: number;
256
- value: Operand;
257
- count?: number;
258
- }) | (OpBase & {
259
- op: "variant.make";
260
- dst: number;
261
- shape: number;
262
- variant: number;
263
- fields: Operand[];
264
- }) | (OpBase & {
265
- op: "variant.is";
266
- dst: number;
267
- shape: number;
268
- variant: number;
269
- source: Operand;
270
- }) | (OpBase & {
271
- op: "variant.project_copy";
272
- dst: number;
273
- shape: number;
274
- variant: number;
275
- source: Operand;
276
- field: number;
277
- }) | (OpBase & {
278
- op: "variant.project_borrow";
279
- dst: number;
280
- shape: number;
281
- variant: number;
282
- source: Operand;
283
- field: number;
284
- }) | (OpBase & {
285
- op: "variant.destructure";
286
- shape: number;
287
- variant: number;
288
- source: Operand;
289
- results: number[];
290
- }) | (OpBase & {
291
- op: "unary";
292
- dst: number;
293
- unary_op: string;
294
- value: Operand;
295
- ty: string;
296
- }) | (OpBase & {
297
- op: "binary";
298
- dst: number;
299
- binary_op: string;
300
- lhs: Operand;
301
- rhs: Operand;
302
- ty: string;
303
- }) | (OpBase & {
304
- op: "cast";
305
- dst: number;
306
- value: Operand;
307
- from: string;
308
- to: string;
309
- }) | (OpBase & {
310
- op: "str.eq";
311
- dst: number;
312
- lhs: Operand;
313
- rhs: Operand;
314
- }) | (OpBase & {
315
- op: "bytes.eq";
316
- dst: number;
317
- lhs: Operand;
318
- rhs: Operand;
319
- }) | (OpBase & {
320
- op: "function.make";
321
- dst: number;
322
- callable: number;
323
- }) | (OpBase & {
324
- op: "closure.make";
325
- dst: number;
326
- closure: number;
327
- fields: Operand[];
328
- }) | (OpBase & {
329
- op: "callable.coerce";
330
- dst: number;
331
- source: Operand;
332
- specialization: number | null;
333
- }) | (OpBase & {
334
- op: "dyn.make";
335
- dst: number;
336
- vtable: number;
337
- value: Operand;
338
- }) | (OpBase & {
339
- op: "register_defer";
340
- defer: number;
341
- scope: number;
342
- dependencies: Operand[];
343
- }) | (OpBase & {
344
- op: "generator.make";
345
- dst: number;
346
- closure: number;
347
- callable: Operand;
348
- }) | (OpBase & {
349
- op: "actor.ingress_adapter";
350
- }) | (OpBase & {
351
- op: "stream.pipe";
352
- capacity: number;
353
- results: ValueDef[];
354
- }) | (OpBase & {
355
- op: "task_scope.enter";
356
- scope: number;
357
- parent: number | null;
358
- duration: Operand | null;
359
- }) | (OpBase & {
360
- op: "task_scope.close";
361
- scope: number;
362
- }) | (OpBase & {
363
- op: "task.race";
364
- dst: number;
365
- scope: number;
366
- members: Operand[];
367
- }) | (OpBase & {
368
- op: "task.spawn";
369
- dst: number;
370
- scope: number;
371
- callable: Operand;
372
- });
373
- export type OpName = OpV1["op"];
374
- interface TermBase {
375
- span?: SpanV1 | null;
376
- }
377
- export interface SwitchArm {
378
- variant: number;
379
- fields: ValueDef[];
380
- edge: Edge;
381
- }
382
- export interface CheckedFailure {
383
- trap: TrapName;
384
- edge: Edge;
385
- }
386
- export interface RequestShapes {
387
- failure: number | null;
388
- reason: number | null;
389
- message: number | null;
390
- request: number | null;
391
- }
392
- export interface CallShape {
393
- args: BoundaryOperand[];
394
- result: CallResult;
395
- normal?: Edge;
396
- unwind: Edge | null;
397
- request_shapes?: RequestShapes;
398
- }
399
- export type TermV1 = (TermBase & {
400
- op: "return";
401
- value: BoundaryOperand | null;
402
- }) | (TermBase & {
403
- op: "goto";
404
- edge: Edge;
405
- }) | (TermBase & {
406
- op: "branch";
407
- condition: Operand;
408
- then: Edge;
409
- else: Edge;
410
- }) | (TermBase & {
411
- op: "switch.variant";
412
- shape: number;
413
- scrutinee: Operand;
414
- arms: SwitchArm[];
415
- }) | (TermBase & {
416
- op: "checked.binary";
417
- binary_op: string;
418
- lhs: Operand;
419
- rhs: Operand;
420
- result: ValueDef;
421
- normal: Edge;
422
- failures: CheckedFailure[];
423
- ty: string;
424
- }) | (TermBase & {
425
- op: "unreachable";
426
- }) | (TermBase & CallShape & {
4
+ export type CallShape = Pick<Extract<TermV1, {
427
5
  op: "call";
428
- callee: number;
429
- handback?: ValueDef | null;
430
- }) | (TermBase & CallShape & {
431
- op: "indirect.call";
432
- callee: BoundaryOperand;
433
- specialization: number | null;
434
- }) | (TermBase & CallShape & {
435
- op: "dyn.call";
436
- receiver: BoundaryOperand;
437
- slot: number;
438
- }) | (TermBase & CallShape & {
439
- op: "value.call";
440
- plan: number;
441
- }) | (TermBase & CallShape & {
442
- op: "wire.codec";
443
- codec: number;
444
- format: number;
445
- direction: "encode" | "decode" | "test_input";
446
- decoded: {
447
- shape: number;
448
- ok: number;
449
- error: number;
450
- error_root: number;
451
- } | null;
452
- callbacks: Record<string, number[]>;
453
- }) | (TermBase & CallShape & {
454
- op: "runtime.call";
455
- family: number;
456
- structural?: number | null;
457
- callbacks?: number[];
458
- releases_contents?: boolean;
459
- keeps_inputs_on_failure?: boolean;
460
- result_member_shapes?: Array<number | null>;
461
- result_shape: number | null;
462
- }) | (TermBase & CallShape & {
463
- op: "extern.call";
464
- extern: number;
465
- result_shape: number | null;
466
- }) | (TermBase & CallShape & {
467
- op: "actor.call";
468
- operation: ActorOperation;
469
- submission_shapes?: {
470
- success: number | null;
471
- failure: number | null;
472
- reason: number | null;
473
- };
474
- result_shape: number | null;
475
- error_shape: number | null;
476
- }) | (TermBase & {
477
- op: "panic";
478
- message: BoundaryOperand;
479
- assertion?: [BoundaryOperand, BoundaryOperand, BoundaryOperand] | null;
480
- cleanup: Edge;
481
- }) | (TermBase & {
482
- op: "trap";
483
- trap: TrapName;
484
- }) | (TermBase & {
485
- op: "checked_raise";
486
- trap: TrapName;
487
- cleanup: Edge;
488
- }) | (TermBase & {
489
- op: "cleanup.dispatch";
490
- normal: Edge;
491
- fault: Edge;
492
- }) | (TermBase & {
493
- op: "resume_unwind";
494
- handback?: BoundaryOperand | null;
495
- }) | (TermBase & {
496
- op: "enter_defer";
497
- defer: number;
498
- park: number;
499
- body: Edge;
500
- }) | (TermBase & {
501
- op: "finish_defer";
502
- defer: number;
503
- park: number;
504
- next: Edge;
505
- }) | (TermBase & {
506
- op: "recover_fault";
507
- result_shape?: number | null;
508
- result: ValueDef;
509
- deadline_variant: number;
510
- fault_variant: number;
511
- normal: Edge;
512
- unwind: Edge | null;
513
- }) | (TermBase & {
514
- op: "suspend";
515
- kind: string;
516
- detail?: any;
517
- request_shapes?: RequestShapes;
518
- result_shape?: number | null;
519
- error_shape?: number | null;
520
- inputs: BoundaryOperand[];
521
- result: CallResult;
522
- resumes: Edge[];
523
- cancel: Edge;
524
- unwind: Edge | null;
525
- });
526
- export type TermName = TermV1["op"];
527
- export interface EntryPlan {
528
- function: number;
529
- exit: "unit" | "status";
530
- }
531
- export interface ActorProtocol {
532
- actor: number;
533
- message: number;
534
- policy: "reject" | "wait" | "drop_newest";
535
- sealed: boolean;
536
- }
537
- export type ActorOperation = {
538
- op: "spawn" | "self_handle" | "stop" | "terminate" | "await_stopped" | "await_restarted";
539
- actor: number;
540
- } | {
541
- op: "call_start" | "call_take";
542
- protocol: ActorProtocol;
543
- } | {
544
- op: "submit";
545
- actor: number;
546
- policy: ActorProtocol["policy"];
547
- } | {
548
- op: "stream_start";
549
- actor: number;
550
- message: number;
551
- } | {
552
- op: "local_observation";
553
- kind: string;
554
- } | {
555
- op: "supervisor_spawn" | "stop" | "terminate" | "await_stopped" | "await_restarted";
556
- supervisor: number;
557
- } | {
558
- op: "supervisor_child" | "supervisor_pool_view";
559
- supervisor: number;
560
- child: number;
561
- owner_is_role: boolean;
562
- };
563
- export interface ActorShape {
564
- id: number;
565
- state_fields: Array<{
566
- mutable: boolean;
567
- deferred: boolean;
568
- }>;
569
- init?: number;
570
- start?: number;
571
- stop: number[];
572
- crash?: number;
573
- crash_info?: number;
574
- crash_action?: number;
575
- exit?: number;
576
- down?: number;
577
- handlers: Array<{
578
- name: string;
579
- message_id: number;
580
- callable: number;
581
- params: number;
582
- streams: boolean;
583
- fallible: boolean;
584
- result_shape: number | null;
585
- every_ns?: number;
586
- }>;
587
- mailbox_capacity?: number;
588
- overflow: string;
589
- coalesce?: {
590
- fallback: string;
591
- keys: Array<{
592
- message: number;
593
- param: number;
594
- }>;
595
- };
596
- max_heap_bytes?: number;
597
- }
598
- export interface SupervisorShape {
599
- id: number;
600
- strategy: string;
601
- max_restarts: number;
602
- window_secs: number;
603
- children: Array<{
604
- name: string;
605
- role: {
606
- actor: number;
607
- } | {
608
- supervisor: number;
609
- };
610
- restart: string;
611
- stop_ns?: number | null;
612
- pool_count?: number;
613
- spawn: number;
614
- }>;
615
- }
616
- export interface PackageV1 {
617
- codecs?: string[];
618
- resources?: Array<{
619
- kind: string;
620
- ty?: string;
621
- shape?: number;
622
- close?: number;
623
- release?: string;
624
- }>;
625
- structural_render?: import("./structural.js").StructuralRecipe[];
626
- schema_version: "hew.sandbox.bytecode.v1";
627
- hew_version: string;
628
- compiler_version: string;
629
- profile: string;
630
- entry?: EntryPlan;
631
- strings: string[];
632
- bytes: number[][];
633
- regex_patterns: string[];
634
- aggregates: AggregateShape[];
635
- variants: VariantShape[];
636
- runtime_families: RuntimeFamilyEntry[];
637
- externs: ExternEntry[];
638
- suspend_kinds: string[];
639
- value_capabilities: ValueCapability[];
640
- closures: ClosureShape[];
641
- vtables: VtableShape[];
642
- actors?: ActorShape[];
643
- supervisors?: SupervisorShape[];
644
- functions: FunctionV1[];
645
- }
646
- export declare function isPackageV1(input: unknown): input is PackageV1;
647
- export {};
6
+ }>, "args" | "result" | "normal" | "unwind" | "request_shapes">;
7
+ export declare function runtimeTag(shape: VariantShape, role: RuntimeVariantRole): number;
@@ -1,9 +1,3 @@
1
- /// TypeScript shape of `hew.sandbox.bytecode.v1`, mirroring
2
- /// `bytecode/sandbox-bytecode-v1.schema.json` and `bytecode/opcodes-v1.md`.
3
- ///
4
- /// The package is a projection of verified ownership SIR. Every fact here was
5
- /// proved by SIR verification, so the executor reads these fields; it does not
6
- /// re-derive them from a type, a name or a symbol spelling.
7
1
  export function runtimeTag(shape, role) {
8
2
  const tag = shape.runtime_tags?.[role];
9
3
  if (tag === undefined ||
@@ -13,9 +7,3 @@ export function runtimeTag(shape, role) {
13
7
  throw new Error(`variant shape ${shape.id} has no checked ${role} tag`);
14
8
  return tag;
15
9
  }
16
- export function isPackageV1(input) {
17
- return (typeof input === "object" &&
18
- input !== null &&
19
- input.schema_version ===
20
- "hew.sandbox.bytecode.v1");
21
- }
@@ -12,6 +12,7 @@ export declare class Pipes {
12
12
  private half;
13
13
  private get;
14
14
  cloneSink(value: VmValue): VmValue;
15
+ isClosed(value: VmValue): boolean;
15
16
  close(value: VmValue, fault?: string | null): VmValue[];
16
17
  peerClosed(value: VmValue): boolean;
17
18
  readable(value: VmValue): boolean;
@@ -29,10 +29,10 @@ export class Pipes {
29
29
  throw new Error("pipe pair does not exist");
30
30
  return this.half(pipe, kind);
31
31
  }
32
- half(pipe, kind) {
32
+ half(pipe, kind, open = true) {
33
33
  const id = `pipe-half:${++this.next}`;
34
- this.halves.set(id, { pipe, kind, open: true });
35
- if (kind === "sink")
34
+ this.halves.set(id, { pipe, kind, open });
35
+ if (kind === "sink" && open)
36
36
  pipe.sinks += 1;
37
37
  return { kind, channelId: id };
38
38
  }
@@ -46,9 +46,12 @@ export class Pipes {
46
46
  }
47
47
  cloneSink(value) {
48
48
  const half = this.get(value);
49
- if (!half.open || half.kind !== "sink")
50
- throw new Error("cannot clone a closed sink");
51
- return this.half(half.pipe, "sink");
49
+ if (half.kind !== "sink")
50
+ throw new Error("cannot clone a stream as a sink");
51
+ return this.half(half.pipe, "sink", half.open);
52
+ }
53
+ isClosed(value) {
54
+ return !this.get(value).open;
52
55
  }
53
56
  close(value, fault = null) {
54
57
  const half = this.get(value);