@turingfocus/chat-runtime 0.6.0 → 0.8.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.
@@ -1,9 +1,11 @@
1
1
  /** Owns immutable snapshot publication and shields listeners from reentrant writes. */
2
2
  export class SnapshotStore {
3
3
  #listeners = new Set();
4
+ #stateListeners = new Set();
4
5
  #onListenerError;
5
6
  #pendingCommits = [];
6
7
  #closed = false;
8
+ #listenerSequence = 0;
7
9
  #notifying = false;
8
10
  #state = null;
9
11
  constructor(options = {}) {
@@ -18,8 +20,10 @@ export class SnapshotStore {
18
20
  subscribe(listener) {
19
21
  const registration = {
20
22
  active: true,
23
+ kind: "snapshot",
21
24
  lastSnapshot: null,
22
25
  listener,
26
+ sequence: ++this.#listenerSequence,
23
27
  };
24
28
  if (!this.#closed) {
25
29
  this.#listeners.add(registration);
@@ -42,8 +46,39 @@ export class SnapshotStore {
42
46
  },
43
47
  });
44
48
  }
49
+ subscribeState(listener) {
50
+ const registration = {
51
+ active: true,
52
+ kind: "state",
53
+ lastSnapshot: null,
54
+ listener,
55
+ sequence: ++this.#listenerSequence,
56
+ };
57
+ if (!this.#closed) {
58
+ this.#stateListeners.add(registration);
59
+ if (this.#state !== null) {
60
+ this.#callStateListener(registration, this.#state.snapshot);
61
+ }
62
+ }
63
+ else {
64
+ registration.active = false;
65
+ }
66
+ return Object.freeze({
67
+ get closed() {
68
+ return !registration.active;
69
+ },
70
+ dispose: () => {
71
+ if (!registration.active)
72
+ return;
73
+ registration.active = false;
74
+ this.#stateListeners.delete(registration);
75
+ },
76
+ });
77
+ }
45
78
  latestState() {
46
- return this.#pendingCommits.at(-1) ?? this.#state;
79
+ return this.#pendingCommits.length === 0
80
+ ? this.#state
81
+ : this.#pendingCommits.at(-1);
47
82
  }
48
83
  commit(next) {
49
84
  const latest = this.latestState();
@@ -55,11 +90,29 @@ export class SnapshotStore {
55
90
  this.#notifying = true;
56
91
  try {
57
92
  while (!this.#closed && this.#pendingCommits.length > 0) {
58
- const state = this.#pendingCommits.shift();
93
+ const state = this.#pendingCommits.shift() ?? null;
59
94
  this.#state = state;
60
- for (const registration of [...this.#listeners]) {
61
- this.#callListener(registration, state.snapshot);
62
- }
95
+ this.#publish(state);
96
+ }
97
+ }
98
+ finally {
99
+ this.#notifying = false;
100
+ if (this.#closed)
101
+ this.#pendingCommits.length = 0;
102
+ }
103
+ }
104
+ clear() {
105
+ if (this.#closed || this.latestState() === null)
106
+ return;
107
+ this.#pendingCommits.push(null);
108
+ if (this.#notifying)
109
+ return;
110
+ this.#notifying = true;
111
+ try {
112
+ while (!this.#closed && this.#pendingCommits.length > 0) {
113
+ const state = this.#pendingCommits.shift() ?? null;
114
+ this.#state = state;
115
+ this.#publish(state);
63
116
  }
64
117
  }
65
118
  finally {
@@ -76,8 +129,25 @@ export class SnapshotStore {
76
129
  for (const registration of this.#listeners)
77
130
  registration.active = false;
78
131
  this.#listeners.clear();
132
+ for (const registration of this.#stateListeners) {
133
+ registration.active = false;
134
+ }
135
+ this.#stateListeners.clear();
79
136
  this.#state = null;
80
137
  }
138
+ #publish(state) {
139
+ const registrations = [...this.#listeners, ...this.#stateListeners].sort((left, right) => left.sequence - right.sequence);
140
+ for (const registration of registrations) {
141
+ if (registration.kind === "snapshot") {
142
+ if (state === null)
143
+ continue;
144
+ this.#callListener(registration, state.snapshot);
145
+ }
146
+ else {
147
+ this.#callStateListener(registration, state?.snapshot ?? null);
148
+ }
149
+ }
150
+ }
81
151
  #callListener(registration, snapshot) {
82
152
  if (!registration.active || registration.lastSnapshot === snapshot)
83
153
  return;
@@ -95,5 +165,21 @@ export class SnapshotStore {
95
165
  }
96
166
  }
97
167
  }
168
+ #callStateListener(registration, snapshot) {
169
+ if (!registration.active || registration.lastSnapshot === snapshot)
170
+ return;
171
+ registration.lastSnapshot = snapshot;
172
+ try {
173
+ registration.listener(snapshot);
174
+ }
175
+ catch (error) {
176
+ try {
177
+ this.#onListenerError?.(error);
178
+ }
179
+ catch {
180
+ // A diagnostic hook must not break publication to healthy listeners.
181
+ }
182
+ }
183
+ }
98
184
  }
99
185
  //# sourceMappingURL=snapshot-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snapshot-store.js","sourceRoot":"","sources":["../src/snapshot-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turingfocus/chat-runtime",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Headless, instance-scoped chat runtime",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -28,7 +28,7 @@
28
28
  }
29
29
  },
30
30
  "dependencies": {
31
- "@turingfocus/chat-protocol": "^0.6.0"
31
+ "@turingfocus/chat-protocol": "^0.8.0"
32
32
  },
33
33
  "publishConfig": {
34
34
  "access": "public",