@stateforward/hsm.ts 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2462 @@
1
+ import {
2
+ isKind,
3
+ kinds,
4
+ makeKind
5
+ } from "./chunk-UO7RF4FF.js";
6
+ import {
7
+ Generator,
8
+ MUID,
9
+ ShardedGenerators,
10
+ add64,
11
+ and64,
12
+ cmp64,
13
+ from32,
14
+ getDefaultConfig,
15
+ make,
16
+ make64,
17
+ makeMuid,
18
+ newGenerator,
19
+ or64,
20
+ shl64,
21
+ shr64,
22
+ sub64
23
+ } from "./chunk-R6UCUJT5.js";
24
+
25
+ // src/hsm.ts
26
+ function attachSpec(builder, spec) {
27
+ return Object.assign(builder, {
28
+ __hsmSpec: spec
29
+ });
30
+ }
31
+ var runtimeByInstance = /* @__PURE__ */ new WeakMap();
32
+ function bindRuntime(instance, runtime) {
33
+ runtimeByInstance.set(instance, runtime);
34
+ }
35
+ function runtimeFor(instance) {
36
+ if (!instance || typeof instance !== "object") {
37
+ return void 0;
38
+ }
39
+ return runtimeByInstance.get(instance);
40
+ }
41
+ function join(...segments) {
42
+ var parts = [];
43
+ var currentIsAbsolute = false;
44
+ for (var i = 0; i < segments.length; i++) {
45
+ var segment = segments[i];
46
+ if (segment === null || segment === void 0 || segment.length === 0) {
47
+ continue;
48
+ }
49
+ if (segment[0] === "/") {
50
+ parts = [];
51
+ currentIsAbsolute = true;
52
+ }
53
+ var startIndex = 0;
54
+ var currentPartEnd = 0;
55
+ var part = "";
56
+ while (currentPartEnd < segment.length) {
57
+ if (segment[currentPartEnd] === "/") {
58
+ if (currentPartEnd > startIndex) {
59
+ part = segment.substring(startIndex, currentPartEnd);
60
+ if (part === "..") {
61
+ if (currentIsAbsolute && parts.length === 0) {
62
+ } else if (parts.length > 0 && parts[parts.length - 1] !== "..") {
63
+ parts.pop();
64
+ } else {
65
+ parts.push(part);
66
+ }
67
+ } else if (part !== ".") {
68
+ parts.push(part);
69
+ }
70
+ }
71
+ startIndex = currentPartEnd + 1;
72
+ }
73
+ currentPartEnd++;
74
+ }
75
+ if (currentPartEnd > startIndex) {
76
+ part = segment.substring(startIndex, currentPartEnd);
77
+ if (part === "..") {
78
+ if (currentIsAbsolute && parts.length === 0) {
79
+ } else if (parts.length > 0 && parts[parts.length - 1] !== "..") {
80
+ parts.pop();
81
+ } else {
82
+ parts.push(part);
83
+ }
84
+ } else if (part !== ".") {
85
+ parts.push(part);
86
+ }
87
+ }
88
+ }
89
+ var joinedPath = parts.join("/");
90
+ if (currentIsAbsolute) {
91
+ joinedPath = "/" + joinedPath;
92
+ }
93
+ var hasTrailingSlash = false;
94
+ if (segments.length > 0) {
95
+ var lastInputSegment = segments[segments.length - 1];
96
+ if (lastInputSegment && lastInputSegment.length > 0 && lastInputSegment[lastInputSegment.length - 1] === "/") {
97
+ hasTrailingSlash = true;
98
+ }
99
+ }
100
+ if (joinedPath.length === 0) {
101
+ return currentIsAbsolute ? "/" : ".";
102
+ } else if (hasTrailingSlash && joinedPath !== "/") {
103
+ return joinedPath + "/";
104
+ }
105
+ return joinedPath;
106
+ }
107
+ function slice(args, start2 = 0) {
108
+ var result = [];
109
+ for (var i = start2; i < args.length; i++) {
110
+ result.push(args[i]);
111
+ }
112
+ return result;
113
+ }
114
+ function dirname(path) {
115
+ if (path === void 0 || path === null || path.length === 0) {
116
+ return ".";
117
+ }
118
+ var originalPathWasAbsolute = path[0] === "/";
119
+ var i = path.length - 1;
120
+ while (i >= 0 && path[i] === "/") {
121
+ i--;
122
+ }
123
+ var p = path.substring(0, i + 1);
124
+ if (p.length === 0) {
125
+ return originalPathWasAbsolute ? "/" : ".";
126
+ }
127
+ var lastSeparatorIndex = p.lastIndexOf("/");
128
+ if (lastSeparatorIndex < 0) {
129
+ return originalPathWasAbsolute ? "/" : ".";
130
+ }
131
+ var result = p.substring(0, lastSeparatorIndex);
132
+ if (result.length === 0) {
133
+ return originalPathWasAbsolute ? "/" : ".";
134
+ }
135
+ return result;
136
+ }
137
+ function isAbsolute(path) {
138
+ var c = path.charAt(0);
139
+ if (c === "/") return true;
140
+ return path.length > 2 && path.charAt(1) === ":" && path.charAt(2) === "/";
141
+ }
142
+ var Context = class {
143
+ listeners;
144
+ instances;
145
+ done;
146
+ constructor() {
147
+ this.listeners = [];
148
+ this.instances = {};
149
+ this.done = false;
150
+ }
151
+ addEventListener(_type, listener) {
152
+ this.listeners.push(listener);
153
+ }
154
+ removeEventListener(_type, listener) {
155
+ var index = this.listeners.indexOf(listener);
156
+ if (index !== -1) {
157
+ this.listeners.splice(index, 1);
158
+ }
159
+ }
160
+ };
161
+ var InitialEvent = {
162
+ kind: kinds.CompletionEvent,
163
+ qualifiedName: "hsm_initial",
164
+ name: "hsm_initial"
165
+ };
166
+ var FinalEvent = {
167
+ name: "hsm_final",
168
+ kind: kinds.CompletionEvent
169
+ };
170
+ var ErrorEvent = {
171
+ name: "hsm_error",
172
+ kind: kinds.ErrorEvent
173
+ };
174
+ var DefaultClock = {
175
+ setTimeout: typeof setTimeout === "function" ? ((callback, timeout, ...args) => setTimeout(callback, timeout || 0, ...args)) : function(_callback, _timeout, ..._args) {
176
+ return 0;
177
+ },
178
+ clearTimeout: typeof clearTimeout === "function" ? ((id2) => {
179
+ if (id2 !== void 0) {
180
+ clearTimeout(id2);
181
+ }
182
+ }) : function() {
183
+ },
184
+ now: typeof Date !== "undefined" && typeof Date.now === "function" ? Date.now : function() {
185
+ return 0;
186
+ }
187
+ };
188
+ function event(name2, schema) {
189
+ return {
190
+ kind: kinds.Event,
191
+ name: name2,
192
+ schema
193
+ };
194
+ }
195
+ function apply(model, stack, partials) {
196
+ for (var i = 0; i < partials.length; i++) {
197
+ var partial = partials[i];
198
+ if (typeof partial === "function") {
199
+ partial(model, stack);
200
+ }
201
+ }
202
+ }
203
+ function qualifyModelName(model, name2) {
204
+ if (isAbsolute(name2)) {
205
+ return isAncestor(model.qualifiedName, name2) || model.qualifiedName === name2 ? name2 : join(model.qualifiedName, name2.slice(1));
206
+ }
207
+ return join(model.qualifiedName, name2);
208
+ }
209
+ function registerEvent(model, event2) {
210
+ if (!model.events) {
211
+ model.events = {};
212
+ }
213
+ var existing = model.events[event2.name];
214
+ if (!existing) {
215
+ model.events[event2.name] = event2;
216
+ return event2;
217
+ }
218
+ return existing;
219
+ }
220
+ function resolveOperation(model, value) {
221
+ return function(ctx, instance, event2) {
222
+ var runtime = runtimeFor(instance);
223
+ if (!runtime) {
224
+ return false;
225
+ }
226
+ var name2 = qualifyModelName(model, value);
227
+ return !!runtime.invoke(name2, ctx, [event2]);
228
+ };
229
+ }
230
+ function hasThen(value) {
231
+ return !!value && typeof value.then === "function";
232
+ }
233
+ function hasAddEventListener(value) {
234
+ return !!value && typeof value.addEventListener === "function";
235
+ }
236
+ function hasOn(value) {
237
+ return !!value && typeof value.on === "function";
238
+ }
239
+ function toSignalLike(value) {
240
+ if (hasThen(value)) {
241
+ return value;
242
+ }
243
+ if (hasAddEventListener(value) || hasOn(value)) {
244
+ return value;
245
+ }
246
+ return void 0;
247
+ }
248
+ function coerceDuration(value) {
249
+ var numericValue = Number(value);
250
+ return isNaN(numericValue) ? 0 : numericValue;
251
+ }
252
+ function coerceTimepoint(value) {
253
+ if (value instanceof Date) {
254
+ return value.getTime();
255
+ }
256
+ return coerceDuration(value);
257
+ }
258
+ function withThenable(value, callback) {
259
+ if (hasThen(value)) {
260
+ return Promise.resolve(value).then(callback);
261
+ }
262
+ return callback(value);
263
+ }
264
+ function getState(model, path) {
265
+ if (!path) {
266
+ return void 0;
267
+ }
268
+ var member = model.members[path];
269
+ return isStateElement(member) ? member : void 0;
270
+ }
271
+ function getVertex(model, path) {
272
+ if (!path) {
273
+ return void 0;
274
+ }
275
+ var member = model.members[path];
276
+ return isVertex(member) ? member : void 0;
277
+ }
278
+ function getTransition(model, path) {
279
+ if (!path) {
280
+ return void 0;
281
+ }
282
+ var member = model.members[path];
283
+ return isTransitionElement(member) ? member : void 0;
284
+ }
285
+ function getBehavior(model, path) {
286
+ if (!path) {
287
+ return void 0;
288
+ }
289
+ var member = model.members[path];
290
+ return isBehaviorElement(member) ? member : void 0;
291
+ }
292
+ function getConstraint(model, path) {
293
+ if (!path) {
294
+ return void 0;
295
+ }
296
+ var member = model.members[path];
297
+ return isConstraintElement(member) ? member : void 0;
298
+ }
299
+ function isAncestor(ancestor, descendant) {
300
+ if (ancestor === descendant) return false;
301
+ if (ancestor === "/") return isAbsolute(descendant);
302
+ return descendant.startsWith(ancestor + "/");
303
+ }
304
+ function lca(a, b) {
305
+ if (a === b) return dirname(a);
306
+ if (!a) return b;
307
+ if (!b) return a;
308
+ if (dirname(a) === dirname(b)) return dirname(a);
309
+ if (isAncestor(a, b)) return a;
310
+ if (isAncestor(b, a)) return b;
311
+ return lca(dirname(a), dirname(b));
312
+ }
313
+ function isStateElement(element) {
314
+ return !!element && isKind(element.kind, kinds.State);
315
+ }
316
+ function isModelElement(element) {
317
+ return !!element && isKind(element.kind, kinds.Model);
318
+ }
319
+ function isTransitionElement(element) {
320
+ return !!element && isKind(element.kind, kinds.Transition);
321
+ }
322
+ function isConstraintElement(element) {
323
+ return !!element && isKind(element.kind, kinds.Constraint);
324
+ }
325
+ function isBehaviorElement(element) {
326
+ return !!element && isKind(element.kind, kinds.Behavior);
327
+ }
328
+ function isVertex(element) {
329
+ return !!element && isKind(element.kind, kinds.Vertex);
330
+ }
331
+ function findState(stack) {
332
+ return find(stack, kinds.State);
333
+ }
334
+ function findTransition(stack) {
335
+ return find(stack, kinds.Transition);
336
+ }
337
+ function findModel(stack) {
338
+ return find(stack, kinds.Model);
339
+ }
340
+ function findVertex(stack) {
341
+ return find(stack, kinds.Vertex);
342
+ }
343
+ var Queue = class {
344
+ front = [];
345
+ back = [];
346
+ backHead = 0;
347
+ len() {
348
+ return this.front.length + (this.back.length - this.backHead);
349
+ }
350
+ pop() {
351
+ var event2;
352
+ if (this.front.length > 0) {
353
+ event2 = this.front.pop();
354
+ } else if (this.backHead < this.back.length) {
355
+ event2 = this.back[this.backHead];
356
+ this.back[this.backHead] = void 0;
357
+ this.backHead++;
358
+ if (this.backHead === this.back.length) {
359
+ this.back = [];
360
+ this.backHead = 0;
361
+ }
362
+ }
363
+ return event2;
364
+ }
365
+ push(...events) {
366
+ for (var i = 0; i < events.length; i++) {
367
+ var event2 = events[i];
368
+ if (isKind(event2.kind, kinds.CompletionEvent)) {
369
+ this.front.push(event2);
370
+ } else {
371
+ this.back.push(event2);
372
+ }
373
+ }
374
+ }
375
+ };
376
+ function buildTransitionTable(model) {
377
+ for (var stateName in model.members) {
378
+ var state2 = model.members[stateName];
379
+ if (!isStateElement(state2) && !isModelElement(state2)) continue;
380
+ model.transitionMap[stateName] = {};
381
+ var transitionsByEvent = {};
382
+ var currentPath = stateName;
383
+ var depth = 0;
384
+ while (currentPath) {
385
+ var currentState = model.members[currentPath];
386
+ if (currentState && (isStateElement(currentState) || isModelElement(currentState))) {
387
+ var stateOrModel = currentState;
388
+ for (var i = 0; i < stateOrModel.transitions.length; i++) {
389
+ var transitionName = stateOrModel.transitions[i];
390
+ var transition2 = model.members[transitionName];
391
+ if (isTransitionElement(transition2) && transition2.events) {
392
+ for (var j = 0; j < transition2.events.length; j++) {
393
+ var transitionEventName = transition2.events[j];
394
+ if (transitionEventName.indexOf("*") !== -1) {
395
+ continue;
396
+ }
397
+ if (!transitionsByEvent[transitionEventName]) {
398
+ transitionsByEvent[transitionEventName] = [];
399
+ }
400
+ transitionsByEvent[transitionEventName].push({
401
+ transition: transition2,
402
+ priority: depth
403
+ });
404
+ }
405
+ }
406
+ }
407
+ }
408
+ if (currentPath === "/" || !currentPath) break;
409
+ var parentPath = dirname(currentPath);
410
+ if (parentPath === currentPath) break;
411
+ currentPath = parentPath;
412
+ depth++;
413
+ }
414
+ for (var eventName in transitionsByEvent) {
415
+ var transitions = transitionsByEvent[eventName];
416
+ transitions.sort(function(a, b) {
417
+ return a.priority - b.priority;
418
+ });
419
+ model.transitionMap[stateName][eventName] = transitions.map(function(t) {
420
+ return t.transition;
421
+ });
422
+ }
423
+ }
424
+ }
425
+ function buildDeferredTable(model) {
426
+ for (var stateName in model.members) {
427
+ var state2 = model.members[stateName];
428
+ if (!isStateElement(state2) && !isModelElement(state2)) continue;
429
+ model.deferredMap[stateName] = {};
430
+ var currentPath = stateName;
431
+ while (currentPath) {
432
+ var currentState = model.members[currentPath];
433
+ if (currentState && (isStateElement(currentState) || isModelElement(currentState))) {
434
+ var stateOrModel = currentState;
435
+ if (stateOrModel.deferred) {
436
+ for (var i = 0; i < stateOrModel.deferred.length; i++) {
437
+ var deferredEvent = stateOrModel.deferred[i];
438
+ var transitions = model.transitionMap[stateName][deferredEvent];
439
+ if (transitions && transitions.some((t) => t.source === stateName)) {
440
+ continue;
441
+ }
442
+ if (deferredEvent.indexOf("*") === -1) {
443
+ model.deferredMap[stateName][deferredEvent] = true;
444
+ }
445
+ }
446
+ }
447
+ }
448
+ if (currentPath === "/" || !currentPath) break;
449
+ var parentPath = dirname(currentPath);
450
+ if (parentPath === currentPath) break;
451
+ currentPath = parentPath;
452
+ }
453
+ }
454
+ }
455
+ var EMPTY_PATH = {
456
+ enter: [],
457
+ exit: []
458
+ };
459
+ var InstanceImpl = class {
460
+ dispatch(event2) {
461
+ var runtime = runtimeFor(this);
462
+ if (!runtime) {
463
+ return;
464
+ }
465
+ runtime.dispatch(event2);
466
+ }
467
+ state() {
468
+ var runtime = runtimeFor(this);
469
+ return runtime ? runtime.state() : "";
470
+ }
471
+ context() {
472
+ var runtime = runtimeFor(this);
473
+ return runtime ? runtime.context() : new Context();
474
+ }
475
+ clock() {
476
+ var runtime = runtimeFor(this);
477
+ return runtime ? runtime.clock : DefaultClock;
478
+ }
479
+ get(name2) {
480
+ var runtime = runtimeFor(this);
481
+ return runtime ? runtime.get(name2) : void 0;
482
+ }
483
+ set(name2, value) {
484
+ var runtime = runtimeFor(this);
485
+ if (runtime) {
486
+ runtime.set(name2, value);
487
+ }
488
+ }
489
+ call(name2, ...args) {
490
+ var runtime = runtimeFor(this);
491
+ if (!runtime) {
492
+ return void 0;
493
+ }
494
+ return runtime.call(name2, ...args);
495
+ }
496
+ restart(data) {
497
+ var runtime = runtimeFor(this);
498
+ if (runtime) {
499
+ runtime.restart(data);
500
+ }
501
+ }
502
+ takeSnapshot() {
503
+ var runtime = runtimeFor(this);
504
+ return runtime ? runtime.takeSnapshot() : {
505
+ id: "",
506
+ qualifiedName: "",
507
+ state: "",
508
+ attributes: {},
509
+ queueLen: 0,
510
+ events: []
511
+ };
512
+ }
513
+ };
514
+ var Instance = (function() {
515
+ if (this && typeof this === "object") {
516
+ this._hsm = null;
517
+ }
518
+ });
519
+ Instance.prototype = InstanceImpl.prototype;
520
+ var HSM = class _HSM {
521
+ static id = 0;
522
+ runtime;
523
+ instance;
524
+ ctx;
525
+ model;
526
+ currentState;
527
+ queue;
528
+ active;
529
+ processing;
530
+ id;
531
+ name;
532
+ attributes;
533
+ historyShallow;
534
+ historyDeep;
535
+ after;
536
+ clock;
537
+ startData;
538
+ constructor(ctxOrInstance, instanceOrModel, maybeModelOrConfig, maybeConfig) {
539
+ if (!(ctxOrInstance instanceof Context)) {
540
+ maybeConfig = maybeModelOrConfig;
541
+ maybeModelOrConfig = instanceOrModel;
542
+ instanceOrModel = ctxOrInstance;
543
+ ctxOrInstance = new Context();
544
+ }
545
+ const id2 = ((maybeConfig ? maybeConfig.id : "") || _HSM.id++).toString();
546
+ const name2 = (maybeConfig ? maybeConfig.name : "") || maybeModelOrConfig.qualifiedName;
547
+ this.instance = instanceOrModel;
548
+ this.ctx = ctxOrInstance;
549
+ this.model = maybeModelOrConfig;
550
+ this.currentState = this.model;
551
+ this.queue = new Queue();
552
+ this.active = {};
553
+ this.processing = false;
554
+ this.id = id2;
555
+ this.name = name2;
556
+ this.attributes = {};
557
+ this.historyShallow = {};
558
+ this.historyDeep = {};
559
+ this.after = {
560
+ entered: {},
561
+ exited: {},
562
+ processed: {},
563
+ dispatched: {},
564
+ executed: {}
565
+ };
566
+ this.clock = {
567
+ setTimeout: maybeConfig?.clock?.setTimeout || DefaultClock.setTimeout,
568
+ clearTimeout: maybeConfig?.clock?.clearTimeout || DefaultClock.clearTimeout,
569
+ now: maybeConfig?.clock?.now || DefaultClock.now
570
+ };
571
+ this.startData = maybeConfig ? maybeConfig.data : void 0;
572
+ this.runtime = {
573
+ dispatch: (event2) => {
574
+ this.dispatch(event2);
575
+ },
576
+ state: () => {
577
+ return this.state();
578
+ },
579
+ context: () => {
580
+ return this.ctx;
581
+ },
582
+ clock: this.clock,
583
+ get: (name3) => {
584
+ return this.get(name3);
585
+ },
586
+ set: (name3, value) => {
587
+ this.set(name3, value);
588
+ },
589
+ invoke: (name3, ctx, args) => {
590
+ return this.invoke(name3, ctx, args);
591
+ },
592
+ call: (name3, ...args) => {
593
+ return this.call(name3, ...args);
594
+ },
595
+ restart: (data) => {
596
+ this.restart(data);
597
+ },
598
+ takeSnapshot: () => {
599
+ return this.takeSnapshot();
600
+ },
601
+ onAfter: (bucket, key, listener) => {
602
+ this.onAfter(bucket, key, listener);
603
+ },
604
+ stop: () => {
605
+ this.stop();
606
+ },
607
+ id: this.id,
608
+ model: this.model,
609
+ name: this.name,
610
+ queue: this.queue,
611
+ processing: this.processing
612
+ };
613
+ }
614
+ start() {
615
+ this.processing = true;
616
+ this.ctx.done = false;
617
+ bindRuntime(this.instance, this.runtime);
618
+ this.resetAttributes();
619
+ var initialEvent = Object.create(InitialEvent);
620
+ initialEvent.data = this.startData;
621
+ var newState = this.enter(this.model, initialEvent, true);
622
+ this.ctx.instances[this.id] = this.instance;
623
+ this.currentState = newState;
624
+ this.process();
625
+ return this;
626
+ }
627
+ state() {
628
+ return this.currentState ? this.currentState.qualifiedName : "";
629
+ }
630
+ resetAttributes() {
631
+ this.attributes = {};
632
+ if (!this.model.attributes) {
633
+ return;
634
+ }
635
+ for (var qualifiedName2 in this.model.attributes) {
636
+ var attribute2 = this.model.attributes[qualifiedName2];
637
+ if (attribute2 && attribute2.hasDefault) {
638
+ this.attributes[qualifiedName2] = attribute2.defaultValue;
639
+ }
640
+ }
641
+ }
642
+ notify(bucket, key) {
643
+ var listeners = this.after[bucket][key];
644
+ if (!listeners || listeners.length === 0) {
645
+ return;
646
+ }
647
+ delete this.after[bucket][key];
648
+ for (var i = 0; i < listeners.length; i++) {
649
+ listeners[i]();
650
+ }
651
+ }
652
+ onAfter(bucket, key, listener) {
653
+ if (!this.after[bucket][key]) {
654
+ this.after[bucket][key] = [];
655
+ }
656
+ this.after[bucket][key].push(listener);
657
+ }
658
+ get(name2) {
659
+ return this.attributes[qualifyModelName(this.model, name2)];
660
+ }
661
+ set(name2, value) {
662
+ var qualifiedName2 = qualifyModelName(this.model, name2);
663
+ var hadValue = Object.prototype.hasOwnProperty.call(this.attributes, qualifiedName2);
664
+ var old = this.attributes[qualifiedName2];
665
+ this.attributes[qualifiedName2] = value;
666
+ if (hadValue && old === value) {
667
+ return;
668
+ }
669
+ var event2 = {
670
+ kind: kinds.ChangeEvent,
671
+ name: qualifiedName2,
672
+ source: qualifiedName2,
673
+ data: {
674
+ name: qualifiedName2,
675
+ old,
676
+ new: value
677
+ }
678
+ };
679
+ this.dispatch(event2);
680
+ }
681
+ call(name2, ...args) {
682
+ var argsList = args;
683
+ var qualifiedName2 = qualifyModelName(this.model, name2);
684
+ var event2 = {
685
+ kind: kinds.CallEvent,
686
+ name: qualifiedName2,
687
+ source: qualifiedName2,
688
+ data: {
689
+ name: qualifiedName2,
690
+ args: argsList
691
+ }
692
+ };
693
+ this.dispatch(event2);
694
+ return this.invoke(name2, this.ctx, argsList);
695
+ }
696
+ invoke(name2, ctx, args) {
697
+ var qualifiedName2 = qualifyModelName(this.model, name2);
698
+ var operation2 = this.model.operations && this.model.operations[qualifiedName2];
699
+ if (!operation2) {
700
+ throw new Error('missing operation "' + qualifiedName2 + '"');
701
+ }
702
+ var fn = operation2.implementation;
703
+ if (typeof fn !== "function") {
704
+ throw new Error('invalid operation "' + qualifiedName2 + '"');
705
+ }
706
+ var candidates = [
707
+ [ctx, this.instance, ...args],
708
+ [ctx, ...args],
709
+ [this.instance, ...args],
710
+ args
711
+ ];
712
+ for (var i = 0; i < candidates.length; i++) {
713
+ var candidate = candidates[i];
714
+ if (fn.length === candidate.length || fn.length <= candidate.length && fn.length >= 0) {
715
+ return fn.apply(this.instance, candidate);
716
+ }
717
+ }
718
+ return fn.apply(this.instance, args);
719
+ }
720
+ restart(data) {
721
+ this.stop();
722
+ this.startData = data;
723
+ this.ctx.done = false;
724
+ this.currentState = this.model;
725
+ this.start();
726
+ }
727
+ takeSnapshot() {
728
+ var events = [];
729
+ var currentStateName = this.currentState ? this.currentState.qualifiedName : this.model.qualifiedName;
730
+ var transitionsByEvent = this.model.transitionMap[currentStateName] || {};
731
+ for (var eventName in transitionsByEvent) {
732
+ var transitionList = transitionsByEvent[eventName];
733
+ for (var i = 0; i < transitionList.length; i++) {
734
+ events.push({
735
+ event: eventName,
736
+ target: transitionList[i].target,
737
+ guard: !!transitionList[i].guard,
738
+ schema: this.model.events[eventName] ? this.model.events[eventName].schema : void 0
739
+ });
740
+ }
741
+ }
742
+ return {
743
+ id: this.id,
744
+ qualifiedName: this.model.qualifiedName,
745
+ state: currentStateName,
746
+ attributes: Object.assign({}, this.attributes),
747
+ queueLen: this.queue.len(),
748
+ events
749
+ };
750
+ }
751
+ recordHistory(stateName) {
752
+ if (!stateName) {
753
+ return;
754
+ }
755
+ var child = stateName;
756
+ var parent = dirname(child);
757
+ while (parent && parent !== "." && parent !== "/") {
758
+ var element = this.model.members[parent];
759
+ if (element && isKind(element.kind, kinds.State)) {
760
+ this.historyDeep[parent] = stateName;
761
+ this.historyShallow[parent] = child;
762
+ }
763
+ if (parent === this.model.qualifiedName) {
764
+ break;
765
+ }
766
+ child = parent;
767
+ parent = dirname(parent);
768
+ }
769
+ }
770
+ followHistoryDefault(vertex, event2) {
771
+ for (var i = 0; i < vertex.transitions.length; i++) {
772
+ var transitionName = vertex.transitions[i];
773
+ var transitionCandidate = getTransition(this.model, transitionName);
774
+ if (!transitionCandidate) {
775
+ continue;
776
+ }
777
+ if (transitionCandidate.guard) {
778
+ var guard2 = getConstraint(this.model, transitionCandidate.guard);
779
+ if (guard2 && !guard2.expression(this.ctx, this.instance, event2)) {
780
+ continue;
781
+ }
782
+ }
783
+ return this.transition(vertex, transitionCandidate, event2);
784
+ }
785
+ return void 0;
786
+ }
787
+ dispatch(event2) {
788
+ if (!event2.kind) {
789
+ event2.kind = kinds.Event;
790
+ }
791
+ this.queue.push(event2);
792
+ this.notify("dispatched", event2.name);
793
+ if (this.processing) {
794
+ return;
795
+ }
796
+ if (this.currentState.qualifiedName === this.model.qualifiedName && this.ctx.done) {
797
+ return;
798
+ }
799
+ this.processing = true;
800
+ this.process();
801
+ }
802
+ process() {
803
+ var deferred = new Array(this.queue.len() + 1);
804
+ var deferredCount = 0;
805
+ var event2 = this.queue.pop();
806
+ while (event2) {
807
+ var currentStateName = this.currentState.qualifiedName;
808
+ var eventName = event2.name;
809
+ var deferredLookup = this.model.deferredMap[currentStateName];
810
+ var isDeferred = deferredLookup && deferredLookup[eventName] === true;
811
+ if (isDeferred) {
812
+ deferred[deferredCount++] = event2;
813
+ event2 = this.queue.pop();
814
+ continue;
815
+ }
816
+ var transitions = this.model.transitionMap[currentStateName][eventName];
817
+ if (transitions && transitions.length > 0) {
818
+ for (var i = 0; i < transitions.length; i++) {
819
+ var transition2 = transitions[i];
820
+ if (transition2.guard) {
821
+ var guard2 = getConstraint(this.model, transition2.guard);
822
+ if (guard2) {
823
+ try {
824
+ var guardResult = guard2.expression(
825
+ this.ctx,
826
+ this.instance,
827
+ event2
828
+ );
829
+ if (!guardResult) {
830
+ continue;
831
+ }
832
+ } catch (error) {
833
+ this.dispatch(
834
+ Object.create(ErrorEvent, {
835
+ data: { value: error }
836
+ })
837
+ );
838
+ continue;
839
+ }
840
+ }
841
+ }
842
+ var nextState = this.transition(this.currentState, transition2, event2);
843
+ if (nextState.qualifiedName !== this.currentState.qualifiedName) {
844
+ this.currentState = nextState;
845
+ for (var j = 0; j < deferredCount; j++) {
846
+ this.queue.push(deferred[j]);
847
+ }
848
+ deferredCount = 0;
849
+ }
850
+ break;
851
+ }
852
+ }
853
+ this.notify("processed", event2.name);
854
+ event2 = this.queue.pop();
855
+ }
856
+ for (var i = 0; i < deferredCount; i++) {
857
+ this.queue.push(deferred[i]);
858
+ }
859
+ this.processing = false;
860
+ this.notify("processed", "__next__");
861
+ }
862
+ transition(current, transition2, event2) {
863
+ var path = transition2.paths[current.qualifiedName];
864
+ if (!path) {
865
+ path = EMPTY_PATH;
866
+ }
867
+ for (var i = 0; i < path.exit.length; i++) {
868
+ var exitingName = path.exit[i];
869
+ var exiting = this.model.members[exitingName];
870
+ if (exiting && isStateElement(exiting)) {
871
+ this.exit(exiting, event2);
872
+ this.notify("exited", exitingName);
873
+ }
874
+ }
875
+ for (var i = 0; i < transition2.effect.length; i++) {
876
+ var effectName = transition2.effect[i];
877
+ var behavior = getBehavior(this.model, effectName);
878
+ if (behavior) {
879
+ this.execute(behavior, event2);
880
+ }
881
+ }
882
+ var enteredState;
883
+ for (var i = 0; i < path.enter.length; i++) {
884
+ var enteringName = path.enter[i];
885
+ var entering = getVertex(this.model, enteringName);
886
+ if (entering) {
887
+ var defaultEntry = entering.qualifiedName === transition2.target && transition2.kind !== kinds.Self;
888
+ enteredState = this.enter(entering, event2, defaultEntry);
889
+ }
890
+ }
891
+ var finalState = enteredState || getVertex(this.model, transition2.target);
892
+ return finalState || current;
893
+ }
894
+ enter(vertex, event2, defaultEntry) {
895
+ if (isStateElement(vertex)) {
896
+ var state2 = vertex;
897
+ this.recordHistory(state2.qualifiedName);
898
+ for (var i = 0; i < state2.entry.length; i++) {
899
+ var entryName = state2.entry[i];
900
+ var behavior = getBehavior(this.model, entryName);
901
+ if (behavior) {
902
+ this.execute(behavior, event2);
903
+ }
904
+ }
905
+ this.notify("entered", state2.qualifiedName);
906
+ for (var i = 0; i < state2.activities.length; i++) {
907
+ var activityName = state2.activities[i];
908
+ var behavior = getBehavior(this.model, activityName);
909
+ if (behavior) {
910
+ this.execute(behavior, event2);
911
+ }
912
+ }
913
+ if (defaultEntry && state2.initial) {
914
+ var initial2 = getVertex(this.model, state2.initial);
915
+ if (!initial2) {
916
+ return state2;
917
+ }
918
+ var initialTransition = getTransition(
919
+ this.model,
920
+ initial2.transitions[0]
921
+ );
922
+ if (initialTransition) {
923
+ return this.transition(state2, initialTransition, event2);
924
+ }
925
+ }
926
+ return state2;
927
+ }
928
+ if (isKind(vertex.kind, kinds.Choice) || isKind(vertex.kind, kinds.Junction)) {
929
+ var choiceVertex = vertex;
930
+ var chosenTransition = void 0;
931
+ for (var i = 0; i < choiceVertex.transitions.length; i++) {
932
+ var transitionName = choiceVertex.transitions[i];
933
+ var choiceTransition = getTransition(this.model, transitionName);
934
+ if (!choiceTransition) {
935
+ continue;
936
+ }
937
+ if (choiceTransition.guard) {
938
+ var guard2 = getConstraint(this.model, choiceTransition.guard);
939
+ if (guard2 && guard2.expression(this.ctx, this.instance, event2)) {
940
+ chosenTransition = choiceTransition;
941
+ break;
942
+ }
943
+ } else {
944
+ chosenTransition = choiceTransition;
945
+ break;
946
+ }
947
+ }
948
+ if (chosenTransition) {
949
+ return this.transition(choiceVertex, chosenTransition, event2);
950
+ }
951
+ throw new Error("No transition found for choice vertex " + choiceVertex.qualifiedName);
952
+ }
953
+ if (isKind(vertex.kind, kinds.ShallowHistory) || isKind(vertex.kind, kinds.DeepHistory)) {
954
+ var parent = dirname(vertex.qualifiedName);
955
+ var isShallowHistory = isKind(vertex.kind, kinds.ShallowHistory);
956
+ var resolved = isShallowHistory ? this.historyShallow[parent] : this.historyDeep[parent];
957
+ if (!resolved) {
958
+ var historyResult = this.followHistoryDefault(vertex, event2);
959
+ if (historyResult) {
960
+ return historyResult;
961
+ }
962
+ var parentState = getState(this.model, parent);
963
+ if (parentState && parentState.initial) {
964
+ var initialVertex = getVertex(this.model, parentState.initial);
965
+ if (initialVertex && initialVertex.transitions.length > 0) {
966
+ var initialTransition = getTransition(
967
+ this.model,
968
+ initialVertex.transitions[0]
969
+ );
970
+ if (initialTransition) {
971
+ return this.transition(
972
+ parentState,
973
+ initialTransition,
974
+ event2
975
+ );
976
+ }
977
+ }
978
+ }
979
+ return vertex;
980
+ }
981
+ var enterPath = [];
982
+ var currentPath = resolved;
983
+ while (currentPath && currentPath !== parent && currentPath !== ".") {
984
+ enterPath.unshift(currentPath);
985
+ currentPath = dirname(currentPath);
986
+ }
987
+ var currentVertex = vertex;
988
+ for (var i = 0; i < enterPath.length; i++) {
989
+ var entering = getVertex(this.model, enterPath[i]);
990
+ if (!entering) {
991
+ break;
992
+ }
993
+ currentVertex = this.enter(
994
+ entering,
995
+ event2,
996
+ isShallowHistory && i === enterPath.length - 1
997
+ );
998
+ }
999
+ return currentVertex;
1000
+ }
1001
+ if (isKind(vertex.kind, kinds.FinalState)) {
1002
+ this.notify("entered", vertex.qualifiedName);
1003
+ if (dirname(vertex.qualifiedName) === this.model.qualifiedName) {
1004
+ this.stop();
1005
+ }
1006
+ return vertex;
1007
+ }
1008
+ return vertex;
1009
+ }
1010
+ exit(state2, event2) {
1011
+ for (var i = 0; i < state2.activities.length; i++) {
1012
+ var activityName = state2.activities[i];
1013
+ var activity2 = getBehavior(this.model, activityName);
1014
+ if (activity2) {
1015
+ this.terminate(activity2);
1016
+ }
1017
+ }
1018
+ for (var i = 0; i < state2.exit.length; i++) {
1019
+ var exitName = state2.exit[i];
1020
+ var behavior = getBehavior(this.model, exitName);
1021
+ if (behavior) {
1022
+ this.execute(behavior, event2);
1023
+ }
1024
+ }
1025
+ }
1026
+ execute(behavior, event2) {
1027
+ var error = void 0;
1028
+ var operation2 = behavior.operation;
1029
+ var self = this;
1030
+ if (!operation2 && behavior.operationName) {
1031
+ operation2 = function(ctx, instance, evt) {
1032
+ self.invoke(behavior.operationName, ctx, [evt]);
1033
+ };
1034
+ }
1035
+ if (!operation2) {
1036
+ return;
1037
+ }
1038
+ if (isKind(behavior.kind, kinds.Concurrent)) {
1039
+ var controller = new Context();
1040
+ try {
1041
+ var asyncOperationPromise = Promise.resolve(
1042
+ operation2(controller, this.instance, event2)
1043
+ );
1044
+ this.active[behavior.qualifiedName] = {
1045
+ context: controller,
1046
+ promise: asyncOperationPromise.catch(function(error2) {
1047
+ self.dispatch(
1048
+ Object.create(ErrorEvent, {
1049
+ data: { value: error2 }
1050
+ })
1051
+ );
1052
+ }).then(function() {
1053
+ self.notify("executed", behavior.qualifiedName);
1054
+ self.notify(
1055
+ "executed",
1056
+ behavior.Owner ? behavior.Owner() : dirname(behavior.qualifiedName)
1057
+ );
1058
+ })
1059
+ };
1060
+ } catch (err) {
1061
+ error = err;
1062
+ }
1063
+ } else {
1064
+ try {
1065
+ operation2(this.ctx, this.instance, event2);
1066
+ this.notify("executed", behavior.qualifiedName);
1067
+ this.notify("executed", dirname(behavior.qualifiedName));
1068
+ } catch (err) {
1069
+ error = err;
1070
+ }
1071
+ }
1072
+ if (error) {
1073
+ this.dispatch(
1074
+ Object.create(ErrorEvent, {
1075
+ data: { value: error }
1076
+ })
1077
+ );
1078
+ }
1079
+ }
1080
+ terminate(activity2) {
1081
+ var active = this.active[activity2.qualifiedName];
1082
+ if (active) {
1083
+ active.context.done = true;
1084
+ for (var i = 0; i < active.context.listeners.length; i++) {
1085
+ active.context.listeners[i]();
1086
+ }
1087
+ delete this.active[activity2.qualifiedName];
1088
+ }
1089
+ }
1090
+ stop() {
1091
+ this.processing = true;
1092
+ while (this.currentState && this.currentState.qualifiedName !== this.model.qualifiedName) {
1093
+ var currentState = getState(this.model, this.currentState.qualifiedName);
1094
+ if (!currentState) {
1095
+ break;
1096
+ }
1097
+ this.exit(currentState, FinalEvent);
1098
+ var parentState = getState(
1099
+ this.model,
1100
+ dirname(this.currentState.qualifiedName)
1101
+ );
1102
+ if (!parentState) {
1103
+ break;
1104
+ }
1105
+ this.currentState = parentState;
1106
+ }
1107
+ this.processing = false;
1108
+ this.ctx.done = true;
1109
+ for (var i = 0; i < this.ctx.listeners.length; i++) {
1110
+ this.ctx.listeners[i]();
1111
+ }
1112
+ delete this.ctx.instances[this.id];
1113
+ }
1114
+ };
1115
+ function find(stack, ...kindsToMatch) {
1116
+ for (var i = stack.length - 1; i >= 0; i--) {
1117
+ var element = stack[i];
1118
+ for (var j = 0; j < kindsToMatch.length; j++) {
1119
+ if (isKind(element.kind, kindsToMatch[j])) {
1120
+ return element;
1121
+ }
1122
+ }
1123
+ }
1124
+ return void 0;
1125
+ }
1126
+ function start(ctxOrInstance, instance, model, maybeConfig) {
1127
+ var context = ctxOrInstance;
1128
+ var runtimeModel = model;
1129
+ var runtimeInstance = instance;
1130
+ if (!(context instanceof Context)) {
1131
+ maybeConfig = model;
1132
+ runtimeModel = instance;
1133
+ runtimeInstance = ctxOrInstance;
1134
+ context = new Context();
1135
+ }
1136
+ var sm = new HSM(
1137
+ context,
1138
+ runtimeInstance,
1139
+ runtimeModel,
1140
+ maybeConfig
1141
+ );
1142
+ sm.start();
1143
+ return runtimeInstance;
1144
+ }
1145
+ function stop(instance) {
1146
+ var runtime = runtimeFor(instance);
1147
+ if (runtime) {
1148
+ runtime.stop();
1149
+ }
1150
+ }
1151
+ function state(name2, ...partials) {
1152
+ return attachSpec(
1153
+ function(model, stack) {
1154
+ var namespace = find(stack, kinds.State, kinds.Model);
1155
+ var qualifiedName2 = join(namespace.qualifiedName, name2);
1156
+ var stateObj = {
1157
+ qualifiedName: qualifiedName2,
1158
+ kind: kinds.State,
1159
+ transitions: [],
1160
+ entry: [],
1161
+ exit: [],
1162
+ activities: [],
1163
+ deferred: []
1164
+ };
1165
+ model.members[stateObj.qualifiedName] = stateObj;
1166
+ stack.push(stateObj);
1167
+ apply(model, stack, partials);
1168
+ stack.pop();
1169
+ return stateObj;
1170
+ },
1171
+ {
1172
+ kind: "state",
1173
+ name: name2,
1174
+ parts: partials
1175
+ }
1176
+ );
1177
+ }
1178
+ function initial(nameOrPartial, ...partials) {
1179
+ var name2 = ".initial";
1180
+ if (typeof nameOrPartial === "string") {
1181
+ name2 = nameOrPartial;
1182
+ } else if (typeof nameOrPartial === "function") {
1183
+ partials = [nameOrPartial, ...partials];
1184
+ }
1185
+ return attachSpec(
1186
+ function(model, stack) {
1187
+ var state2 = findState(stack);
1188
+ if (!state2) {
1189
+ throw new Error("initial must be declared inside a state");
1190
+ }
1191
+ var initialName = join(state2.qualifiedName, name2);
1192
+ var initialObj = {
1193
+ qualifiedName: initialName,
1194
+ kind: kinds.Initial,
1195
+ transitions: []
1196
+ };
1197
+ model.members[initialName] = initialObj;
1198
+ state2.initial = initialName;
1199
+ var resolvedPartials = [source(initialObj.qualifiedName), on(InitialEvent), ...partials];
1200
+ stack.push(initialObj);
1201
+ var transitionObj = transition(...resolvedPartials)(model, stack);
1202
+ stack.pop();
1203
+ return transitionObj;
1204
+ },
1205
+ {
1206
+ kind: "initial",
1207
+ name: name2,
1208
+ parts: partials
1209
+ }
1210
+ );
1211
+ }
1212
+ function transition(...partials) {
1213
+ return attachSpec(
1214
+ function(model, stack) {
1215
+ var vertex = findVertex(stack);
1216
+ if (!vertex) {
1217
+ throw new Error("transition must be declared inside a vertex");
1218
+ }
1219
+ var name2 = "transition_" + Object.keys(model.members).length;
1220
+ var transitionObj = {
1221
+ qualifiedName: join(vertex.qualifiedName, name2),
1222
+ kind: kinds.Transition,
1223
+ // Will be updated later
1224
+ source: ".",
1225
+ guard: "",
1226
+ effect: [],
1227
+ events: [],
1228
+ paths: {},
1229
+ target: void 0
1230
+ };
1231
+ model.members[transitionObj.qualifiedName] = transitionObj;
1232
+ stack.push(transitionObj);
1233
+ apply(model, stack, partials);
1234
+ stack.pop();
1235
+ if (transitionObj.source == "." || !transitionObj.source) {
1236
+ transitionObj.source = vertex.qualifiedName;
1237
+ }
1238
+ var sourceElement = getVertex(model, transitionObj.source);
1239
+ if (!sourceElement) {
1240
+ throw new Error("invalid transition source " + transitionObj.source);
1241
+ }
1242
+ sourceElement.transitions.push(transitionObj.qualifiedName);
1243
+ model.partials.push(function() {
1244
+ if (transitionObj.target === transitionObj.source) {
1245
+ transitionObj.kind = kinds.Self;
1246
+ } else if (!transitionObj.target) {
1247
+ transitionObj.kind = kinds.Internal;
1248
+ } else if (isAncestor(transitionObj.source, transitionObj.target)) {
1249
+ transitionObj.kind = kinds.Local;
1250
+ } else {
1251
+ transitionObj.kind = kinds.External;
1252
+ }
1253
+ var lcaPath = lca(transitionObj.source, transitionObj.target);
1254
+ var enter = [];
1255
+ if (transitionObj.kind === kinds.Self) {
1256
+ enter.push(sourceElement.qualifiedName);
1257
+ } else {
1258
+ var entering = transitionObj.target;
1259
+ while (entering && entering !== lcaPath && entering !== "/") {
1260
+ enter.unshift(entering);
1261
+ entering = dirname(entering);
1262
+ }
1263
+ }
1264
+ if (sourceElement.kind === kinds.Initial) {
1265
+ transitionObj.paths[dirname(sourceElement.qualifiedName)] = {
1266
+ enter,
1267
+ exit: [sourceElement.qualifiedName]
1268
+ };
1269
+ return transitionObj;
1270
+ }
1271
+ model.partials.push(function() {
1272
+ if (transitionObj.kind === kinds.Internal) {
1273
+ return;
1274
+ }
1275
+ for (var qualifiedName2 in model.members) {
1276
+ var element = getVertex(model, qualifiedName2);
1277
+ if (!element) {
1278
+ continue;
1279
+ }
1280
+ if (transitionObj.source !== qualifiedName2 && !isAncestor(transitionObj.source, qualifiedName2)) {
1281
+ continue;
1282
+ }
1283
+ var exit2 = [];
1284
+ var exiting = element.qualifiedName;
1285
+ while (exiting !== lcaPath && exiting) {
1286
+ exit2.push(exiting);
1287
+ exiting = dirname(exiting);
1288
+ if (exiting === "/") {
1289
+ break;
1290
+ }
1291
+ }
1292
+ transitionObj.paths[element.qualifiedName] = {
1293
+ enter,
1294
+ exit: exit2
1295
+ };
1296
+ }
1297
+ });
1298
+ });
1299
+ return transitionObj;
1300
+ },
1301
+ {
1302
+ kind: "transition",
1303
+ parts: partials
1304
+ }
1305
+ );
1306
+ }
1307
+ function source(name2) {
1308
+ return attachSpec(
1309
+ function(model, stack) {
1310
+ var transition2 = findTransition(stack);
1311
+ if (!transition2) {
1312
+ return void 0;
1313
+ }
1314
+ var resolvedName = name2;
1315
+ if (!isAbsolute(resolvedName)) {
1316
+ var ancestor = findState(stack);
1317
+ if (ancestor) {
1318
+ resolvedName = join(ancestor.qualifiedName, resolvedName);
1319
+ }
1320
+ } else if (!isAncestor(model.qualifiedName, resolvedName)) {
1321
+ resolvedName = join(model.qualifiedName, resolvedName.slice(1));
1322
+ }
1323
+ transition2.source = resolvedName;
1324
+ return transition2;
1325
+ },
1326
+ {
1327
+ kind: "source",
1328
+ name: name2
1329
+ }
1330
+ );
1331
+ }
1332
+ function target(name2) {
1333
+ return attachSpec(
1334
+ function(model, stack) {
1335
+ var transition2 = findTransition(stack);
1336
+ if (!transition2) {
1337
+ return void 0;
1338
+ }
1339
+ var resolvedName = name2;
1340
+ if (!isAbsolute(resolvedName)) {
1341
+ var ancestor = findState(stack) || findModel(stack);
1342
+ if (ancestor) {
1343
+ resolvedName = join(ancestor.qualifiedName, resolvedName);
1344
+ }
1345
+ } else if (!isAncestor(model.qualifiedName, resolvedName)) {
1346
+ resolvedName = join(model.qualifiedName, resolvedName.slice(1));
1347
+ }
1348
+ transition2.target = resolvedName;
1349
+ return transition2;
1350
+ },
1351
+ {
1352
+ kind: "target",
1353
+ name: name2
1354
+ }
1355
+ );
1356
+ }
1357
+ function on(eventOrRecord) {
1358
+ const event2 = eventOrRecord;
1359
+ return attachSpec(
1360
+ function(model, stack) {
1361
+ var transition2 = findTransition(stack);
1362
+ if (!transition2) {
1363
+ return void 0;
1364
+ }
1365
+ var eventName = typeof event2 === "string" ? event2 : event2.name;
1366
+ transition2.events.push(eventName);
1367
+ if (typeof event2 !== "string") {
1368
+ registerEvent(model, event2);
1369
+ }
1370
+ return transition2;
1371
+ },
1372
+ {
1373
+ kind: "on",
1374
+ name: typeof eventOrRecord === "string" ? eventOrRecord : eventOrRecord.name,
1375
+ schema: typeof eventOrRecord === "string" ? void 0 : eventOrRecord.schema
1376
+ }
1377
+ );
1378
+ }
1379
+ function onSet(name2) {
1380
+ return attachSpec(
1381
+ function(model, stack) {
1382
+ var transition2 = findTransition(stack);
1383
+ if (!transition2) {
1384
+ return void 0;
1385
+ }
1386
+ var qualifiedName2 = qualifyModelName(model, name2);
1387
+ transition2.events.push(qualifiedName2);
1388
+ registerEvent(model, {
1389
+ kind: kinds.ChangeEvent,
1390
+ name: qualifiedName2,
1391
+ source: qualifiedName2
1392
+ });
1393
+ if (!model.attributes[qualifiedName2]) {
1394
+ model.attributes[qualifiedName2] = {
1395
+ name: name2,
1396
+ qualifiedName: qualifiedName2,
1397
+ hasDefault: false
1398
+ };
1399
+ }
1400
+ return transition2;
1401
+ },
1402
+ {
1403
+ kind: "onSet",
1404
+ name: name2
1405
+ }
1406
+ );
1407
+ }
1408
+ function onCall(name2) {
1409
+ return attachSpec(
1410
+ function(model, stack) {
1411
+ var transition2 = findTransition(stack);
1412
+ if (!transition2) {
1413
+ return void 0;
1414
+ }
1415
+ var qualifiedName2 = qualifyModelName(model, name2);
1416
+ transition2.events.push(qualifiedName2);
1417
+ registerEvent(model, {
1418
+ kind: kinds.CallEvent,
1419
+ name: qualifiedName2,
1420
+ source: qualifiedName2
1421
+ });
1422
+ model.partials.push(function() {
1423
+ if (!model.operations[qualifiedName2]) {
1424
+ throw new Error('missing operation "' + qualifiedName2 + '" for OnCall()');
1425
+ }
1426
+ });
1427
+ return transition2;
1428
+ },
1429
+ {
1430
+ kind: "onCall",
1431
+ name: name2
1432
+ }
1433
+ );
1434
+ }
1435
+ function when(expr) {
1436
+ if (typeof expr === "string") {
1437
+ return onSet(expr);
1438
+ }
1439
+ return function(model, stack) {
1440
+ var transition2 = findTransition(stack);
1441
+ if (!transition2) {
1442
+ return void 0;
1443
+ }
1444
+ var eventName = join(transition2.qualifiedName, "when_" + Object.keys(model.members).length);
1445
+ var event2 = {
1446
+ kind: kinds.TimeEvent,
1447
+ name: eventName
1448
+ };
1449
+ transition2.events.push(eventName);
1450
+ registerEvent(model, event2);
1451
+ model.partials.push(function() {
1452
+ var source2 = getState(model, transition2.source);
1453
+ if (!source2) {
1454
+ return;
1455
+ }
1456
+ pushBehaviors(
1457
+ join(source2.qualifiedName, "activity_when_" + source2.activities.length),
1458
+ kinds.Concurrent,
1459
+ source2.activities,
1460
+ model,
1461
+ [function(ctx, instance, evt) {
1462
+ var signal = expr(ctx, instance, evt);
1463
+ var signalLike = toSignalLike(signal);
1464
+ if (!signalLike) {
1465
+ return;
1466
+ }
1467
+ return new Promise(function(resolve) {
1468
+ var once = function() {
1469
+ if (!ctx.done) {
1470
+ instance.dispatch(event2);
1471
+ }
1472
+ resolve();
1473
+ };
1474
+ if (hasThen(signalLike)) {
1475
+ signalLike.then(once);
1476
+ } else if (hasAddEventListener(signalLike)) {
1477
+ signalLike.addEventListener("done", once);
1478
+ } else if (hasOn(signalLike)) {
1479
+ signalLike.on("ready", once);
1480
+ signalLike.on("done", once);
1481
+ }
1482
+ ctx.addEventListener("done", resolve);
1483
+ });
1484
+ }]
1485
+ );
1486
+ });
1487
+ };
1488
+ }
1489
+ function pushBehaviors(namePrefix, kind, namesList, model, operations) {
1490
+ for (var i = 0; i < operations.length; i++) {
1491
+ var operation2 = operations[i];
1492
+ var qualifiedName2 = namePrefix + "_" + namesList.length;
1493
+ var behavior = {
1494
+ qualifiedName: qualifiedName2,
1495
+ kind,
1496
+ operation: typeof operation2 === "function" ? operation2 : null,
1497
+ operationName: typeof operation2 === "string" ? qualifyModelName(model, operation2) : void 0
1498
+ };
1499
+ model.members[qualifiedName2] = behavior;
1500
+ namesList.push(qualifiedName2);
1501
+ }
1502
+ }
1503
+ function entry(...operations) {
1504
+ return attachSpec(
1505
+ function(model, stack) {
1506
+ var state2 = findState(stack);
1507
+ if (!state2) {
1508
+ return void 0;
1509
+ }
1510
+ pushBehaviors(join(state2.qualifiedName, "entry"), kinds.Sequential, state2.entry, model, operations);
1511
+ return state2;
1512
+ },
1513
+ {
1514
+ kind: "entry",
1515
+ value: operations
1516
+ }
1517
+ );
1518
+ }
1519
+ function exit(...operations) {
1520
+ return attachSpec(
1521
+ function(model, stack) {
1522
+ var state2 = findState(stack);
1523
+ if (!state2) {
1524
+ return void 0;
1525
+ }
1526
+ pushBehaviors(join(state2.qualifiedName, "exit"), kinds.Sequential, state2.exit, model, operations);
1527
+ return state2;
1528
+ },
1529
+ {
1530
+ kind: "exit",
1531
+ value: operations
1532
+ }
1533
+ );
1534
+ }
1535
+ function activity(...operations) {
1536
+ return attachSpec(
1537
+ function(model, stack) {
1538
+ var state2 = findState(stack);
1539
+ if (!state2) {
1540
+ return void 0;
1541
+ }
1542
+ pushBehaviors(join(state2.qualifiedName, "activity"), kinds.Concurrent, state2.activities, model, operations);
1543
+ return state2;
1544
+ },
1545
+ {
1546
+ kind: "activity",
1547
+ value: operations
1548
+ }
1549
+ );
1550
+ }
1551
+ function effect(...operations) {
1552
+ return attachSpec(
1553
+ function(model, stack) {
1554
+ var transition2 = findTransition(stack);
1555
+ if (!transition2) {
1556
+ return void 0;
1557
+ }
1558
+ pushBehaviors(join(transition2.qualifiedName, "effect"), kinds.Sequential, transition2.effect, model, operations);
1559
+ return transition2;
1560
+ },
1561
+ {
1562
+ kind: "effect",
1563
+ value: operations
1564
+ }
1565
+ );
1566
+ }
1567
+ function guard(expression) {
1568
+ return attachSpec(
1569
+ function(model, stack) {
1570
+ var transition2 = findTransition(stack);
1571
+ if (!transition2) {
1572
+ return void 0;
1573
+ }
1574
+ var name2 = join(transition2.qualifiedName, "guard");
1575
+ var constraint = {
1576
+ qualifiedName: name2,
1577
+ kind: kinds.Constraint,
1578
+ expression: typeof expression === "function" ? expression : resolveOperation(model, expression)
1579
+ };
1580
+ model.members[name2] = constraint;
1581
+ transition2.guard = name2;
1582
+ },
1583
+ {
1584
+ kind: "guard",
1585
+ value: expression
1586
+ }
1587
+ );
1588
+ }
1589
+ function attribute(name2, maybeDefault) {
1590
+ var hasDefault = arguments.length > 1;
1591
+ return attachSpec(
1592
+ function(model) {
1593
+ var qualifiedName2 = qualifyModelName(model, name2);
1594
+ model.attributes[qualifiedName2] = {
1595
+ name: name2,
1596
+ qualifiedName: qualifiedName2,
1597
+ hasDefault,
1598
+ defaultValue: maybeDefault
1599
+ };
1600
+ return void 0;
1601
+ },
1602
+ {
1603
+ kind: "attribute",
1604
+ name: name2,
1605
+ value: maybeDefault
1606
+ }
1607
+ );
1608
+ }
1609
+ function operation(name2, implementation) {
1610
+ return attachSpec(
1611
+ function(model) {
1612
+ var qualifiedName2 = qualifyModelName(model, name2);
1613
+ model.operations[qualifiedName2] = {
1614
+ name: name2,
1615
+ qualifiedName: qualifiedName2,
1616
+ implementation
1617
+ };
1618
+ return void 0;
1619
+ },
1620
+ {
1621
+ kind: "operation",
1622
+ name: name2,
1623
+ impl: implementation
1624
+ }
1625
+ );
1626
+ }
1627
+ function after(duration) {
1628
+ return attachSpec(function(model, stack) {
1629
+ var transition2 = findTransition(stack);
1630
+ if (!transition2) {
1631
+ return void 0;
1632
+ }
1633
+ var eventName = join(transition2.qualifiedName, "after_" + Object.keys(model.members).length);
1634
+ var event2 = {
1635
+ name: eventName,
1636
+ kind: kinds.TimeEvent
1637
+ };
1638
+ transition2.events.push(eventName);
1639
+ registerEvent(model, event2);
1640
+ model.partials.push(function() {
1641
+ var source2 = getState(model, transition2.source);
1642
+ if (!source2) {
1643
+ return;
1644
+ }
1645
+ pushBehaviors(
1646
+ join(source2.qualifiedName, "activity_after_" + source2.activities.length),
1647
+ kinds.Concurrent,
1648
+ // Activities can be concurrent/asynchronous
1649
+ source2.activities,
1650
+ model,
1651
+ [
1652
+ function(ctx, instance, evt) {
1653
+ var runtime = runtimeFor(instance);
1654
+ if (!runtime) {
1655
+ return;
1656
+ }
1657
+ var delay = typeof duration === "string" ? coerceDuration(instance.get(duration)) : duration(ctx, instance, evt);
1658
+ return withThenable(delay, function(value) {
1659
+ if (ctx.done) {
1660
+ return;
1661
+ }
1662
+ var coerceDelay = coerceDuration(value);
1663
+ if (coerceDelay <= 0) {
1664
+ return;
1665
+ }
1666
+ return new Promise(function(resolve) {
1667
+ var timeout = runtime.clock.setTimeout(function() {
1668
+ instance.dispatch(event2);
1669
+ resolve();
1670
+ }, coerceDelay);
1671
+ ctx.addEventListener("done", function() {
1672
+ runtime.clock.clearTimeout(timeout);
1673
+ resolve();
1674
+ });
1675
+ });
1676
+ });
1677
+ }
1678
+ ]
1679
+ );
1680
+ });
1681
+ }, {
1682
+ kind: "after",
1683
+ value: duration
1684
+ });
1685
+ }
1686
+ function every(duration) {
1687
+ return attachSpec(function(model, stack) {
1688
+ var transition2 = findTransition(stack);
1689
+ if (!transition2) {
1690
+ return void 0;
1691
+ }
1692
+ var eventName = join(transition2.qualifiedName, "every_" + Object.keys(model.members).length);
1693
+ var event2 = {
1694
+ name: eventName,
1695
+ kind: kinds.TimeEvent
1696
+ };
1697
+ transition2.events.push(eventName);
1698
+ registerEvent(model, event2);
1699
+ model.partials.push(function() {
1700
+ var source2 = getState(model, transition2.source);
1701
+ if (!source2) {
1702
+ return;
1703
+ }
1704
+ pushBehaviors(
1705
+ join(source2.qualifiedName, "activity_every_" + source2.activities.length),
1706
+ kinds.Concurrent,
1707
+ // Activities can be concurrent/asynchronous
1708
+ source2.activities,
1709
+ model,
1710
+ [
1711
+ function(ctx, instance, evt) {
1712
+ var runtime = runtimeFor(instance);
1713
+ if (!runtime) {
1714
+ return;
1715
+ }
1716
+ var interval = typeof duration === "string" ? coerceDuration(instance.get(duration)) : duration(ctx, instance, evt);
1717
+ return withThenable(interval, function(value) {
1718
+ if (ctx.done) {
1719
+ return;
1720
+ }
1721
+ var coerceInterval = coerceDuration(value);
1722
+ if (coerceInterval <= 0) {
1723
+ return;
1724
+ }
1725
+ return new Promise(function(resolve) {
1726
+ var timeout = runtime.clock.setTimeout(function tick() {
1727
+ if (ctx.done) {
1728
+ runtime.clock.clearTimeout(timeout);
1729
+ resolve();
1730
+ return;
1731
+ }
1732
+ instance.dispatch(event2);
1733
+ timeout = runtime.clock.setTimeout(tick, coerceInterval);
1734
+ }, coerceInterval);
1735
+ ctx.addEventListener("done", function() {
1736
+ runtime.clock.clearTimeout(timeout);
1737
+ resolve();
1738
+ });
1739
+ });
1740
+ });
1741
+ }
1742
+ ]
1743
+ );
1744
+ });
1745
+ }, {
1746
+ kind: "every",
1747
+ value: duration
1748
+ });
1749
+ }
1750
+ function at(timepoint) {
1751
+ return attachSpec(function(model, stack) {
1752
+ var transition2 = findTransition(stack);
1753
+ if (!transition2) {
1754
+ return void 0;
1755
+ }
1756
+ var eventName = join(transition2.qualifiedName, "at_" + Object.keys(model.members).length);
1757
+ var event2 = {
1758
+ name: eventName,
1759
+ kind: kinds.TimeEvent
1760
+ };
1761
+ transition2.events.push(eventName);
1762
+ registerEvent(model, event2);
1763
+ model.partials.push(function() {
1764
+ var source2 = getState(model, transition2.source);
1765
+ if (!source2) {
1766
+ return;
1767
+ }
1768
+ pushBehaviors(
1769
+ join(source2.qualifiedName, "activity_at_" + source2.activities.length),
1770
+ kinds.Concurrent,
1771
+ source2.activities,
1772
+ model,
1773
+ [function(ctx, instance, evt) {
1774
+ var runtime = runtimeFor(instance);
1775
+ if (!runtime) {
1776
+ return;
1777
+ }
1778
+ var timepointValue = typeof timepoint === "string" ? coerceTimepoint(instance.get(timepoint)) : timepoint(ctx, instance, evt);
1779
+ return withThenable(timepointValue, function(value) {
1780
+ if (ctx.done) {
1781
+ return;
1782
+ }
1783
+ var deadline = coerceTimepoint(value);
1784
+ var delay = deadline - runtime.clock.now();
1785
+ if (delay <= 0) {
1786
+ instance.dispatch(event2);
1787
+ return;
1788
+ }
1789
+ return new Promise(function(resolve) {
1790
+ var timeout = runtime.clock.setTimeout(function() {
1791
+ instance.dispatch(event2);
1792
+ resolve();
1793
+ }, delay);
1794
+ ctx.addEventListener("done", function() {
1795
+ runtime.clock.clearTimeout(timeout);
1796
+ resolve();
1797
+ });
1798
+ });
1799
+ });
1800
+ }]
1801
+ );
1802
+ });
1803
+ }, {
1804
+ kind: "at",
1805
+ value: timepoint
1806
+ });
1807
+ }
1808
+ function defer(...eventNames) {
1809
+ var names = eventNames;
1810
+ return attachSpec(
1811
+ function(model, stack) {
1812
+ var state2 = findState(stack);
1813
+ if (!state2) {
1814
+ return void 0;
1815
+ }
1816
+ for (var i = 0; i < names.length; i++) {
1817
+ state2.deferred.push(names[i]);
1818
+ }
1819
+ return state2;
1820
+ },
1821
+ {
1822
+ kind: "defer",
1823
+ eventNames
1824
+ }
1825
+ );
1826
+ }
1827
+ function final(name2) {
1828
+ return attachSpec(
1829
+ function(model, stack) {
1830
+ var parent = findState(stack);
1831
+ if (!parent) {
1832
+ return void 0;
1833
+ }
1834
+ var qualifiedName2 = join(parent.qualifiedName, name2);
1835
+ var finalState = {
1836
+ qualifiedName: qualifiedName2,
1837
+ kind: kinds.FinalState,
1838
+ entry: [],
1839
+ exit: [],
1840
+ activities: [],
1841
+ deferred: [],
1842
+ transitions: [],
1843
+ initial: void 0
1844
+ };
1845
+ model.members[qualifiedName2] = finalState;
1846
+ return finalState;
1847
+ },
1848
+ {
1849
+ kind: "final",
1850
+ name: name2
1851
+ }
1852
+ );
1853
+ }
1854
+ function shallowHistory(elementOrName) {
1855
+ var partials = slice(arguments, 1);
1856
+ var name2 = "";
1857
+ if (typeof elementOrName === "string") {
1858
+ name2 = elementOrName;
1859
+ } else if (typeof elementOrName === "function") {
1860
+ partials.unshift(elementOrName);
1861
+ }
1862
+ return function(model, stack) {
1863
+ var owner = findState(stack);
1864
+ if (!owner) {
1865
+ return void 0;
1866
+ }
1867
+ if (!name2) {
1868
+ name2 = "shallow_history_" + Object.keys(model.members).length;
1869
+ }
1870
+ var qualifiedName2 = join(owner.qualifiedName, name2);
1871
+ var history = {
1872
+ qualifiedName: qualifiedName2,
1873
+ kind: kinds.ShallowHistory,
1874
+ transitions: []
1875
+ };
1876
+ model.members[qualifiedName2] = history;
1877
+ stack.push(history);
1878
+ apply(model, stack, partials);
1879
+ stack.pop();
1880
+ return history;
1881
+ };
1882
+ }
1883
+ function deepHistory(elementOrName) {
1884
+ var partials = slice(arguments, 1);
1885
+ var name2 = "";
1886
+ if (typeof elementOrName === "string") {
1887
+ name2 = elementOrName;
1888
+ } else if (typeof elementOrName === "function") {
1889
+ partials.unshift(elementOrName);
1890
+ }
1891
+ return function(model, stack) {
1892
+ var owner = findState(stack);
1893
+ if (!owner) {
1894
+ return void 0;
1895
+ }
1896
+ if (!name2) {
1897
+ name2 = "deep_history_" + Object.keys(model.members).length;
1898
+ }
1899
+ var qualifiedName2 = join(owner.qualifiedName, name2);
1900
+ var history = {
1901
+ qualifiedName: qualifiedName2,
1902
+ kind: kinds.DeepHistory,
1903
+ transitions: []
1904
+ };
1905
+ model.members[qualifiedName2] = history;
1906
+ stack.push(history);
1907
+ apply(model, stack, partials);
1908
+ stack.pop();
1909
+ return history;
1910
+ };
1911
+ }
1912
+ function choice(elementOrName) {
1913
+ var partials = slice(arguments, 1);
1914
+ var name2 = "";
1915
+ if (typeof elementOrName === "string") {
1916
+ name2 = elementOrName;
1917
+ } else if (typeof elementOrName === "function") {
1918
+ partials.unshift(elementOrName);
1919
+ }
1920
+ return function(model, stack) {
1921
+ var owner = find(stack, kinds.Transition, kinds.State);
1922
+ if (!owner) {
1923
+ return void 0;
1924
+ }
1925
+ if (isTransitionElement(owner)) {
1926
+ var transition2 = owner;
1927
+ var source2 = transition2.source;
1928
+ var ownerVertex = getVertex(model, source2);
1929
+ if (!ownerVertex) {
1930
+ return void 0;
1931
+ }
1932
+ if (isKind(ownerVertex.kind, kinds.Pseudostate)) {
1933
+ owner = find(stack, kinds.State);
1934
+ } else if (isStateElement(ownerVertex)) {
1935
+ owner = ownerVertex;
1936
+ } else {
1937
+ return void 0;
1938
+ }
1939
+ }
1940
+ if (!owner || !isStateElement(owner)) {
1941
+ return void 0;
1942
+ }
1943
+ if (name2 === "") {
1944
+ name2 = "choice_" + Object.keys(model.members).length;
1945
+ }
1946
+ var qualifiedName2 = join(owner.qualifiedName, name2);
1947
+ var choice2 = {
1948
+ qualifiedName: qualifiedName2,
1949
+ kind: kinds.Choice,
1950
+ transitions: []
1951
+ };
1952
+ model.members[qualifiedName2] = choice2;
1953
+ stack.push(choice2);
1954
+ apply(model, stack, partials);
1955
+ stack.pop();
1956
+ return choice2;
1957
+ };
1958
+ }
1959
+ function dispatchAll(ctx, event2) {
1960
+ for (var id2 in ctx.instances) {
1961
+ var instance = ctx.instances[id2];
1962
+ instance.dispatch(event2);
1963
+ }
1964
+ }
1965
+ function define(name2, ...partials) {
1966
+ var model = {
1967
+ qualifiedName: join("/", name2),
1968
+ kind: kinds.Model,
1969
+ members: {},
1970
+ transitions: [],
1971
+ entry: [],
1972
+ exit: [],
1973
+ activities: [],
1974
+ deferred: [],
1975
+ initial: "",
1976
+ transitionMap: {},
1977
+ deferredMap: {},
1978
+ events: {},
1979
+ attributes: {},
1980
+ operations: {},
1981
+ partials: []
1982
+ };
1983
+ model.members[model.qualifiedName] = model;
1984
+ registerEvent(model, InitialEvent);
1985
+ registerEvent(model, FinalEvent);
1986
+ registerEvent(model, ErrorEvent);
1987
+ var stack = [model];
1988
+ apply(model, stack, partials);
1989
+ while (model.partials.length > 0) {
1990
+ var currentPartials = model.partials.slice();
1991
+ model.partials = [];
1992
+ for (var i = 0; i < currentPartials.length; i++) {
1993
+ currentPartials[i](model, stack);
1994
+ }
1995
+ }
1996
+ buildTransitionTable(model);
1997
+ buildDeferredTable(model);
1998
+ return model;
1999
+ }
2000
+ function dispatchTo(ctx, event2, ...ids) {
2001
+ if (!ids.length) {
2002
+ return dispatchAll(ctx, event2);
2003
+ }
2004
+ for (var i = 0; i < ids.length; i++) {
2005
+ var instance = ctx.instances[ids[i]];
2006
+ if (instance) {
2007
+ instance.dispatch(event2);
2008
+ }
2009
+ }
2010
+ }
2011
+ function get(ctxOrInstance, maybeInstanceOrName, maybeName) {
2012
+ var instance = ctxOrInstance instanceof Context ? maybeInstanceOrName : ctxOrInstance;
2013
+ var name2 = ctxOrInstance instanceof Context ? maybeName : maybeInstanceOrName;
2014
+ if (ctxOrInstance instanceof Context && typeof maybeName !== "string") {
2015
+ return void 0;
2016
+ }
2017
+ if (!name2) {
2018
+ return void 0;
2019
+ }
2020
+ if (!instance) {
2021
+ return void 0;
2022
+ }
2023
+ var runtime = runtimeFor(instance);
2024
+ return runtime ? runtime.get(name2) : void 0;
2025
+ }
2026
+ function set(ctxOrInstance, maybeInstanceOrName, maybeNameOrValue, maybeValue) {
2027
+ var instance = ctxOrInstance instanceof Context ? maybeInstanceOrName : ctxOrInstance;
2028
+ var name2 = ctxOrInstance instanceof Context ? maybeNameOrValue : maybeInstanceOrName;
2029
+ var value = ctxOrInstance instanceof Context ? maybeValue : maybeNameOrValue;
2030
+ if (!instance) {
2031
+ return;
2032
+ }
2033
+ var runtime = runtimeFor(instance);
2034
+ if (runtime) {
2035
+ runtime.set(name2, value);
2036
+ }
2037
+ }
2038
+ function call(ctxOrInstance, maybeInstanceOrName, maybeName, ...args) {
2039
+ var instance = ctxOrInstance instanceof Context ? maybeInstanceOrName : ctxOrInstance;
2040
+ var name2 = ctxOrInstance instanceof Context ? maybeName : maybeInstanceOrName;
2041
+ if (!instance) {
2042
+ return void 0;
2043
+ }
2044
+ var callArgs = slice(arguments, ctxOrInstance instanceof Context ? 3 : 2);
2045
+ var runtime = runtimeFor(instance);
2046
+ if (runtime) {
2047
+ return runtime.call(name2, ...callArgs);
2048
+ }
2049
+ }
2050
+ function restart(instance, data) {
2051
+ var runtime = runtimeFor(instance);
2052
+ if (runtime) {
2053
+ runtime.restart(data);
2054
+ }
2055
+ }
2056
+ function takeSnapshot(ctxOrInstance, maybeInstance) {
2057
+ var instance = ctxOrInstance instanceof Context ? maybeInstance : ctxOrInstance;
2058
+ var runtime = runtimeFor(instance);
2059
+ return runtime ? runtime.takeSnapshot() : {
2060
+ id: "",
2061
+ qualifiedName: "",
2062
+ state: "",
2063
+ attributes: {},
2064
+ queueLen: 0,
2065
+ events: []
2066
+ };
2067
+ }
2068
+ function afterProcess(ctx, instance, maybeEvent) {
2069
+ return new Promise(function(resolve) {
2070
+ var runtime = runtimeFor(instance);
2071
+ if (!runtime) {
2072
+ resolve();
2073
+ return;
2074
+ }
2075
+ if (maybeEvent) {
2076
+ runtime.onAfter("processed", maybeEvent.name, function() {
2077
+ resolve();
2078
+ });
2079
+ return;
2080
+ }
2081
+ if (!runtime.processing) {
2082
+ resolve();
2083
+ return;
2084
+ }
2085
+ runtime.onAfter("processed", "__next__", function() {
2086
+ resolve();
2087
+ });
2088
+ });
2089
+ }
2090
+ function afterDispatch(ctx, instance, event2) {
2091
+ return new Promise(function(resolve) {
2092
+ var runtime = runtimeFor(instance);
2093
+ if (!runtime) {
2094
+ resolve();
2095
+ return;
2096
+ }
2097
+ runtime.onAfter("dispatched", event2.name, function() {
2098
+ resolve();
2099
+ });
2100
+ });
2101
+ }
2102
+ function afterEntry(ctx, instance, stateName) {
2103
+ return new Promise(function(resolve) {
2104
+ var runtime = runtimeFor(instance);
2105
+ if (!runtime) {
2106
+ resolve();
2107
+ return;
2108
+ }
2109
+ runtime.onAfter("entered", stateName, function() {
2110
+ resolve();
2111
+ });
2112
+ });
2113
+ }
2114
+ function afterExit(ctx, instance, stateName) {
2115
+ return new Promise(function(resolve) {
2116
+ var runtime = runtimeFor(instance);
2117
+ if (!runtime) {
2118
+ resolve();
2119
+ return;
2120
+ }
2121
+ runtime.onAfter("exited", stateName, function() {
2122
+ resolve();
2123
+ });
2124
+ });
2125
+ }
2126
+ function afterExecuted(ctx, instance, stateOrBehavior) {
2127
+ return new Promise(function(resolve) {
2128
+ var runtime = runtimeFor(instance);
2129
+ if (!runtime) {
2130
+ resolve();
2131
+ return;
2132
+ }
2133
+ runtime.onAfter("executed", stateOrBehavior, function() {
2134
+ resolve();
2135
+ });
2136
+ });
2137
+ }
2138
+ function id(instance) {
2139
+ var runtime = runtimeFor(instance);
2140
+ return runtime ? runtime.id : "";
2141
+ }
2142
+ function qualifiedName(instance) {
2143
+ var runtime = runtimeFor(instance);
2144
+ return runtime ? runtime.model.qualifiedName : "";
2145
+ }
2146
+ function name(instance) {
2147
+ var runtime = runtimeFor(instance);
2148
+ return runtime ? runtime.name : "";
2149
+ }
2150
+ function clock(instance) {
2151
+ if (instance instanceof Group) {
2152
+ return instance.clock();
2153
+ }
2154
+ var runtime = runtimeFor(instance);
2155
+ return runtime ? runtime.clock : DefaultClock;
2156
+ }
2157
+ var Group = class _Group {
2158
+ instances = [];
2159
+ __hsm_group_members;
2160
+ constructor(...instances) {
2161
+ for (var i = 0; i < instances.length; i++) {
2162
+ var instance = instances[i];
2163
+ if (!instance) {
2164
+ continue;
2165
+ }
2166
+ if (instance instanceof _Group) {
2167
+ for (var j = 0; j < instance.instances.length; j++) {
2168
+ this.instances.push(instance.instances[j]);
2169
+ }
2170
+ continue;
2171
+ }
2172
+ this.instances.push(instance);
2173
+ }
2174
+ }
2175
+ dispatch(event2) {
2176
+ for (var i = 0; i < this.instances.length; i++) {
2177
+ this.instances[i].dispatch(event2);
2178
+ }
2179
+ }
2180
+ set(name2, value) {
2181
+ for (var i = 0; i < this.instances.length; i++) {
2182
+ this.instances[i].set(name2, value);
2183
+ }
2184
+ }
2185
+ call(name2, ...args) {
2186
+ if (!this.instances.length) {
2187
+ return void 0;
2188
+ }
2189
+ return this.instances[0].call(name2, ...args);
2190
+ }
2191
+ stop() {
2192
+ for (var i = 0; i < this.instances.length; i++) {
2193
+ stop(this.instances[i]);
2194
+ }
2195
+ }
2196
+ restart(data) {
2197
+ for (var i = 0; i < this.instances.length; i++) {
2198
+ restart(this.instances[i], data);
2199
+ }
2200
+ }
2201
+ takeSnapshot() {
2202
+ var members = [];
2203
+ var queueLen = 0;
2204
+ var events = [];
2205
+ var ids = [];
2206
+ var qualifiedNames = [];
2207
+ var states = [];
2208
+ for (var i = 0; i < this.instances.length; i++) {
2209
+ var snapshot = this.instances[i].takeSnapshot();
2210
+ members.push(snapshot);
2211
+ queueLen += snapshot.queueLen;
2212
+ ids.push(snapshot.id);
2213
+ qualifiedNames.push(snapshot.qualifiedName);
2214
+ states.push(snapshot.state);
2215
+ for (var j = 0; j < snapshot.events.length; j++) {
2216
+ events.push(snapshot.events[j]);
2217
+ }
2218
+ }
2219
+ return {
2220
+ id: ids.join(","),
2221
+ qualifiedName: qualifiedNames.join(","),
2222
+ state: states.join(" | "),
2223
+ attributes: {},
2224
+ queueLen,
2225
+ events,
2226
+ members
2227
+ };
2228
+ }
2229
+ clock() {
2230
+ return DefaultClock;
2231
+ }
2232
+ };
2233
+ function makeGroup() {
2234
+ return new Group(...slice(arguments, 0));
2235
+ }
2236
+ var NullKind = kinds.Null;
2237
+ var ElementKind = kinds.Element;
2238
+ var PartialKind = kinds.Partial;
2239
+ var VertexKind = kinds.Vertex;
2240
+ var ConstraintKind = kinds.Constraint;
2241
+ var BehaviorKind = kinds.Behavior;
2242
+ var NamespaceKind = kinds.Namespace;
2243
+ var ConcurrentKind = kinds.Concurrent;
2244
+ var SequentialKind = kinds.Sequential;
2245
+ var StateMachineKind = kinds.StateMachine;
2246
+ var AttributeKind = kinds.Attribute;
2247
+ var StateKind = kinds.State;
2248
+ var ModelKind = kinds.Model;
2249
+ var TransitionKind = kinds.Transition;
2250
+ var InternalKind = kinds.Internal;
2251
+ var ExternalKind = kinds.External;
2252
+ var LocalKind = kinds.Local;
2253
+ var SelfKind = kinds.Self;
2254
+ var EventKind = kinds.Event;
2255
+ var CompletionEventKind = kinds.CompletionEvent;
2256
+ var ChangeEventKind = kinds.ChangeEvent;
2257
+ var ErrorEventKind = kinds.ErrorEvent;
2258
+ var TimeEventKind = kinds.TimeEvent;
2259
+ var CallEventKind = kinds.CallEvent;
2260
+ var PseudostateKind = kinds.Pseudostate;
2261
+ var InitialKind = kinds.Initial;
2262
+ var FinalStateKind = kinds.FinalState;
2263
+ var ChoiceKind = kinds.Choice;
2264
+ var JunctionKind = kinds.Junction;
2265
+ var DeepHistoryKind = kinds.DeepHistory;
2266
+ var ShallowHistoryKind = kinds.ShallowHistory;
2267
+ var Define = define;
2268
+ var State = state;
2269
+ var Final = final;
2270
+ var ShallowHistory = shallowHistory;
2271
+ var DeepHistory = deepHistory;
2272
+ var Choice = choice;
2273
+ var Transition = transition;
2274
+ var Initial = initial;
2275
+ var Event = event;
2276
+ var On = on;
2277
+ var OnCall = onCall;
2278
+ var OnSet = onSet;
2279
+ var When = when;
2280
+ var After = after;
2281
+ var Every = every;
2282
+ var At = at;
2283
+ var Target = target;
2284
+ var Source = source;
2285
+ var Entry = entry;
2286
+ var Exit = exit;
2287
+ var Activity = activity;
2288
+ var Effect = effect;
2289
+ var Guard = guard;
2290
+ var Defer = defer;
2291
+ var Attribute = attribute;
2292
+ var Operation = operation;
2293
+ var DispatchAll = dispatchAll;
2294
+ var DispatchTo = dispatchTo;
2295
+ var Get = get;
2296
+ var Set = set;
2297
+ var Call = call;
2298
+ var Restart = restart;
2299
+ var TakeSnapshot = takeSnapshot;
2300
+ var MakeGroup = makeGroup;
2301
+ var LCA = lca;
2302
+ var IsAncestor = isAncestor;
2303
+ var ID = id;
2304
+ var QualifiedName = qualifiedName;
2305
+ var Name = name;
2306
+ var Clock = clock;
2307
+ export {
2308
+ Activity,
2309
+ After,
2310
+ At,
2311
+ Attribute,
2312
+ AttributeKind,
2313
+ BehaviorKind,
2314
+ Call,
2315
+ CallEventKind,
2316
+ ChangeEventKind,
2317
+ Choice,
2318
+ ChoiceKind,
2319
+ Clock,
2320
+ CompletionEventKind,
2321
+ ConcurrentKind,
2322
+ ConstraintKind,
2323
+ Context,
2324
+ DeepHistory,
2325
+ DeepHistoryKind,
2326
+ DefaultClock,
2327
+ Defer,
2328
+ Define,
2329
+ DispatchAll,
2330
+ DispatchTo,
2331
+ Effect,
2332
+ ElementKind,
2333
+ Entry,
2334
+ ErrorEvent,
2335
+ ErrorEventKind,
2336
+ Event,
2337
+ EventKind,
2338
+ Every,
2339
+ Exit,
2340
+ ExternalKind,
2341
+ Final,
2342
+ FinalEvent,
2343
+ FinalStateKind,
2344
+ Generator,
2345
+ Get,
2346
+ Group,
2347
+ Guard,
2348
+ ID,
2349
+ Initial,
2350
+ InitialEvent,
2351
+ InitialKind,
2352
+ Instance,
2353
+ InternalKind,
2354
+ IsAncestor,
2355
+ isKind as IsKind,
2356
+ JunctionKind,
2357
+ kinds as Kinds,
2358
+ LCA,
2359
+ LocalKind,
2360
+ MUID,
2361
+ MakeGroup,
2362
+ makeKind as MakeKind,
2363
+ ModelKind,
2364
+ Name,
2365
+ NamespaceKind,
2366
+ NullKind,
2367
+ On,
2368
+ OnCall,
2369
+ OnSet,
2370
+ Operation,
2371
+ PartialKind,
2372
+ PseudostateKind,
2373
+ QualifiedName,
2374
+ Queue,
2375
+ Restart,
2376
+ SelfKind,
2377
+ SequentialKind,
2378
+ Set,
2379
+ ShallowHistory,
2380
+ ShallowHistoryKind,
2381
+ ShardedGenerators,
2382
+ Source,
2383
+ State,
2384
+ StateKind,
2385
+ StateMachineKind,
2386
+ TakeSnapshot,
2387
+ Target,
2388
+ TimeEventKind,
2389
+ Transition,
2390
+ TransitionKind,
2391
+ VertexKind,
2392
+ When,
2393
+ activity,
2394
+ add64,
2395
+ after,
2396
+ afterDispatch,
2397
+ afterEntry,
2398
+ afterExecuted,
2399
+ afterExit,
2400
+ afterProcess,
2401
+ and64,
2402
+ apply,
2403
+ at,
2404
+ attribute,
2405
+ call,
2406
+ choice,
2407
+ clock,
2408
+ cmp64,
2409
+ deepHistory,
2410
+ defer,
2411
+ define,
2412
+ dirname,
2413
+ dispatchAll,
2414
+ dispatchTo,
2415
+ effect,
2416
+ entry,
2417
+ event,
2418
+ every,
2419
+ exit,
2420
+ final,
2421
+ find,
2422
+ from32,
2423
+ get,
2424
+ getDefaultConfig,
2425
+ guard,
2426
+ id,
2427
+ initial,
2428
+ isAbsolute,
2429
+ isAncestor,
2430
+ isKind,
2431
+ join,
2432
+ kinds,
2433
+ lca,
2434
+ make,
2435
+ make64,
2436
+ makeGroup,
2437
+ makeKind,
2438
+ makeMuid,
2439
+ name,
2440
+ newGenerator,
2441
+ on,
2442
+ onCall,
2443
+ onSet,
2444
+ operation,
2445
+ or64,
2446
+ qualifiedName,
2447
+ restart,
2448
+ set,
2449
+ shallowHistory,
2450
+ shl64,
2451
+ shr64,
2452
+ source,
2453
+ start,
2454
+ state,
2455
+ stop,
2456
+ sub64,
2457
+ takeSnapshot,
2458
+ target,
2459
+ transition,
2460
+ when
2461
+ };
2462
+ //# sourceMappingURL=index.js.map