@owlmeans/state 0.1.18-rc.2 → 0.1.18-rc.21

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 (45) hide show
  1. package/README.md +175 -48
  2. package/agent-meta/manifest.json +2 -2
  3. package/agent-meta/skills/state/SKILL.md +202 -19
  4. package/build/errors.d.ts +12 -5
  5. package/build/errors.d.ts.map +1 -1
  6. package/build/errors.js +16 -13
  7. package/build/errors.js.map +1 -1
  8. package/build/helper.d.ts +16 -0
  9. package/build/helper.d.ts.map +1 -0
  10. package/build/helper.js +14 -0
  11. package/build/helper.js.map +1 -0
  12. package/build/index.d.ts +2 -1
  13. package/build/index.d.ts.map +1 -1
  14. package/build/index.js +2 -1
  15. package/build/index.js.map +1 -1
  16. package/build/resource.d.ts +11 -4
  17. package/build/resource.d.ts.map +1 -1
  18. package/build/resource.js +332 -151
  19. package/build/resource.js.map +1 -1
  20. package/build/types.d.ts +98 -29
  21. package/build/types.d.ts.map +1 -1
  22. package/build/utils/model.d.ts +22 -2
  23. package/build/utils/model.d.ts.map +1 -1
  24. package/build/utils/model.js +26 -22
  25. package/build/utils/model.js.map +1 -1
  26. package/package.json +5 -4
  27. package/src/errors.ts +16 -13
  28. package/src/helper.ts +17 -0
  29. package/src/index.ts +2 -1
  30. package/src/resource.ts +407 -166
  31. package/src/types.ts +103 -30
  32. package/src/utils/model.ts +48 -28
  33. package/tests/resource.spec.ts +419 -0
  34. package/tsconfig.json +6 -1
  35. package/build/.gitkeep +0 -0
  36. package/build/consts.d.ts +0 -3
  37. package/build/consts.d.ts.map +0 -1
  38. package/build/consts.js +0 -3
  39. package/build/consts.js.map +0 -1
  40. package/build/utils/index.d.ts +0 -2
  41. package/build/utils/index.d.ts.map +0 -1
  42. package/build/utils/index.js +0 -2
  43. package/build/utils/index.js.map +0 -1
  44. package/src/consts.ts +0 -3
  45. package/src/utils/index.ts +0 -2
package/build/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export type * from './types.js';
2
- export * from './consts.js';
3
2
  export * from './errors.js';
3
+ export * from './helper.js';
4
4
  export * from './resource.js';
5
+ export * from './utils/model.js';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA"}
package/build/index.js CHANGED
@@ -1,4 +1,5 @@
1
- export * from './consts.js';
2
1
  export * from './errors.js';
2
+ export * from './helper.js';
3
3
  export * from './resource.js';
4
+ export * from './utils/model.js';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,kBAAkB,CAAA"}
@@ -1,6 +1,13 @@
1
+ import type { BasicConfig as Config, BasicContext as Context } from '@owlmeans/context';
1
2
  import type { ResourceRecord } from '@owlmeans/resource';
2
- import type { StateResource, StateResourceAppend } from './types.js';
3
- import type { BasicContext as Context, BasicConfig as Config } from '@owlmeans/context';
4
- export declare const createStateResource: <R extends ResourceRecord>(alias?: string) => StateResource<R>;
5
- export declare const appendStateResource: <C extends Config, T extends Context<C>>(ctx: T, alias?: string) => T & StateResourceAppend;
3
+ import type { StateConfig, StateResource, StateResourceAppend } from './types.js';
4
+ export declare const createStateResource: <T extends ResourceRecord>(alias?: string, cfg?: StateConfig<T>) => StateResource<T>;
5
+ /**
6
+ * Register a state resource on the context and expose `getStateResource`.
7
+ *
8
+ * Idempotent: appending the same alias twice keeps the resource that is already there, so a
9
+ * setup that runs more than once does not drop what the store has collected. The first alias
10
+ * appended is the one `getStateResource()` answers with when it is called without one.
11
+ */
12
+ export declare const appendStateResource: <C extends Config, T extends Context<C>, R extends ResourceRecord = ResourceRecord>(ctx: T, alias?: string, cfg?: StateConfig<R>) => T & StateResourceAppend;
6
13
  //# sourceMappingURL=resource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAgC,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,KAAK,EAAiB,aAAa,EAAE,mBAAmB,EAA2B,MAAM,YAAY,CAAA;AAI5G,OAAO,KAAK,EAAE,YAAY,IAAI,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEvF,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,cAAc,UAAS,MAAM,KAAmB,aAAa,CAAC,CAAC,CA6N5G,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,OACnE,CAAC,UAAS,MAAM,KACpB,CAAC,GAAG,mBAWN,CAAA"}
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,IAAI,MAAM,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAKvF,OAAO,KAAK,EAC2B,cAAc,EAEpD,MAAM,oBAAoB,CAAA;AAG3B,OAAO,KAAK,EACV,WAAW,EAA0B,aAAa,EAAE,mBAAmB,EACxE,MAAM,YAAY,CAAA;AAgCnB,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,cAAc,UACnD,MAAM,QAAgB,WAAW,CAAC,CAAC,CAAC,KAC1C,aAAa,CAAC,CAAC,CA8ZjB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,GAAG,cAAc,OAC5E,CAAC,UAAS,MAAM,QAAgB,WAAW,CAAC,CAAC,CAAC,KAAG,CAAC,GAAG,mBAa3D,CAAA"}
package/build/resource.js CHANGED
@@ -1,200 +1,381 @@
1
1
  import { appendContextual } from '@owlmeans/context';
2
- import { MisshapedRecord, RecordExists, UnknownRecordError, UnsupportedArgumentError } from '@owlmeans/resource';
3
- import { DEFAULT_ALIAS, DEFAULT_ID } from './consts';
4
- import { StateListenerError } from './errors.js';
2
+ import { applyQuery, filterRecords, firstMatch, RecordExists, sortRecords, UnknownRecordError, UnsupportedArgumentError } from '@owlmeans/resource';
3
+ import { StateConfigError } from './errors.js';
5
4
  import { createStateModel } from './utils/model.js';
6
- export const createStateResource = (alias = DEFAULT_ALIAS) => {
7
- const location = `state-resource:${alias}`;
8
- const store = {};
9
- const recordToListener = new Map();
10
- const listenerToRecord = new Map();
11
- const globalListeners = [];
12
- const systemToListeners = {};
13
- const _notifyGlobalListeners = (records) => {
14
- globalListeners.forEach(listener => listener(records.map(record => createStateModel(record, resource))));
5
+ /**
6
+ * The one slot of a `single` resource. It is a KEY and never a value: nothing writes it into a
7
+ * record, so a single resource's record still carries whatever id it arrived with, or none.
8
+ */
9
+ const SOLE = '';
10
+ /** The channel writes publish on, and the one a subscriber gets when it names none. */
11
+ const CHANGES = 'changes';
12
+ /** The alias a context's first state resource takes when nothing else is asked for. */
13
+ const STATE = 'state';
14
+ /** Milliseconds until a subscription expires: a number is seconds from now, a Date the instant. */
15
+ const expiresIn = (ttl) => ttl instanceof Date ? ttl.getTime() - Date.now() : ttl * 1000;
16
+ export const createStateResource = (alias = STATE, cfg) => {
17
+ const config = { ...cfg };
18
+ const idField = (config.id ?? 'id');
19
+ const single = config.single === true;
20
+ const store = new Map();
21
+ /** One registry per kind of subscriber: a key, a query, and the change stream. */
22
+ const watchers = new Map();
23
+ const queries = new Set();
24
+ const subscribers = new Set();
25
+ /**
26
+ * The model handed out for a key, kept until the record behind it is replaced. React compares
27
+ * snapshots by reference, so rebuilding a model on every unrelated write would re-render every
28
+ * screen bound to the store.
29
+ */
30
+ const models = new Map();
31
+ const records = () => [...store.values()];
32
+ /**
33
+ * The key a record is filed under.
34
+ *
35
+ * @throws {StateConfigError} `NoId` — nothing here mints ids, so a record without one is
36
+ * misfiled rather than new.
37
+ */
38
+ const keyOf = (record) => {
39
+ if (single) {
40
+ return SOLE;
41
+ }
42
+ const id = record[idField];
43
+ if (typeof id !== 'string' || id === '') {
44
+ throw new StateConfigError(StateConfigError.NoId);
45
+ }
46
+ return id;
47
+ };
48
+ /**
49
+ * The key an id addresses.
50
+ *
51
+ * @throws {StateConfigError} `NonSingle` — an absent id on a resource that holds many records.
52
+ */
53
+ const keyFor = (id) => {
54
+ if (id == null) {
55
+ if (!single) {
56
+ throw new StateConfigError(StateConfigError.NonSingle);
57
+ }
58
+ return SOLE;
59
+ }
60
+ return single ? SOLE : id;
15
61
  };
16
- const _usubscribe = (params) => () => {
17
- const ids = listenerToRecord.get(params.listener);
18
- listenerToRecord.delete(params.listener);
19
- ids?.forEach(id => {
20
- const listeners = recordToListener.get(id);
21
- if (listeners != null) {
22
- listeners.delete(params.listener);
23
- if (listeners.size === 0) {
24
- recordToListener.delete(id);
62
+ /** The key a record already in the store is filed under — its id is known to be there. */
63
+ const storedKey = (record) => single ? SOLE : record[idField];
64
+ /**
65
+ * A read by id. On a single resource the one record answers only to its own id, so asking for
66
+ * a different one is a miss rather than the sole record under a wrong name.
67
+ */
68
+ const read = (id) => {
69
+ const record = store.get(keyFor(id));
70
+ if (record == null) {
71
+ return null;
72
+ }
73
+ const own = record[idField];
74
+ if (single && own != null && own !== id) {
75
+ return null;
76
+ }
77
+ return record;
78
+ };
79
+ const first = (idOrWhere, opts) => typeof idOrWhere === 'string' ? read(idOrWhere) : firstMatch(records(), idOrWhere, opts);
80
+ /** The store keeps no expiring records, so a ttl would be silently dropped. */
81
+ const refuseTtl = (opts) => {
82
+ if (opts?.ttl != null) {
83
+ throw new UnsupportedArgumentError('ttl');
84
+ }
85
+ };
86
+ const modelFor = (key) => {
87
+ const record = store.get(key);
88
+ const cached = models.get(key);
89
+ if (cached != null && cached.from === record) {
90
+ return cached.model;
91
+ }
92
+ const id = record?.[idField] ?? (key === SOLE ? undefined : key);
93
+ const model = createStateModel({
94
+ id,
95
+ record,
96
+ default: config.default,
97
+ write: async (value) => {
98
+ const next = { ...value };
99
+ if (!single) {
100
+ next[idField] = key;
25
101
  }
102
+ return write(key, next);
103
+ },
104
+ drop: async () => {
105
+ const removed = store.get(key);
106
+ if (removed == null) {
107
+ return;
108
+ }
109
+ store.delete(key);
110
+ notify('remove', [[key, removed]]);
26
111
  }
27
112
  });
28
- Object.entries(systemToListeners).some(([key, listener]) => {
29
- if (listener === params.listener) {
30
- delete systemToListeners[key];
31
- return true;
113
+ models.set(key, { from: record, model });
114
+ return model;
115
+ };
116
+ /**
117
+ * The model for "nothing is addressed yet" — one instance, reused.
118
+ *
119
+ * It must be the SAME reference every time: a React subscriber compares snapshots by identity,
120
+ * and a freshly built model would read as a change on every render and loop. Writing through it
121
+ * is refused rather than silently dropped, because a caller that writes without an id has lost
122
+ * track of which record it meant.
123
+ */
124
+ let blank;
125
+ const emptyModel = () => blank ??= createStateModel({
126
+ id: undefined,
127
+ record: undefined,
128
+ default: config.default,
129
+ write: async () => { throw new StateConfigError(StateConfigError.NoId); },
130
+ drop: async () => { throw new StateConfigError(StateConfigError.NoId); }
131
+ });
132
+ const queryModels = (watch) => sortRecords(filterRecords(records(), watch.where), watch.opts?.sort)
133
+ .map(record => modelFor(storedKey(record)));
134
+ const same = (left, right) => left.length === right.length && left.every((model, index) => model === right[index]);
135
+ /** Deliver on one channel. Returns what the handlers gave back, for a caller that awaits. */
136
+ const deliver = (event, channel) => {
137
+ const delivered = [];
138
+ for (const subscription of [...subscribers]) {
139
+ if (subscription.channel !== channel) {
140
+ continue;
32
141
  }
33
- return false;
34
- });
142
+ if (subscription.once) {
143
+ subscribers.delete(subscription);
144
+ if (subscription.timer != null) {
145
+ clearTimeout(subscription.timer);
146
+ }
147
+ }
148
+ delivered.push(subscription.handler(event));
149
+ }
150
+ return delivered;
35
151
  };
36
- const _notifyListeners = (record) => {
37
- for (const listener of recordToListener.get(record.id) ?? []) {
38
- listener([createStateModel(record, resource)]);
152
+ /**
153
+ * Tell everyone what changed. Key watchers hear only about their own record; every live query
154
+ * is re-evaluated, because a write can move a record into a set it was not in and deciding
155
+ * whether it did is the same work as re-running the query.
156
+ */
157
+ const notify = (type, changed) => {
158
+ if (changed.length < 1) {
159
+ return;
160
+ }
161
+ for (const [key] of changed) {
162
+ const listeners = watchers.get(key);
163
+ if (listeners == null) {
164
+ continue;
165
+ }
166
+ const model = modelFor(key);
167
+ for (const listener of [...listeners]) {
168
+ listener(model);
169
+ }
39
170
  }
40
- for (const key of Object.keys(systemToListeners)) {
41
- const [, ...idsProto] = key.split(':');
42
- const ids = idsProto.join(':').split(',');
43
- if (ids.includes(record.id)) {
44
- systemToListeners[key](ids.map(id => createStateModel(store[id], resource)), key);
171
+ for (const watch of [...queries]) {
172
+ const current = queryModels(watch);
173
+ if (same(watch.last, current)) {
174
+ continue;
175
+ }
176
+ watch.last = current;
177
+ watch.listener(current);
178
+ }
179
+ deliver({ type, records: changed.map(([, record]) => record) }, CHANGES);
180
+ /**
181
+ * A key nobody watches and nothing is stored under has no model worth keeping — otherwise the
182
+ * cache grows with every record the store ever held. A watched key keeps its entry, so an
183
+ * empty model stays the same object and a screen bound to a deleted record does not re-render
184
+ * on every unrelated write.
185
+ */
186
+ for (const [key] of changed) {
187
+ if (!store.has(key) && !watchers.has(key)) {
188
+ models.delete(key);
45
189
  }
46
190
  }
47
191
  };
192
+ const write = (key, record) => {
193
+ const value = { ...record };
194
+ store.set(key, value);
195
+ notify('set', [[key, value]]);
196
+ return value;
197
+ };
48
198
  const resource = appendContextual(alias, {
49
- get: async (id, field, opts) => {
50
- const record = await resource.load(id, field, opts);
199
+ config,
200
+ get: async (idOrWhere, opts) => {
201
+ const record = first(idOrWhere, opts);
51
202
  if (record == null) {
52
- throw new UnknownRecordError(id);
203
+ throw new UnknownRecordError(typeof idOrWhere === 'string' ? idOrWhere : 'criteria');
53
204
  }
54
205
  return record;
55
206
  },
56
- load: async (id, field, opts) => {
57
- if (field != null) {
58
- throw new UnsupportedArgumentError(`${location}:get:filed`);
207
+ load: async (idOrWhere, opts) => first(idOrWhere, opts),
208
+ /** Unpaged unless a size is asked for: a screen reading the store expects all of it. */
209
+ list: async (where, opts) => {
210
+ if (opts?.page != null && opts.size == null) {
211
+ throw new UnsupportedArgumentError('page-without-size');
59
212
  }
60
- if (opts != null) {
61
- throw new UnsupportedArgumentError(`${location}:get:opts`);
62
- }
63
- const record = store[id];
64
- if (record == null) {
65
- return null;
66
- }
67
- return record;
68
- },
69
- list: async (criteria, opts) => {
70
- if (criteria != null) {
71
- throw new UnsupportedArgumentError(`${location}:list:criteria`);
72
- }
73
- if (opts != null) {
74
- throw new UnsupportedArgumentError(`${location}:list:opts`);
75
- }
76
- const result = {
77
- items: Object.entries(store).map(([, record]) => record)
78
- };
79
- return result;
80
- },
81
- save: async (record, opts) => {
82
- const id = record.id ?? DEFAULT_ID;
83
- if (store[id] != null) {
84
- return resource.update(record, opts);
85
- }
86
- return resource.create(record, opts);
213
+ return applyQuery(records(), where, opts);
87
214
  },
215
+ count: async (where) => filterRecords(records(), where).length,
88
216
  create: async (record, opts) => {
89
- if (!("id" in record) || record.id == null) {
90
- record.id = DEFAULT_ID;
217
+ refuseTtl(opts);
218
+ const key = keyOf(record);
219
+ if (store.has(key)) {
220
+ throw new RecordExists(key === SOLE ? alias : key);
91
221
  }
92
- if (store[record.id] != null) {
93
- throw new RecordExists(record.id);
94
- }
95
- if (opts != null) {
96
- throw new UnsupportedArgumentError(`${location}:create:opts`);
97
- }
98
- store[record.id] = record;
99
- _notifyListeners(store[record.id]);
100
- _notifyGlobalListeners([store[record.id]]);
101
- return record;
222
+ return write(key, record);
102
223
  },
224
+ /** Replaces the stored record rather than merging into it, as the contract says. */
103
225
  update: async (record, opts) => {
104
- if (opts != null) {
105
- throw new UnsupportedArgumentError(`${location}:update:opts`);
106
- }
107
- if (!("id" in record) || record.id == null) {
108
- record.id = DEFAULT_ID;
226
+ refuseTtl(opts);
227
+ const key = keyOf(record);
228
+ if (!store.has(key)) {
229
+ throw new UnknownRecordError(key === SOLE ? alias : key);
109
230
  }
110
- const reference = store[record.id];
111
- if (reference == null) {
112
- throw new UnknownRecordError(record.id);
113
- }
114
- Object.assign(reference, record);
115
- _notifyListeners(reference);
116
- _notifyGlobalListeners([reference]);
117
- return reference;
231
+ return write(key, record);
118
232
  },
119
- delete: async (id, opts) => {
120
- const _id = typeof id === 'string' ? id : id.id;
121
- if (_id == null) {
122
- throw new UnsupportedArgumentError('id');
123
- }
124
- const record = store[_id];
233
+ save: async (record, opts) => {
234
+ refuseTtl(opts);
235
+ return write(keyOf(record), record);
236
+ },
237
+ delete: async (id) => {
238
+ const record = read(id);
125
239
  if (record == null) {
126
240
  return null;
127
241
  }
128
- if (opts != null) {
129
- throw new UnsupportedArgumentError(`${location}:delete:opts`);
130
- }
131
- delete store[_id];
132
- _notifyListeners(record);
133
- _notifyGlobalListeners([record]);
242
+ const key = keyFor(id);
243
+ store.delete(key);
244
+ notify('remove', [[key, record]]);
134
245
  return record;
135
246
  },
136
- pick: async (id, opts) => {
137
- const _id = typeof id === 'string' ? id : id.id;
138
- if (_id == null) {
139
- throw new MisshapedRecord('id');
140
- }
141
- const record = await resource.delete(_id, opts);
247
+ take: async (id) => {
248
+ const record = await resource.delete(id);
142
249
  if (record == null) {
143
- throw new UnknownRecordError(_id);
250
+ throw new UnknownRecordError(id);
144
251
  }
145
252
  return record;
146
253
  },
147
- subscribe: params => {
148
- const id = params.id ?? DEFAULT_ID;
149
- const ids = Array.isArray(id) ? id : [id];
150
- const records = ids.map(id => {
151
- if (store[id] == null) {
152
- store[id] = { ...params.default, id };
153
- }
154
- return createStateModel(store[id], resource);
155
- });
156
- if (params._systemId != null) {
157
- const key = `${params._systemId}:${ids.join(",")}`;
158
- if (systemToListeners[key] != null) {
159
- return [_usubscribe(params), records];
160
- }
161
- systemToListeners[key] = params.listener;
254
+ purge: async (where) => {
255
+ if (where == null || Object.keys(where).length < 1) {
256
+ throw new UnsupportedArgumentError('purge:empty-criteria');
162
257
  }
163
- else {
164
- if (listenerToRecord.has(params.listener)) {
165
- throw new StateListenerError('subscribed');
166
- }
167
- listenerToRecord.set(params.listener, ids);
168
- ids.forEach(id => {
169
- if (!recordToListener.has(id)) {
170
- recordToListener.set(id, new Set());
171
- }
172
- recordToListener.get(id)?.add(params.listener);
173
- });
174
- }
175
- return [_usubscribe(params), records];
258
+ const removed = filterRecords(records(), where)
259
+ .map((record) => [storedKey(record), record]);
260
+ for (const [key] of removed) {
261
+ store.delete(key);
262
+ }
263
+ notify('remove', removed);
264
+ return removed.length;
265
+ },
266
+ /**
267
+ * The store is rewritten before anything is told about it, so a subscriber never sees the
268
+ * half-applied set. On a `single` resource every record lands in the one slot, which means a
269
+ * list of several collapses to the last of them.
270
+ */
271
+ replace: async (list) => {
272
+ const written = list.map((record) => [keyOf(record), { ...record }]);
273
+ const keys = new Set(written.map(([key]) => key));
274
+ const dropped = [...store.entries()].filter(([key]) => !keys.has(key));
275
+ for (const [key] of dropped) {
276
+ store.delete(key);
277
+ }
278
+ for (const [key, record] of written) {
279
+ store.set(key, record);
280
+ }
281
+ notify('remove', dropped);
282
+ notify('set', written);
176
283
  },
177
- listen: listener => {
178
- globalListeners.push(listener);
284
+ clear: async () => {
285
+ const dropped = [...store.entries()];
286
+ store.clear();
287
+ notify('remove', dropped);
288
+ },
289
+ watch: (id, listener) => {
290
+ /**
291
+ * Watching before there is anything to watch is a RENDERING state, not a mistake.
292
+ *
293
+ * A screen binds to `useStoreModel(project.record.id)` while the project is still loading,
294
+ * so the id is legitimately absent for the first renders. Treating that as the
295
+ * configuration error it would be on `load()` or `save()` crashes the component tree over
296
+ * data that is simply not here yet. So an absent id on a listed resource watches nothing
297
+ * and reports an empty model; the error stays where it means something — a direct read or
298
+ * write with no id, which cannot be anything but a mistake.
299
+ */
300
+ if (id == null && !single) {
301
+ listener(emptyModel());
302
+ return () => { };
303
+ }
304
+ const key = keyFor(id);
305
+ let listeners = watchers.get(key);
306
+ if (listeners == null) {
307
+ listeners = new Set();
308
+ watchers.set(key, listeners);
309
+ }
310
+ const bound = listeners;
311
+ bound.add(listener);
312
+ /**
313
+ * Seeded before `watch` returns, and seeded with nothing when the store holds nothing: an
314
+ * id subscription creates NO record, so a screen bound to an unknown id gets an empty
315
+ * model rather than putting a blank row into every list reading the same store.
316
+ */
317
+ listener(modelFor(key));
318
+ /**
319
+ * The cached model outlives the subscription on purpose. A React subscriber takes its first
320
+ * snapshot by watching and stopping again, and a rebuilt model would read as a changed value
321
+ * the moment it subscribes for real. Keys the store no longer holds are dropped on the next
322
+ * change to them instead.
323
+ */
179
324
  return () => {
180
- const index = globalListeners.indexOf(listener);
181
- if (index >= 0) {
182
- globalListeners.splice(index, 1);
325
+ bound.delete(listener);
326
+ if (bound.size < 1) {
327
+ watchers.delete(key);
183
328
  }
184
329
  };
185
330
  },
186
- erase: async () => {
187
- await Promise.all(Object.keys(store).map(key => resource.delete(key)));
331
+ query: (where, listener, opts) => {
332
+ const watch = { where, opts, listener, last: [] };
333
+ queries.add(watch);
334
+ watch.last = queryModels(watch);
335
+ listener(watch.last);
336
+ return () => { queries.delete(watch); };
337
+ },
338
+ /**
339
+ * Writes announce themselves on the default channel, so publishing is for what the store
340
+ * cannot know it did — a change that arrived from elsewhere, or a channel of a caller's own.
341
+ */
342
+ publish: async (value, channel) => {
343
+ await Promise.all(deliver(value, channel ?? CHANGES));
344
+ },
345
+ subscribe: async (handler, opts) => {
346
+ const subscription = {
347
+ handler, channel: opts?.channel ?? CHANGES, once: opts?.once === true
348
+ };
349
+ subscribers.add(subscription);
350
+ const stop = async () => {
351
+ subscribers.delete(subscription);
352
+ if (subscription.timer != null) {
353
+ clearTimeout(subscription.timer);
354
+ subscription.timer = undefined;
355
+ }
356
+ };
357
+ if (opts?.ttl != null) {
358
+ subscription.timer = setTimeout(() => void stop(), expiresIn(opts.ttl));
359
+ }
360
+ return stop;
188
361
  }
189
362
  });
190
363
  return resource;
191
364
  };
192
- export const appendStateResource = (ctx, alias = DEFAULT_ALIAS) => {
193
- const resource = createStateResource(alias);
365
+ /**
366
+ * Register a state resource on the context and expose `getStateResource`.
367
+ *
368
+ * Idempotent: appending the same alias twice keeps the resource that is already there, so a
369
+ * setup that runs more than once does not drop what the store has collected. The first alias
370
+ * appended is the one `getStateResource()` answers with when it is called without one.
371
+ */
372
+ export const appendStateResource = (ctx, alias = STATE, cfg) => {
194
373
  const _ctx = ctx;
195
- _ctx.registerResource(resource);
374
+ if (!_ctx.hasResource(alias)) {
375
+ _ctx.registerResource(createStateResource(alias, cfg));
376
+ }
196
377
  if (_ctx.getStateResource == null) {
197
- _ctx.getStateResource = alias => ctx.resource(alias ?? resource.alias);
378
+ _ctx.getStateResource = ((_alias) => ctx.resource(_alias ?? alias));
198
379
  }
199
380
  return _ctx;
200
381
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}