@fnndsc/cumin 3.26.0 → 3.27.1

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.
@@ -24,7 +24,7 @@ import Client, { ListResource } from '@fnndsc/chrisapi';
24
24
  * static methods such as `Client.getAuthToken` through cumin's public API.
25
25
  */
26
26
  export { Client };
27
- export type { ListResource, Resource, ItemResource, User, Group, GroupUser, GroupUserList, UserGroupList, GroupList, ComputeResourceList, PluginInstance, PluginList, Feed, CommentList, Note, Comment, FileBrowserFolder, UserFile, PACSFile, PipelineSourceFile, PipelineSourceFileList, } from '@fnndsc/chrisapi';
27
+ export type { ListResource, Resource, ItemResource, User, Group, GroupUser, GroupUserList, UserGroupList, GroupList, ComputeResourceList, PluginInstance, PluginList, Feed, CommentList, Note, Comment, FileBrowserFolder, UserFile, PACSFile, PipelineSourceFile, PipelineSourceFileList, Tag, TagList, Tagging, FeedTagList, FeedTaggingList, TagFeedList, } from '@fnndsc/chrisapi';
28
28
  /**
29
29
  * Authentication slice of a connected chrisapi Client.
30
30
  *
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/chrisapi/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/chrisapi/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { Result } from "../utils/result.js";
2
+ /** Who can read a feed besides its owner. */
3
+ export interface FeedAccess {
4
+ /** Users granted read. */
5
+ users: string[];
6
+ /** Groups granted read. */
7
+ groups: string[];
8
+ /** Whether everyone can read it. */
9
+ public: boolean;
10
+ }
11
+ /** The two kinds of grant a feed holds. */
12
+ export type FeedGrantKind = 'user' | 'group';
13
+ /**
14
+ * Reads who can read a feed: its users, its groups, and whether it is public.
15
+ *
16
+ * @param feedId - The feed.
17
+ * @returns The access list.
18
+ */
19
+ export declare function feedAccess_read(feedId: number): Promise<Result<FeedAccess>>;
20
+ /**
21
+ * Grants a group read on a feed.
22
+ *
23
+ * @param feedId - The feed.
24
+ * @param group - The group's name.
25
+ * @returns True when CUBE recorded the grant.
26
+ */
27
+ export declare function feedShare_group(feedId: number, group: string): Promise<Result<boolean>>;
28
+ /**
29
+ * Withdraws a user's or a group's grant on a feed.
30
+ *
31
+ * @param feedId - The feed.
32
+ * @param kind - Which kind of grant.
33
+ * @param name - The user's or group's name.
34
+ * @returns True when withdrawn; false when the feed held no such grant.
35
+ */
36
+ export declare function feedShare_revoke(feedId: number, kind: FeedGrantKind, name: string): Promise<Result<boolean>>;
37
+ /**
38
+ * Renames a feed (its title).
39
+ *
40
+ * @param feedId - The feed.
41
+ * @param name - The new name.
42
+ * @returns True when CUBE took it.
43
+ */
44
+ export declare function feed_rename(feedId: number, name: string): Promise<Result<boolean>>;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.feedAccess_read = feedAccess_read;
4
+ exports.feedShare_group = feedShare_group;
5
+ exports.feedShare_revoke = feedShare_revoke;
6
+ exports.feed_rename = feed_rename;
7
+ /**
8
+ * @file A feed's name and its access: who it is shared with (users and
9
+ * groups), whether it is public, and the changes to each. The kernel speaks
10
+ * them as `setfacl` / `getfacl` / `chmod` and as the writable
11
+ * `/proc/jobs/feed_N/title`; this is the adapter beneath.
12
+ *
13
+ * CUBE allows every change here to the feed's owner: a feed's name and
14
+ * public flag are written by a PUT on the feed, a user or group grant is a
15
+ * permission posted to the feed, and either kind of grant is withdrawn by
16
+ * deleting that permission.
17
+ *
18
+ * @module
19
+ */
20
+ const adapter_js_1 = require("../chrisapi/adapter.js");
21
+ const chrisConnection_js_1 = require("../connect/chrisConnection.js");
22
+ const errorStack_js_1 = require("../error/errorStack.js");
23
+ const result_js_1 = require("../utils/result.js");
24
+ /** How many permissions a page asks for. */
25
+ const PERMISSIONS_PAGE = 100;
26
+ /**
27
+ * The connected client and the feed, or the reason there are none.
28
+ *
29
+ * @param feedId - The feed.
30
+ * @param doing - What was being done, for the error.
31
+ * @returns The feed, or null with the error stacked.
32
+ */
33
+ async function feed_reach(feedId, doing) {
34
+ const client = await chrisConnection_js_1.chrisConnection.client_get();
35
+ if (!client) {
36
+ errorStack_js_1.errorStack.stack_push('error', 'Not connected to ChRIS.');
37
+ return null;
38
+ }
39
+ const feed = await client.getFeed(feedId);
40
+ if (!feed) {
41
+ errorStack_js_1.errorStack.stack_push('error', `${doing}: feed ${feedId} not found.`);
42
+ return null;
43
+ }
44
+ return feed;
45
+ }
46
+ /**
47
+ * Every name in a feed's permission collection, page by page.
48
+ *
49
+ * @param fetch - Reads one page.
50
+ * @param field - The field naming the holder (`username`, `grp_name`).
51
+ * @returns The names.
52
+ */
53
+ async function holders_drain(fetch, field) {
54
+ const names = [];
55
+ for (let offset = 0;; offset += PERMISSIONS_PAGE) {
56
+ const rows = (0, adapter_js_1.listData_get)(await fetch(offset));
57
+ for (const row of rows) {
58
+ const name = String(row[field] ?? row['group_name'] ?? '');
59
+ if (name !== '')
60
+ names.push(name);
61
+ }
62
+ if (rows.length < PERMISSIONS_PAGE)
63
+ break;
64
+ }
65
+ return names;
66
+ }
67
+ /**
68
+ * Reads who can read a feed: its users, its groups, and whether it is public.
69
+ *
70
+ * @param feedId - The feed.
71
+ * @returns The access list.
72
+ */
73
+ async function feedAccess_read(feedId) {
74
+ try {
75
+ const feed = await feed_reach(feedId, 'access');
76
+ if (feed === null)
77
+ return (0, result_js_1.Err)();
78
+ const users = await holders_drain((offset) => feed.getUserPermissions({ limit: PERMISSIONS_PAGE, offset }), 'username');
79
+ const groups = await holders_drain((offset) => feed.getGroupPermissions({ limit: PERMISSIONS_PAGE, offset }), 'grp_name');
80
+ const data = (0, adapter_js_1.itemData_get)(feed);
81
+ return (0, result_js_1.Ok)({ users, groups, public: data?.public === true });
82
+ }
83
+ catch (error) {
84
+ errorStack_js_1.errorStack.stack_push('error', `Failed to read the access list of feed ${feedId}: ${error instanceof Error ? error.message : String(error)}`);
85
+ return (0, result_js_1.Err)();
86
+ }
87
+ }
88
+ /**
89
+ * Grants a group read on a feed.
90
+ *
91
+ * @param feedId - The feed.
92
+ * @param group - The group's name.
93
+ * @returns True when CUBE recorded the grant.
94
+ */
95
+ async function feedShare_group(feedId, group) {
96
+ try {
97
+ const feed = await feed_reach(feedId, 'share');
98
+ if (feed === null)
99
+ return (0, result_js_1.Err)();
100
+ await feed.addGroupPermission(group);
101
+ return (0, result_js_1.Ok)(true);
102
+ }
103
+ catch (error) {
104
+ errorStack_js_1.errorStack.stack_push('error', `Failed to share feed ${feedId} with group ${group}: ${error instanceof Error ? error.message : String(error)}`);
105
+ return (0, result_js_1.Err)();
106
+ }
107
+ }
108
+ /**
109
+ * Withdraws a user's or a group's grant on a feed.
110
+ *
111
+ * @param feedId - The feed.
112
+ * @param kind - Which kind of grant.
113
+ * @param name - The user's or group's name.
114
+ * @returns True when withdrawn; false when the feed held no such grant.
115
+ */
116
+ async function feedShare_revoke(feedId, kind, name) {
117
+ try {
118
+ const feed = await feed_reach(feedId, 'unshare');
119
+ if (feed === null)
120
+ return (0, result_js_1.Err)();
121
+ const held = kind === 'user' ? await feed.getUserPermission(name) : await feed.getGroupPermission(name);
122
+ if (held === null)
123
+ return (0, result_js_1.Ok)(false);
124
+ await held.delete();
125
+ return (0, result_js_1.Ok)(true);
126
+ }
127
+ catch (error) {
128
+ errorStack_js_1.errorStack.stack_push('error', `Failed to stop sharing feed ${feedId} with ${kind} ${name}: ${error instanceof Error ? error.message : String(error)}`);
129
+ return (0, result_js_1.Err)();
130
+ }
131
+ }
132
+ /**
133
+ * Renames a feed (its title).
134
+ *
135
+ * @param feedId - The feed.
136
+ * @param name - The new name.
137
+ * @returns True when CUBE took it.
138
+ */
139
+ async function feed_rename(feedId, name) {
140
+ if (name.trim() === '') {
141
+ errorStack_js_1.errorStack.stack_push('error', `feed ${feedId}: a feed's name cannot be empty`);
142
+ return (0, result_js_1.Err)();
143
+ }
144
+ try {
145
+ const feed = await feed_reach(feedId, 'rename');
146
+ if (feed === null)
147
+ return (0, result_js_1.Err)();
148
+ await feed.put({ name });
149
+ return (0, result_js_1.Ok)(true);
150
+ }
151
+ catch (error) {
152
+ errorStack_js_1.errorStack.stack_push('error', `Failed to rename feed ${feedId}: ${error instanceof Error ? error.message : String(error)}`);
153
+ return (0, result_js_1.Err)();
154
+ }
155
+ }
156
+ //# sourceMappingURL=chrisAccess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrisAccess.js","sourceRoot":"","sources":["../../src/feeds/chrisAccess.ts"],"names":[],"mappings":"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"}
@@ -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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"}
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";
package/dist/index.js CHANGED
@@ -30,6 +30,8 @@ __exportStar(require("./"), exports);
30
30
  __exportStar(require("./error/errorStack"), exports);
31
31
  __exportStar(require("./config/config"), exports);
32
32
  __exportStar(require("./feeds/chrisFeed"), exports);
33
+ __exportStar(require("./feeds/chrisTags"), exports);
34
+ __exportStar(require("./feeds/chrisAccess"), exports);
33
35
  __exportStar(require("./connect/chrisConnection"), exports);
34
36
  __exportStar(require("./context/chrisContext"), exports);
35
37
  __exportStar(require("./plugins/chrisPlugins"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AA0HH,4CAKC;AA7HD,qCAAmB;AACnB,qDAAmC;AACnC,kDAAgC;AAChC,oDAAkC;AAClC,4DAA0C;AAC1C,yDAAuC;AACvC,yDAAuC;AACvC,mEAAiD;AACjD,6DAA2C;AAC3C,mDAAiC;AACjC,yDAAuC;AACvC,sDAAoC;AACpC,6DAA2C;AAC3C,iEAA+C;AAC/C,8DAA4C;AAC5C,yEAAuD;AACvD,iEAA+C;AAC/C,2DAAyC;AACzC,2DAAyC;AACzC,0DAAwC;AACxC,8DAA4C;AAC5C,+CAA6B;AAC7B,sDAAoC;AACpC,0CAAwB;AACxB,+CAA6B;AAC7B,kDAAgC;AAChC,qDAAmC;AACnC,iDAA+B;AAC/B,gDAA8B;AAC9B,mDAAiC;AACjC,0CAAwB;AACxB,mDAAiC;AACjC,4DAA0C;AAC1C,2DAAyC;AACzC,qDAAmC;AACnC,mDAAiC;AACjC,uDAAqC;AACrC,iEAA+C;AAC/C,6DAA2C;AAC3C,yDAAuC;AAEvC,iFAAiF;AACjF,8CAA2E;AAAlE,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,oGAAA,SAAS,OAAA;AAC9C,wCAAiH;AAAxG,gGAAA,QAAQ,OAAA;AAAE,iGAAA,SAAS,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,yGAAA,iBAAiB,OAAA;AAAE,mGAAA,WAAW,OAAA;AAExE,yEAAyE;AACzE,0EAA0E;AAC1E,gDAc6B;AAb3B,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,mHAAA,uBAAuB,OAAA;AACvB,8GAAA,kBAAkB,OAAA;AAClB,uGAAA,WAAW,OAAA;AACX,kHAAA,sBAAsB,OAAA;AACtB,wGAAA,YAAY,OAAA;AACZ,uHAAA,2BAA2B,OAAA;AAC3B,qHAAA,yBAAyB,OAAA;AACzB,gHAAA,oBAAoB,OAAA;AACpB,0GAAA,cAAc,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AACtC,2GAAA,eAAe,OAAA;AACf,+GAAA,mBAAmB,OAAA;AAsDrB;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,OAAO,GAAW,OAAO,CAAC;IAChC,wCAAwC;IACxC,6CAA6C;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAED,gEAAgE;AAChE,qCAAqC;AACrC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;AA4HH,4CAKC;AA/HD,qCAAmB;AACnB,qDAAmC;AACnC,kDAAgC;AAChC,oDAAkC;AAClC,oDAAkC;AAClC,sDAAoC;AACpC,4DAA0C;AAC1C,yDAAuC;AACvC,yDAAuC;AACvC,mEAAiD;AACjD,6DAA2C;AAC3C,mDAAiC;AACjC,yDAAuC;AACvC,sDAAoC;AACpC,6DAA2C;AAC3C,iEAA+C;AAC/C,8DAA4C;AAC5C,yEAAuD;AACvD,iEAA+C;AAC/C,2DAAyC;AACzC,2DAAyC;AACzC,0DAAwC;AACxC,8DAA4C;AAC5C,+CAA6B;AAC7B,sDAAoC;AACpC,0CAAwB;AACxB,+CAA6B;AAC7B,kDAAgC;AAChC,qDAAmC;AACnC,iDAA+B;AAC/B,gDAA8B;AAC9B,mDAAiC;AACjC,0CAAwB;AACxB,mDAAiC;AACjC,4DAA0C;AAC1C,2DAAyC;AACzC,qDAAmC;AACnC,mDAAiC;AACjC,uDAAqC;AACrC,iEAA+C;AAC/C,6DAA2C;AAC3C,yDAAuC;AAEvC,iFAAiF;AACjF,8CAA2E;AAAlE,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,oGAAA,SAAS,OAAA;AAC9C,wCAAiH;AAAxG,gGAAA,QAAQ,OAAA;AAAE,iGAAA,SAAS,OAAA;AAAE,kGAAA,UAAU,OAAA;AAAE,yGAAA,iBAAiB,OAAA;AAAE,mGAAA,WAAW,OAAA;AAExE,yEAAyE;AACzE,0EAA0E;AAC1E,gDAc6B;AAb3B,yGAAA,aAAa,OAAA;AACb,+GAAA,mBAAmB,OAAA;AACnB,mHAAA,uBAAuB,OAAA;AACvB,8GAAA,kBAAkB,OAAA;AAClB,uGAAA,WAAW,OAAA;AACX,kHAAA,sBAAsB,OAAA;AACtB,wGAAA,YAAY,OAAA;AACZ,uHAAA,2BAA2B,OAAA;AAC3B,qHAAA,yBAAyB,OAAA;AACzB,gHAAA,oBAAoB,OAAA;AACpB,0GAAA,cAAc,OAAA;AAAE,kHAAA,sBAAsB,OAAA;AACtC,2GAAA,eAAe,OAAA;AACf,+GAAA,mBAAmB,OAAA;AAsDrB;;;;;GAKG;AACI,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,OAAO,GAAW,OAAO,CAAC;IAChC,wCAAwC;IACxC,6CAA6C;IAC7C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAED,gEAAgE;AAChE,qCAAqC;AACrC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnndsc/cumin",
3
- "version": "3.26.0",
3
+ "version": "3.27.1",
4
4
  "description": "Utility library for ChILI and other ChRIS-related JavaScript applications",
5
5
  "repository": {
6
6
  "type": "git",
@@ -68,6 +68,6 @@
68
68
  "@fnndsc/chrisapi": "^1.25.0",
69
69
  "chalk": "^4.1.2",
70
70
  "figlet": "^1.7.0",
71
- "@fnndsc/menu": "^0.14.0"
71
+ "@fnndsc/menu": "^0.16.0"
72
72
  }
73
73
  }