Skip to content

Commit f65eebe

Browse files
committed
Make abort controller / signal opt-in
Only gets created if you access .signal
1 parent 6a807be commit f65eebe

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "yieldmachine",
33
"amdName": "yieldmachine",
4-
"version": "0.4.3",
4+
"version": "0.4.4",
55
"description": "Declarative state machines using generator functions",
66
"source": "src/index.ts",
77
"main": "dist/yieldmachine.js",

src/index.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -445,49 +445,58 @@ class InternalInstance {
445445
export function start(
446446
machine: (() => StateDefinition) | (() => Generator<Yielded, StateDefinition, never>)
447447
): MachineInstance {
448-
let changeCount = -1;
449-
const aborter = new AbortController();
450-
const signal = aborter.signal;
448+
let _changeCount = -1;
449+
let _aborter: null | AbortController = null;
450+
function ensureAborter(): AbortController {
451+
if (_aborter !== null) return _aborter;
451452

452-
signal.addEventListener('abort', () => {
453-
instance.cleanup();
454-
}, { once: true });
453+
const newAborter = new AbortController();
454+
const signal = newAborter.signal;
455+
456+
signal.addEventListener('abort', () => {
457+
instance.cleanup();
458+
}, { once: true });
459+
460+
_aborter = newAborter;
461+
462+
return newAborter;
463+
}
455464

456465
const rootName = machine.name;
457466
const instance: InternalInstance = new InternalInstance(
458467
null,
459468
machine,
460469
{
461-
get changeCount() { return changeCount },
470+
get changeCount() { return _changeCount },
462471
willChangeState() {
463-
changeCount += 1;
472+
_changeCount += 1;
464473
},
465474
didChangeState() {
466-
signal.dispatchEvent(new Event('StateChanged'));
475+
_aborter?.signal.dispatchEvent(new Event('StateChanged'));
467476
},
468477
didChangeAccumulations() {
469-
signal.dispatchEvent(new Event('AccumulationsChanged'));
478+
_aborter?.signal.dispatchEvent(new Event('AccumulationsChanged'));
470479
},
471480
sendEvent(event, snapshotCount) {
472-
if (typeof snapshotCount === "number" && snapshotCount !== changeCount) {
481+
if (typeof snapshotCount === "number" && snapshotCount !== _changeCount) {
473482
return;
474483
}
475484
instance.receive(event);
476485
}
477486
}
478487
);
479488

480-
changeCount = 0;
489+
_changeCount = 0;
481490

482491
return {
483492
get changeCount() {
484-
return changeCount;
493+
return _changeCount;
485494
},
486495
get current() {
487496
return instance.current !== null ? instance.current[rootName] : null;
488497
},
489498
get signal() {
490-
return signal;
499+
return ensureAborter().signal;
491500
},
492501
get results() {
493502
return instance.results;
@@ -506,7 +515,7 @@ export function start(
506515
};
507516
},
508517
abort() {
509-
aborter.abort();
518+
ensureAborter().abort();
510519
},
511520
get done() {
512521
return instance.child !== null;

0 commit comments

Comments
 (0)