@fnndsc/cumin 3.25.0 → 3.27.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.
@@ -0,0 +1,94 @@
1
+ import { Result } from "../utils/result.js";
2
+ /** One tag as a feed wears it. */
3
+ export interface FeedTag {
4
+ id: number;
5
+ name: string;
6
+ color: string;
7
+ }
8
+ /** One of the user's tags, and the feeds that wear it. */
9
+ export interface TagEntry {
10
+ id: number;
11
+ name: string;
12
+ color: string;
13
+ /** The feeds wearing it, by id. */
14
+ feeds: number[];
15
+ }
16
+ /** How long the tags index serves before it is read again, ms. */
17
+ export declare const TAGS_MAP_TTL_MS: number;
18
+ /** Forgets the tags index: a tag changed here, or a test starts clean. */
19
+ export declare function feedTagsMap_forget(): void;
20
+ /**
21
+ * The message a name the vocabulary does not hold earns, naming the cure.
22
+ *
23
+ * @param name - The tag asked for.
24
+ * @returns The refusal's words.
25
+ */
26
+ export declare function tagMissing_message(name: string): string;
27
+ /** The colour a tag is made in when the kernel makes it: CUBE requires one. */
28
+ export declare const TAG_COLOR_DEFAULT: string;
29
+ /**
30
+ * Lists the tags a feed wears.
31
+ *
32
+ * @param feedId - The feed.
33
+ * @returns Its tags, by name.
34
+ */
35
+ export declare function feedTags_list(feedId: number): Promise<Result<FeedTag[]>>;
36
+ /**
37
+ * Hangs a tag on a feed by name: the user's tag of that name, which must
38
+ * exist (it is made with `mkdir /proc/tags/<name>`).
39
+ *
40
+ * @param feedId - The feed.
41
+ * @param name - The tag's name.
42
+ * @returns True when it was added, false when the feed already wore it.
43
+ */
44
+ export declare function feedTag_add(feedId: number, name: string): Promise<Result<boolean>>;
45
+ /**
46
+ * Takes a tag off a feed by name: the tagging goes, the tag stays (it may
47
+ * hang on other feeds).
48
+ *
49
+ * @param feedId - The feed.
50
+ * @param name - The tag's name.
51
+ * @returns True when it was removed, false when the feed did not wear it.
52
+ */
53
+ export declare function feedTag_remove(feedId: number, name: string): Promise<Result<boolean>>;
54
+ /**
55
+ * Every feed's tags at once, for a listing that shows them (see
56
+ * {@link tagsIndex_read} for what it costs and how long it is kept).
57
+ *
58
+ * @param now - The clock (a test hands in its own).
59
+ * @returns Feed id to its tag names.
60
+ */
61
+ export declare function feedTags_byFeed(now?: number): Promise<Result<Map<number, string[]>>>;
62
+ /**
63
+ * The user's tags, each with the feeds that wear it: the vocabulary
64
+ * `/proc/tags` lists, and the feeds each of its folders holds.
65
+ *
66
+ * @param now - The clock (a test hands in its own).
67
+ * @returns Tag name to its entry.
68
+ */
69
+ export declare function tags_index(now?: number): Promise<Result<Map<string, TagEntry>>>;
70
+ /**
71
+ * Makes a tag in the user's vocabulary (`mkdir /proc/tags/<name>`).
72
+ *
73
+ * @param name - The new tag's name.
74
+ * @returns True when made; Err with "File exists" when the user has it already.
75
+ */
76
+ export declare function tag_create(name: string): Promise<Result<boolean>>;
77
+ /**
78
+ * Deletes a tag from the user's vocabulary (`rmdir /proc/tags/<name>`); a
79
+ * tag that still hangs on a feed is refused, as a folder that holds
80
+ * something is.
81
+ *
82
+ * @param name - The tag's name.
83
+ * @returns True when deleted; Err with "Directory not empty" while feeds wear it.
84
+ */
85
+ export declare function tag_delete(name: string): Promise<Result<boolean>>;
86
+ /**
87
+ * Renames one of the user's tags (`mv /proc/tags/<from> /proc/tags/<to>`):
88
+ * every feed wearing it wears the new name.
89
+ *
90
+ * @param from - The tag's name now.
91
+ * @param to - Its new name.
92
+ * @returns True when renamed; Err with "File exists" when the user has a tag of the new name.
93
+ */
94
+ export declare function tag_rename(from: string, to: string): Promise<Result<boolean>>;
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TAG_COLOR_DEFAULT = exports.TAGS_MAP_TTL_MS = void 0;
4
+ exports.feedTagsMap_forget = feedTagsMap_forget;
5
+ exports.tagMissing_message = tagMissing_message;
6
+ exports.feedTags_list = feedTags_list;
7
+ exports.feedTag_add = feedTag_add;
8
+ exports.feedTag_remove = feedTag_remove;
9
+ exports.feedTags_byFeed = feedTags_byFeed;
10
+ exports.tags_index = tags_index;
11
+ exports.tag_create = tag_create;
12
+ exports.tag_delete = tag_delete;
13
+ exports.tag_rename = tag_rename;
14
+ /**
15
+ * @file A feed's tags: CUBE's freeform labels, which a user owns and hangs
16
+ * on feeds through taggings. The kernel speaks them as extended attributes
17
+ * (`getfattr`, `setfattr`); this is the adapter beneath.
18
+ *
19
+ * A tag is the user's own object (a name and a colour); a tagging joins one
20
+ * tag to one feed. The user's tags are a vocabulary of their own, made,
21
+ * renamed and deleted as folders under `/proc/tags`: hanging a tag on a feed
22
+ * names one that exists and never makes one; removing it from a feed deletes
23
+ * the tagging and leaves the tag, which may hang on other feeds.
24
+ *
25
+ * @module
26
+ */
27
+ const adapter_js_1 = require("../chrisapi/adapter.js");
28
+ const chrisConnection_js_1 = require("../connect/chrisConnection.js");
29
+ const contract_js_1 = require("../chrisapi/contract.js");
30
+ const errorStack_js_1 = require("../error/errorStack.js");
31
+ const result_js_1 = require("../utils/result.js");
32
+ /** How long the tags index serves before it is read again, ms. */
33
+ exports.TAGS_MAP_TTL_MS = 60000;
34
+ /** The tags index, and when it was read; null until first asked. */
35
+ let tagsMap = null;
36
+ /** Forgets the tags index: a tag changed here, or a test starts clean. */
37
+ function feedTagsMap_forget() {
38
+ tagsMap = null;
39
+ }
40
+ /**
41
+ * The message a name the vocabulary does not hold earns, naming the cure.
42
+ *
43
+ * @param name - The tag asked for.
44
+ * @returns The refusal's words.
45
+ */
46
+ function tagMissing_message(name) {
47
+ return `${name}: No such tag (mkdir /proc/tags/${name})`;
48
+ }
49
+ /** The colour a tag is made in when the kernel makes it: CUBE requires one. */
50
+ exports.TAG_COLOR_DEFAULT = '#888888';
51
+ /**
52
+ * The connected client and the feed, or the reason there are none.
53
+ *
54
+ * @param feedId - The feed.
55
+ * @param doing - What was being done, for the error.
56
+ * @returns The client and feed, or null with the error stacked.
57
+ */
58
+ async function feed_reach(feedId, doing) {
59
+ const client = await chrisConnection_js_1.chrisConnection.client_get();
60
+ if (!client) {
61
+ errorStack_js_1.errorStack.stack_push('error', 'Not connected to ChRIS.');
62
+ return null;
63
+ }
64
+ const feed = await client.getFeed(feedId);
65
+ if (!feed) {
66
+ errorStack_js_1.errorStack.stack_push('error', `${doing}: feed ${feedId} not found.`);
67
+ return null;
68
+ }
69
+ return { client, feed };
70
+ }
71
+ /**
72
+ * Every tag a feed wears.
73
+ *
74
+ * @param feed - The feed.
75
+ * @returns Its tags.
76
+ */
77
+ async function tags_drain(feed) {
78
+ return (0, contract_js_1.listPages_drain)(async (offset, limit) => {
79
+ const list = await feed.getTags({ limit, offset });
80
+ return (0, contract_js_1.collectionPage_wrap)(list, (0, adapter_js_1.listData_get)(list));
81
+ });
82
+ }
83
+ /**
84
+ * Lists the tags a feed wears.
85
+ *
86
+ * @param feedId - The feed.
87
+ * @returns Its tags, by name.
88
+ */
89
+ async function feedTags_list(feedId) {
90
+ try {
91
+ const reached = await feed_reach(feedId, 'tags');
92
+ if (reached === null)
93
+ return (0, result_js_1.Err)();
94
+ return (0, result_js_1.Ok)(await tags_drain(reached.feed));
95
+ }
96
+ catch (error) {
97
+ errorStack_js_1.errorStack.stack_push('error', `Failed to list tags of feed ${feedId}: ${error instanceof Error ? error.message : String(error)}`);
98
+ return (0, result_js_1.Err)();
99
+ }
100
+ }
101
+ /**
102
+ * Hangs a tag on a feed by name: the user's tag of that name, which must
103
+ * exist (it is made with `mkdir /proc/tags/<name>`).
104
+ *
105
+ * @param feedId - The feed.
106
+ * @param name - The tag's name.
107
+ * @returns True when it was added, false when the feed already wore it.
108
+ */
109
+ async function feedTag_add(feedId, name) {
110
+ try {
111
+ const reached = await feed_reach(feedId, 'tag');
112
+ if (reached === null)
113
+ return (0, result_js_1.Err)();
114
+ const worn = await tags_drain(reached.feed);
115
+ if (worn.some((tag) => tag.name === name))
116
+ return (0, result_js_1.Ok)(false);
117
+ // CUBE lists a user their own tags: a name found here is theirs.
118
+ const owned = await reached.client.getTags({ name });
119
+ const found = (0, adapter_js_1.listData_get)(owned).find((tag) => tag.name === name);
120
+ if (found === undefined) {
121
+ errorStack_js_1.errorStack.stack_push('error', tagMissing_message(name));
122
+ return (0, result_js_1.Err)();
123
+ }
124
+ await reached.feed.addTagging(found.id);
125
+ feedTagsMap_forget();
126
+ return (0, result_js_1.Ok)(true);
127
+ }
128
+ catch (error) {
129
+ errorStack_js_1.errorStack.stack_push('error', `Failed to tag feed ${feedId} with ${name}: ${error instanceof Error ? error.message : String(error)}`);
130
+ return (0, result_js_1.Err)();
131
+ }
132
+ }
133
+ /**
134
+ * Takes a tag off a feed by name: the tagging goes, the tag stays (it may
135
+ * hang on other feeds).
136
+ *
137
+ * @param feedId - The feed.
138
+ * @param name - The tag's name.
139
+ * @returns True when it was removed, false when the feed did not wear it.
140
+ */
141
+ async function feedTag_remove(feedId, name) {
142
+ try {
143
+ const reached = await feed_reach(feedId, 'untag');
144
+ if (reached === null)
145
+ return (0, result_js_1.Err)();
146
+ const tag = (await tags_drain(reached.feed)).find((one) => one.name === name);
147
+ if (tag === undefined)
148
+ return (0, result_js_1.Ok)(false);
149
+ const taggings = await reached.feed.getTaggings({ limit: 100, offset: 0 });
150
+ const tagging = (taggings.getItems() ?? [])
151
+ .find((one) => (0, adapter_js_1.itemData_get)(one)?.tag_id === tag.id);
152
+ if (tagging === undefined)
153
+ return (0, result_js_1.Ok)(false);
154
+ await tagging.delete();
155
+ feedTagsMap_forget();
156
+ return (0, result_js_1.Ok)(true);
157
+ }
158
+ catch (error) {
159
+ errorStack_js_1.errorStack.stack_push('error', `Failed to untag feed ${feedId} of ${name}: ${error instanceof Error ? error.message : String(error)}`);
160
+ return (0, result_js_1.Err)();
161
+ }
162
+ }
163
+ /**
164
+ * The user's tags and each tag's feeds, read once and kept: the user's tags
165
+ * (one read) and each tag's feeds (one read per tag) — a listing of a
166
+ * thousand feeds costs as many reads as the user has tags, never one per
167
+ * feed. Kept for {@link TAGS_MAP_TTL_MS}, and forgotten whenever a tag or a
168
+ * tagging changes here.
169
+ *
170
+ * @param now - The clock (a test hands in its own).
171
+ * @returns The index, or Err with the reason stacked.
172
+ */
173
+ async function tagsIndex_read(now) {
174
+ if (tagsMap !== null && now - tagsMap.at < exports.TAGS_MAP_TTL_MS)
175
+ return (0, result_js_1.Ok)(tagsMap);
176
+ const client = await chrisConnection_js_1.chrisConnection.client_get();
177
+ if (!client) {
178
+ errorStack_js_1.errorStack.stack_push('error', 'Not connected to ChRIS.');
179
+ return (0, result_js_1.Err)();
180
+ }
181
+ try {
182
+ const byFeed = new Map();
183
+ const tags = new Map();
184
+ const resources = new Map();
185
+ const found = [];
186
+ for (let offset = 0;; offset += 100) {
187
+ const page = await client.getTags({ limit: 100, offset });
188
+ found.push(...(page.getItems() ?? []));
189
+ if (!page.hasNextPage)
190
+ break;
191
+ }
192
+ for (const tag of found) {
193
+ const data = (0, adapter_js_1.itemData_get)(tag);
194
+ const name = data?.name ?? '';
195
+ if (name === '' || data === null)
196
+ continue;
197
+ const feeds = await (0, contract_js_1.listPages_drain)(async (offset, limit) => {
198
+ const list = await tag.getTaggedFeeds({ limit, offset });
199
+ return (0, contract_js_1.collectionPage_wrap)(list, (0, adapter_js_1.listData_get)(list));
200
+ });
201
+ tags.set(name, { id: data.id, name, color: data.color, feeds: feeds.map((feed) => feed.id) });
202
+ resources.set(name, tag);
203
+ for (const feed of feeds)
204
+ byFeed.set(feed.id, [...(byFeed.get(feed.id) ?? []), name]);
205
+ }
206
+ tagsMap = { at: now, tags, resources, byFeed };
207
+ return (0, result_js_1.Ok)(tagsMap);
208
+ }
209
+ catch (error) {
210
+ errorStack_js_1.errorStack.stack_push('error', `Failed to read the tags: ${error instanceof Error ? error.message : String(error)}`);
211
+ return (0, result_js_1.Err)();
212
+ }
213
+ }
214
+ /**
215
+ * Every feed's tags at once, for a listing that shows them (see
216
+ * {@link tagsIndex_read} for what it costs and how long it is kept).
217
+ *
218
+ * @param now - The clock (a test hands in its own).
219
+ * @returns Feed id to its tag names.
220
+ */
221
+ async function feedTags_byFeed(now = Date.now()) {
222
+ const index = await tagsIndex_read(now);
223
+ return index.ok ? (0, result_js_1.Ok)(index.value.byFeed) : (0, result_js_1.Err)();
224
+ }
225
+ /**
226
+ * The user's tags, each with the feeds that wear it: the vocabulary
227
+ * `/proc/tags` lists, and the feeds each of its folders holds.
228
+ *
229
+ * @param now - The clock (a test hands in its own).
230
+ * @returns Tag name to its entry.
231
+ */
232
+ async function tags_index(now = Date.now()) {
233
+ const index = await tagsIndex_read(now);
234
+ return index.ok ? (0, result_js_1.Ok)(index.value.tags) : (0, result_js_1.Err)();
235
+ }
236
+ /**
237
+ * Makes a tag in the user's vocabulary (`mkdir /proc/tags/<name>`).
238
+ *
239
+ * @param name - The new tag's name.
240
+ * @returns True when made; Err with "File exists" when the user has it already.
241
+ */
242
+ async function tag_create(name) {
243
+ const client = await chrisConnection_js_1.chrisConnection.client_get();
244
+ if (!client) {
245
+ errorStack_js_1.errorStack.stack_push('error', 'Not connected to ChRIS.');
246
+ return (0, result_js_1.Err)();
247
+ }
248
+ try {
249
+ const owned = await client.getTags({ name });
250
+ if ((0, adapter_js_1.listData_get)(owned).some((tag) => tag.name === name)) {
251
+ errorStack_js_1.errorStack.stack_push('error', `${name}: File exists`);
252
+ return (0, result_js_1.Err)();
253
+ }
254
+ await client.createTag({ name, color: exports.TAG_COLOR_DEFAULT });
255
+ feedTagsMap_forget();
256
+ return (0, result_js_1.Ok)(true);
257
+ }
258
+ catch (error) {
259
+ errorStack_js_1.errorStack.stack_push('error', `Failed to make tag ${name}: ${error instanceof Error ? error.message : String(error)}`);
260
+ return (0, result_js_1.Err)();
261
+ }
262
+ }
263
+ /**
264
+ * The user's tag of a name, as a resource to change, read fresh.
265
+ *
266
+ * @param name - The tag's name.
267
+ * @returns The tag and its feeds, or Err with "No such tag" stacked.
268
+ */
269
+ async function tag_reach(name) {
270
+ feedTagsMap_forget();
271
+ const index = await tagsIndex_read(Date.now());
272
+ if (!index.ok)
273
+ return (0, result_js_1.Err)();
274
+ const tag = index.value.resources.get(name);
275
+ const entry = index.value.tags.get(name);
276
+ if (tag === undefined || entry === undefined) {
277
+ errorStack_js_1.errorStack.stack_push('error', `${name}: No such file or directory`);
278
+ return (0, result_js_1.Err)();
279
+ }
280
+ return (0, result_js_1.Ok)({ tag, entry });
281
+ }
282
+ /**
283
+ * Deletes a tag from the user's vocabulary (`rmdir /proc/tags/<name>`); a
284
+ * tag that still hangs on a feed is refused, as a folder that holds
285
+ * something is.
286
+ *
287
+ * @param name - The tag's name.
288
+ * @returns True when deleted; Err with "Directory not empty" while feeds wear it.
289
+ */
290
+ async function tag_delete(name) {
291
+ try {
292
+ const reached = await tag_reach(name);
293
+ if (!reached.ok)
294
+ return (0, result_js_1.Err)();
295
+ if (reached.value.entry.feeds.length > 0) {
296
+ const count = reached.value.entry.feeds.length;
297
+ errorStack_js_1.errorStack.stack_push('error', `${name}: Directory not empty (${count} ${count === 1 ? 'feed wears' : 'feeds wear'} it)`);
298
+ return (0, result_js_1.Err)();
299
+ }
300
+ await reached.value.tag.delete();
301
+ feedTagsMap_forget();
302
+ return (0, result_js_1.Ok)(true);
303
+ }
304
+ catch (error) {
305
+ errorStack_js_1.errorStack.stack_push('error', `Failed to delete tag ${name}: ${error instanceof Error ? error.message : String(error)}`);
306
+ return (0, result_js_1.Err)();
307
+ }
308
+ }
309
+ /**
310
+ * Renames one of the user's tags (`mv /proc/tags/<from> /proc/tags/<to>`):
311
+ * every feed wearing it wears the new name.
312
+ *
313
+ * @param from - The tag's name now.
314
+ * @param to - Its new name.
315
+ * @returns True when renamed; Err with "File exists" when the user has a tag of the new name.
316
+ */
317
+ async function tag_rename(from, to) {
318
+ try {
319
+ const reached = await tag_reach(from);
320
+ if (!reached.ok)
321
+ return (0, result_js_1.Err)();
322
+ if (tagsMap?.tags.has(to) === true) {
323
+ errorStack_js_1.errorStack.stack_push('error', `${to}: File exists`);
324
+ return (0, result_js_1.Err)();
325
+ }
326
+ // CUBE's PUT takes the whole tag: the colour is sent back as it was.
327
+ await reached.value.tag.put({ name: to, color: reached.value.entry.color });
328
+ feedTagsMap_forget();
329
+ return (0, result_js_1.Ok)(true);
330
+ }
331
+ catch (error) {
332
+ errorStack_js_1.errorStack.stack_push('error', `Failed to rename tag ${from}: ${error instanceof Error ? error.message : String(error)}`);
333
+ return (0, result_js_1.Err)();
334
+ }
335
+ }
336
+ //# sourceMappingURL=chrisTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrisTags.js","sourceRoot":"","sources":["../../src/feeds/chrisTags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @file One folder lookup per path per session: the chrisapi client's
3
+ * `getFileBrowserFolderByPath` memoised through the listing cache.
4
+ *
5
+ * Every navigation asked CUBE `filebrowser/search?path=` for the same
6
+ * path three times — the path resolver, `cd`'s validation and the listing
7
+ * each resolved it on their own — and asked again on the next visit. The
8
+ * record is kept beside the folder's listing, under the listing's own
9
+ * TTL, and dropped by the same invalidations the poller of record and
10
+ * local mutations already make (epic #367): no second clock. A lookup in
11
+ * flight is shared; a miss or a failure is never kept.
12
+ */
13
+ import type { Client } from '../chrisapi/adapter.js';
14
+ /**
15
+ * Wraps a client's folder lookup with the session's memo. Idempotent.
16
+ *
17
+ * @param client - A connected chrisapi Client.
18
+ * @returns The same client, its `getFileBrowserFolderByPath` memoised.
19
+ */
20
+ export declare function folderLookup_memoize(client: Client): Client;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.folderLookup_memoize = folderLookup_memoize;
4
+ const listCache_1 = require("../cache/listCache");
5
+ /** How a memoised client is marked, so it is wrapped once. */
6
+ const MEMOISED = Symbol('folderLookup_memoised');
7
+ /**
8
+ * Wraps a client's folder lookup with the session's memo. Idempotent.
9
+ *
10
+ * @param client - A connected chrisapi Client.
11
+ * @returns The same client, its `getFileBrowserFolderByPath` memoised.
12
+ */
13
+ function folderLookup_memoize(client) {
14
+ const wrapped = client;
15
+ if (wrapped[MEMOISED] === true)
16
+ return client;
17
+ // A client without the lookup (a stub, an older chrisapi) is left as it is.
18
+ if (typeof wrapped.getFileBrowserFolderByPath !== 'function')
19
+ return client;
20
+ wrapped[MEMOISED] = true;
21
+ const lookup = wrapped.getFileBrowserFolderByPath.bind(wrapped);
22
+ wrapped.getFileBrowserFolderByPath = (path, timeout) => {
23
+ const kept = (0, listCache_1.listCache_get)().folder_get(path);
24
+ if (kept !== null)
25
+ return kept;
26
+ const fresh = lookup(path, timeout);
27
+ (0, listCache_1.listCache_get)().folder_set(path, fresh);
28
+ return fresh;
29
+ };
30
+ return client;
31
+ }
32
+ //# sourceMappingURL=folderMemo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folderMemo.js","sourceRoot":"","sources":["../../src/filebrowser/folderMemo.ts"],"names":[],"mappings":";;AA8BA,oDAeC;AAhCD,kDAAmD;AAEnD,8DAA8D;AAC9D,MAAM,QAAQ,GAAkB,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAQhE;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,MAAc;IACjD,MAAM,OAAO,GAAuB,MAA4B,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAC9C,4EAA4E;IAC5E,IAAI,OAAO,OAAO,CAAC,0BAA0B,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAC5E,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACzB,MAAM,MAAM,GAAyD,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtH,OAAO,CAAC,0BAA0B,GAAG,CAAC,IAAY,EAAE,OAAgB,EAAoB,EAAE;QACxF,MAAM,IAAI,GAA4B,IAAA,yBAAa,GAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,KAAK,GAAqB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,IAAA,yBAAa,GAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -14,6 +14,34 @@ const contract_js_1 = require("../chrisapi/contract.js");
14
14
  const errorStack_js_1 = require("../error/errorStack.js");
15
15
  const chrisResourceGroup_js_1 = require("../resources/chrisResourceGroup.js");
16
16
  const result_js_1 = require("../utils/result.js");
17
+ /** The group items a session's groups listing served, by id, per client. */
18
+ const groupItems = new WeakMap();
19
+ /**
20
+ * The listed group items of one client, made on first use.
21
+ *
22
+ * @param client - The connection's chrisapi client.
23
+ * @returns That client's items by group id.
24
+ */
25
+ function groupItems_for(client) {
26
+ const kept = groupItems.get(client);
27
+ if (kept !== undefined)
28
+ return kept;
29
+ const made = new Map();
30
+ groupItems.set(client, made);
31
+ return made;
32
+ }
33
+ /**
34
+ * Reads the member a membership row names, without a request.
35
+ *
36
+ * @param membership - The membership row resource.
37
+ * @returns The member, or null when the row carries no user id and name.
38
+ */
39
+ function membershipMember_read(membership) {
40
+ const row = (0, adapter_js_1.itemData_get)(membership);
41
+ if (!row || typeof row.user_id !== 'number' || typeof row.user_username !== 'string')
42
+ return null;
43
+ return { id: row.user_id, username: row.user_username };
44
+ }
17
45
  /**
18
46
  * Group handler for ChRIS user groups.
19
47
  */
@@ -33,6 +61,12 @@ class ChRISGroupGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
33
61
  errorStack_js_1.errorStack.stack_push('error', 'Not connected to ChRIS. Please log in.');
34
62
  return null;
35
63
  }
64
+ // The item the groups listing served answers first: chrisapi's getGroup
65
+ // is a list-by-id, and the boot's warm listed every group that way
66
+ // right after listing them all (73 searches on a 73-group CUBE).
67
+ const listed = groupItems_for(client).get(groupID);
68
+ if (listed !== undefined)
69
+ return listed;
36
70
  const group = await client.getGroup(groupID);
37
71
  if (!group)
38
72
  errorStack_js_1.errorStack.stack_push('error', `Group ${groupID} was not found.`);
@@ -50,8 +84,16 @@ class ChRISGroupGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
50
84
  errorStack_js_1.errorStack.stack_push('error', 'Not connected to ChRIS. Please log in.');
51
85
  return (0, result_js_1.Err)();
52
86
  }
87
+ const items = groupItems_for(client);
53
88
  const groups = await (0, contract_js_1.listPages_drain)(async (offset, limit) => {
54
89
  const page = await client.getGroups({ limit, offset });
90
+ // The items are kept by id: a group's members are read off its item.
91
+ const served = typeof page.getItems === 'function' ? (0, adapter_js_1.items_get)(page) : [];
92
+ for (const item of served) {
93
+ const data = (0, adapter_js_1.itemData_get)(item);
94
+ if (data && typeof data.id === 'number')
95
+ items.set(data.id, item);
96
+ }
55
97
  return (0, contract_js_1.collectionPage_wrap)(page, (0, adapter_js_1.listData_get)(page));
56
98
  });
57
99
  return (0, result_js_1.Ok)(groups);
@@ -78,9 +120,14 @@ class ChRISGroupGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
78
120
  const page = await group.getUsers({ limit, offset });
79
121
  return (0, contract_js_1.collectionPage_wrap)(page, (0, adapter_js_1.items_get)(page));
80
122
  })) {
81
- // Membership rows carry only a link to the user; one detail request
82
- // per row (parallel within the page) is what the API offers.
123
+ // A membership row names its user (user_id, user_username): the
124
+ // page is the answer. The linked user is fetched only for a row
125
+ // that does not — the boot's group warm once asked CUBE for every
126
+ // member one by one (51 requests on the dev CUBE).
83
127
  const pageMembers = await Promise.all(step.items.map(async (membershipResource) => {
128
+ const named = membershipMember_read(membershipResource);
129
+ if (named)
130
+ return named;
84
131
  const userResource = await membershipResource.getUser();
85
132
  const member = (0, adapter_js_1.itemData_get)(userResource);
86
133
  if (!member)
@@ -110,8 +157,8 @@ class ChRISGroupGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
110
157
  if (!group)
111
158
  return (0, result_js_1.Err)();
112
159
  const membershipResource = await group.adminAddUser(username);
113
- const userResource = await membershipResource.getUser();
114
- const membership = (0, adapter_js_1.itemData_get)(userResource);
160
+ const membership = membershipMember_read(membershipResource)
161
+ ?? (0, adapter_js_1.itemData_get)(await membershipResource.getUser());
115
162
  if (!membership) {
116
163
  errorStack_js_1.errorStack.stack_push('error', `CUBE returned no membership for ${username}.`);
117
164
  return (0, result_js_1.Err)();
@@ -1 +1 @@
1
- {"version":3,"file":"chrisGroups.js","sourceRoot":"","sources":["../../src/groups/chrisGroups.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chrisGroups.js","sourceRoot":"","sources":["../../src/groups/chrisGroups.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,6 +12,8 @@ export * from "./";
12
12
  export * from "./error/errorStack";
13
13
  export * from "./config/config";
14
14
  export * from "./feeds/chrisFeed";
15
+ export * from "./feeds/chrisTags";
16
+ export * from "./feeds/chrisAccess";
15
17
  export * from "./connect/chrisConnection";
16
18
  export * from "./context/chrisContext";
17
19
  export * from "./plugins/chrisPlugins";
@@ -25,10 +27,12 @@ export * from "./resources/chrisResourceGroup";
25
27
  export * from "./resources/chrisObjContext";
26
28
  export * from "./resources/chrisEmbeddedResourceGroup";
27
29
  export * from "./filebrowser/chrisFileBrowser";
30
+ export * from "./filebrowser/folderMemo";
28
31
  export * from "./filebrowser/chrisFiles";
29
32
  export * from "./filebrowser/chrisPACS";
30
33
  export * from "./filebrowser/chrisPipeline";
31
34
  export * from "./io/chrisIO";
35
+ export * from "./net/requestLedger";
32
36
  export * from "./io/io";
33
37
  export * from "./io/node_io";
34
38
  export * from "./utils/keypair";
@@ -39,6 +43,7 @@ export * from "./utils/envelope";
39
43
  export * from "./cache";
40
44
  export * from "./path/chrisPath";
41
45
  export * from "./pipelines/chrisPipeline";
46
+ export * from "./pipelines/pipelineMemo";
42
47
  export * from "./users/chrisUsers";
43
48
  export * from "./tags/chrisTags";
44
49
  export * from "./groups/chrisGroups";