@fnndsc/cumin 3.2.4

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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +78 -0
  3. package/dist/activities/chrisActivity.d.ts +19 -0
  4. package/dist/activities/chrisActivity.js +29 -0
  5. package/dist/activities/chrisActivity.js.map +1 -0
  6. package/dist/cache/index.d.ts +9 -0
  7. package/dist/cache/index.js +15 -0
  8. package/dist/cache/index.js.map +1 -0
  9. package/dist/cache/listCache.d.ts +182 -0
  10. package/dist/cache/listCache.js +266 -0
  11. package/dist/cache/listCache.js.map +1 -0
  12. package/dist/cache/procCache.d.ts +150 -0
  13. package/dist/cache/procCache.js +257 -0
  14. package/dist/cache/procCache.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.js +43 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/compute/computeResources.d.ts +65 -0
  19. package/dist/compute/computeResources.js +113 -0
  20. package/dist/compute/computeResources.js.map +1 -0
  21. package/dist/config/config.d.ts +221 -0
  22. package/dist/config/config.js +350 -0
  23. package/dist/config/config.js.map +1 -0
  24. package/dist/connect/chrisConnection.d.ts +121 -0
  25. package/dist/connect/chrisConnection.js +303 -0
  26. package/dist/connect/chrisConnection.js.map +1 -0
  27. package/dist/context/chrisContext.d.ts +110 -0
  28. package/dist/context/chrisContext.js +324 -0
  29. package/dist/context/chrisContext.js.map +1 -0
  30. package/dist/error/errorStack.d.ts +115 -0
  31. package/dist/error/errorStack.js +175 -0
  32. package/dist/error/errorStack.js.map +1 -0
  33. package/dist/feeds/chrisFeed.d.ts +188 -0
  34. package/dist/feeds/chrisFeed.js +432 -0
  35. package/dist/feeds/chrisFeed.js.map +1 -0
  36. package/dist/filebrowser/chrisFileBrowser.d.ts +77 -0
  37. package/dist/filebrowser/chrisFileBrowser.js +134 -0
  38. package/dist/filebrowser/chrisFileBrowser.js.map +1 -0
  39. package/dist/filebrowser/chrisFiles.d.ts +67 -0
  40. package/dist/filebrowser/chrisFiles.js +130 -0
  41. package/dist/filebrowser/chrisFiles.js.map +1 -0
  42. package/dist/filebrowser/chrisPACS.d.ts +43 -0
  43. package/dist/filebrowser/chrisPACS.js +103 -0
  44. package/dist/filebrowser/chrisPACS.js.map +1 -0
  45. package/dist/filebrowser/chrisPipeline.d.ts +47 -0
  46. package/dist/filebrowser/chrisPipeline.js +118 -0
  47. package/dist/filebrowser/chrisPipeline.js.map +1 -0
  48. package/dist/groups/chrisGroups.d.ts +11 -0
  49. package/dist/groups/chrisGroups.js +18 -0
  50. package/dist/groups/chrisGroups.js.map +1 -0
  51. package/dist/index.d.ts +68 -0
  52. package/dist/index.js +86 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/io/browser_io.d.ts +97 -0
  55. package/dist/io/browser_io.js +149 -0
  56. package/dist/io/browser_io.js.map +1 -0
  57. package/dist/io/chrisIO.d.ts +110 -0
  58. package/dist/io/chrisIO.js +415 -0
  59. package/dist/io/chrisIO.js.map +1 -0
  60. package/dist/io/io.d.ts +21 -0
  61. package/dist/io/io.js +6 -0
  62. package/dist/io/io.js.map +1 -0
  63. package/dist/io/node_io.d.ts +30 -0
  64. package/dist/io/node_io.js +188 -0
  65. package/dist/io/node_io.js.map +1 -0
  66. package/dist/jobs/chrisJob.d.ts +43 -0
  67. package/dist/jobs/chrisJob.js +169 -0
  68. package/dist/jobs/chrisJob.js.map +1 -0
  69. package/dist/jobs/index.d.ts +7 -0
  70. package/dist/jobs/index.js +24 -0
  71. package/dist/jobs/index.js.map +1 -0
  72. package/dist/jobs/jobMonitor.d.ts +46 -0
  73. package/dist/jobs/jobMonitor.js +102 -0
  74. package/dist/jobs/jobMonitor.js.map +1 -0
  75. package/dist/pacs/chrisPACS.d.ts +200 -0
  76. package/dist/pacs/chrisPACS.js +562 -0
  77. package/dist/pacs/chrisPACS.js.map +1 -0
  78. package/dist/path/chrisPath.d.ts +78 -0
  79. package/dist/path/chrisPath.js +190 -0
  80. package/dist/path/chrisPath.js.map +1 -0
  81. package/dist/pipelines/chrisPipeline.d.ts +86 -0
  82. package/dist/pipelines/chrisPipeline.js +180 -0
  83. package/dist/pipelines/chrisPipeline.js.map +1 -0
  84. package/dist/pluginmetas/chrisPluginMetas.d.ts +11 -0
  85. package/dist/pluginmetas/chrisPluginMetas.js +18 -0
  86. package/dist/pluginmetas/chrisPluginMetas.js.map +1 -0
  87. package/dist/plugins/chrisPluginMetaPlugins.d.ts +12 -0
  88. package/dist/plugins/chrisPluginMetaPlugins.js +19 -0
  89. package/dist/plugins/chrisPluginMetaPlugins.js.map +1 -0
  90. package/dist/plugins/chrisPlugins.d.ts +127 -0
  91. package/dist/plugins/chrisPlugins.js +528 -0
  92. package/dist/plugins/chrisPlugins.js.map +1 -0
  93. package/dist/resources/chrisEmbeddedResourceGroup.d.ts +73 -0
  94. package/dist/resources/chrisEmbeddedResourceGroup.js +148 -0
  95. package/dist/resources/chrisEmbeddedResourceGroup.js.map +1 -0
  96. package/dist/resources/chrisObjContext.d.ts +16 -0
  97. package/dist/resources/chrisObjContext.js +109 -0
  98. package/dist/resources/chrisObjContext.js.map +1 -0
  99. package/dist/resources/chrisResourceGroup.d.ts +30 -0
  100. package/dist/resources/chrisResourceGroup.js +47 -0
  101. package/dist/resources/chrisResourceGroup.js.map +1 -0
  102. package/dist/resources/chrisResources.d.ts +163 -0
  103. package/dist/resources/chrisResources.js +415 -0
  104. package/dist/resources/chrisResources.js.map +1 -0
  105. package/dist/tags/chrisTags.d.ts +11 -0
  106. package/dist/tags/chrisTags.js +18 -0
  107. package/dist/tags/chrisTags.js.map +1 -0
  108. package/dist/users/chrisUsers.d.ts +34 -0
  109. package/dist/users/chrisUsers.js +57 -0
  110. package/dist/users/chrisUsers.js.map +1 -0
  111. package/dist/utils/keypair.d.ts +77 -0
  112. package/dist/utils/keypair.js +144 -0
  113. package/dist/utils/keypair.js.map +1 -0
  114. package/dist/utils/result.d.ts +77 -0
  115. package/dist/utils/result.js +58 -0
  116. package/dist/utils/result.js.map +1 -0
  117. package/dist/utils/searchable.d.ts +143 -0
  118. package/dist/utils/searchable.js +212 -0
  119. package/dist/utils/searchable.js.map +1 -0
  120. package/dist/workflows/chrisWorkflows.d.ts +11 -0
  121. package/dist/workflows/chrisWorkflows.js +18 -0
  122. package/dist/workflows/chrisWorkflows.js.map +1 -0
  123. package/package.json +55 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * @file ChRIS IO Operations
3
+ *
4
+ * This module handles file input/output operations with the ChRIS backend,
5
+ * including downloading and uploading files.
6
+ *
7
+ * @module
8
+ */
9
+ import Client from "@fnndsc/chrisapi";
10
+ import { IStorageProvider } from "./io.js";
11
+ import { Result } from "../utils/result.js";
12
+ /**
13
+ * Class for handling IO operations with ChRIS.
14
+ */
15
+ export declare class ChrisIO {
16
+ private _chrisFolder;
17
+ private _client;
18
+ private storageProvider;
19
+ constructor();
20
+ /**
21
+ * Sets the storage provider for local IO operations.
22
+ * @param provider - The storage provider instance.
23
+ */
24
+ storageProvider_set(provider: IStorageProvider): void;
25
+ /**
26
+ * Gets the ChRIS client instance, initializing it if necessary.
27
+ * @returns A Promise resolving to the Client instance or null.
28
+ */
29
+ client_get(): Promise<Client | null>;
30
+ get chrisFolder(): string;
31
+ set chrisFolder(folder: string);
32
+ /**
33
+ * Initializes the ChrisIO instance by creating a file browser folder.
34
+ * @returns A Promise resolving to true on success, false on failure, or null if client is missing.
35
+ */
36
+ init(): Promise<boolean | null>;
37
+ private isArrayBuffer;
38
+ /**
39
+ * Downloads a file from ChRIS by its ID as a stream (Node) or blob (browser).
40
+ * Returns the raw response data plus optional size metadata when available.
41
+ *
42
+ * @param fileId - The ID of the file to download.
43
+ * @returns A Result containing the stream/blob and optional size metadata.
44
+ */
45
+ file_downloadStream(fileId: number): Promise<Result<{
46
+ stream: unknown;
47
+ size?: number;
48
+ filename?: string;
49
+ }>>;
50
+ /**
51
+ * Downloads a file from ChRIS by its ID.
52
+ * @param fileId - The ID of the file to download.
53
+ * @returns A Promise resolving to a Buffer of the file content, or null on failure.
54
+ */
55
+ file_download(fileId: number): Promise<Buffer | null>;
56
+ /**
57
+ * Uploads a file to ChRIS.
58
+ * @param fileBlob - The file content as a Blob.
59
+ * @param uploadDir - The directory path in ChRIS to upload to.
60
+ * @param filename - The name of the file to create.
61
+ * @returns A Promise resolving to true on success, false on failure.
62
+ */
63
+ file_upload(fileBlob: Blob, uploadDir: string, filename: string): Promise<boolean>;
64
+ /**
65
+ * Creates a new folder in ChRIS at the specified path.
66
+ *
67
+ * @param folderPath - The path where the folder should be created.
68
+ * @returns A Result containing true if created, false if already exists, or Err on error.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * const result = await chrisIO.folder_create('/uploads/data');
73
+ * if (result.ok && result.value) {
74
+ * console.log('Folder created successfully');
75
+ * }
76
+ * ```
77
+ */
78
+ folder_create(folderPath: string): Promise<Result<boolean>>;
79
+ /**
80
+ * Moves (renames) a folder in ChRIS by updating its path.
81
+ * @param srcPath - The current folder path.
82
+ * @param destPath - The new folder path.
83
+ * @returns Promise resolving to true on success, false on failure.
84
+ */
85
+ folder_moveByPath(srcPath: string, destPath: string): Promise<Result<boolean>>;
86
+ /**
87
+ * Moves (renames) a file in ChRIS by updating its path.
88
+ * @param fileId - The file ID.
89
+ * @param destPath - The target path including filename.
90
+ * @returns Promise resolving to true on success, false on failure.
91
+ */
92
+ file_moveById(fileId: number, destPath: string): Promise<Result<boolean>>;
93
+ /**
94
+ * Uploads a local directory or file to ChRIS recursively.
95
+ * @param localPath - The path on the local filesystem.
96
+ * @param remotePath - The destination path on ChRIS. For directories, follows Unix cp semantics:
97
+ * the source directory name is appended to remotePath.
98
+ * @returns Promise<boolean> success status.
99
+ */
100
+ uploadLocalPath(localPath: string, remotePath: string): Promise<boolean>;
101
+ /**
102
+ * Performs a dummy upload for testing purposes.
103
+ * @returns A Promise resolving to true on success, or null if client is missing.
104
+ */
105
+ dummy_upload(): Promise<boolean | null>;
106
+ }
107
+ /**
108
+ * Global ChRIS IO instance.
109
+ */
110
+ export declare const chrisIO: ChrisIO;
@@ -0,0 +1,415 @@
1
+ "use strict";
2
+ /**
3
+ * @file ChRIS IO Operations
4
+ *
5
+ * This module handles file input/output operations with the ChRIS backend,
6
+ * including downloading and uploading files.
7
+ *
8
+ * @module
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.chrisIO = exports.ChrisIO = void 0;
12
+ const chrisConnection_js_1 = require("../connect/chrisConnection.js");
13
+ const errorStack_js_1 = require("../error/errorStack.js");
14
+ const result_js_1 = require("../utils/result.js");
15
+ /**
16
+ * Class for handling IO operations with ChRIS.
17
+ */
18
+ class ChrisIO {
19
+ constructor() {
20
+ this._chrisFolder = "";
21
+ this._client = null;
22
+ this.storageProvider = null;
23
+ // Client initialization is deferred or handled via async accessor
24
+ }
25
+ /**
26
+ * Sets the storage provider for local IO operations.
27
+ * @param provider - The storage provider instance.
28
+ */
29
+ storageProvider_set(provider) {
30
+ this.storageProvider = provider;
31
+ }
32
+ /**
33
+ * Gets the ChRIS client instance, initializing it if necessary.
34
+ * @returns A Promise resolving to the Client instance or null.
35
+ */
36
+ async client_get() {
37
+ if (!this._client) {
38
+ this._client = await chrisConnection_js_1.chrisConnection.client_get();
39
+ }
40
+ return this._client;
41
+ }
42
+ get chrisFolder() {
43
+ return this._chrisFolder;
44
+ }
45
+ set chrisFolder(folder) {
46
+ this._chrisFolder = folder;
47
+ }
48
+ /**
49
+ * Initializes the ChrisIO instance by creating a file browser folder.
50
+ * @returns A Promise resolving to true on success, false on failure, or null if client is missing.
51
+ */
52
+ async init() {
53
+ const client = await this.client_get();
54
+ if (!client) {
55
+ return null;
56
+ }
57
+ try {
58
+ const fileBrowserFolder = await client.createFileBrowserFolder({ path: this.chrisFolder });
59
+ return true;
60
+ }
61
+ catch (error) {
62
+ errorStack_js_1.errorStack.stack_push("error", `Failed to create FileBrowserFolder:
63
+ ${error instanceof Error ? error.message : String(error)}`);
64
+ return false;
65
+ }
66
+ }
67
+ isArrayBuffer(obj) {
68
+ return (obj instanceof ArrayBuffer ||
69
+ (typeof obj === "object" && obj !== null && "byteLength" in obj));
70
+ }
71
+ /**
72
+ * Downloads a file from ChRIS by its ID as a stream (Node) or blob (browser).
73
+ * Returns the raw response data plus optional size metadata when available.
74
+ *
75
+ * @param fileId - The ID of the file to download.
76
+ * @returns A Result containing the stream/blob and optional size metadata.
77
+ */
78
+ async file_downloadStream(fileId) {
79
+ const client = await this.client_get();
80
+ if (!client) {
81
+ errorStack_js_1.errorStack.stack_push("error", "ChRIS client is not initialized");
82
+ return (0, result_js_1.Err)();
83
+ }
84
+ try {
85
+ const userFile = await client.getUserFile(fileId);
86
+ if (!userFile) {
87
+ errorStack_js_1.errorStack.stack_push("error", `File ID ${fileId} not found (404) or access denied (403).`);
88
+ return (0, result_js_1.Err)();
89
+ }
90
+ const response = await userFile.getFileStream();
91
+ if (!response || response.data === undefined) {
92
+ errorStack_js_1.errorStack.stack_push("error", `File ID ${fileId} returned no data.`);
93
+ return (0, result_js_1.Err)();
94
+ }
95
+ const lengthHeader = response.headers?.["content-length"] ||
96
+ response.headers?.["Content-Length"];
97
+ const size = typeof lengthHeader === "string" ? parseInt(lengthHeader, 10) : undefined;
98
+ return (0, result_js_1.Ok)({
99
+ stream: response.data,
100
+ size: Number.isFinite(size) ? size : undefined,
101
+ filename: userFile.data?.fname,
102
+ });
103
+ }
104
+ catch (error) {
105
+ const msg = error instanceof Error ? error.message : String(error);
106
+ errorStack_js_1.errorStack.stack_push("error", `Download stream failed for file ${fileId}: ${msg}`);
107
+ return (0, result_js_1.Err)();
108
+ }
109
+ }
110
+ /**
111
+ * Downloads a file from ChRIS by its ID.
112
+ * @param fileId - The ID of the file to download.
113
+ * @returns A Promise resolving to a Buffer of the file content, or null on failure.
114
+ */
115
+ async file_download(fileId) {
116
+ const client = await this.client_get();
117
+ if (!client) {
118
+ errorStack_js_1.errorStack.stack_push("error", "ChRIS client is not initialized");
119
+ return null;
120
+ }
121
+ try {
122
+ const userFile = await client.getUserFile(fileId);
123
+ if (!userFile) {
124
+ // This is a common case: the file ID was scraped from a listing, but
125
+ // the file itself is not retrievable (e.g. 404, or permissions)
126
+ errorStack_js_1.errorStack.stack_push("error", `File ID ${fileId} not found (404) or access denied (403).`);
127
+ return null;
128
+ }
129
+ const blob = await userFile.getFileBlob();
130
+ if (!blob) {
131
+ errorStack_js_1.errorStack.stack_push("error", `File ID ${fileId} exists but returned no content/blob.`);
132
+ return null;
133
+ }
134
+ if (typeof blob === "string") {
135
+ return Buffer.from(blob);
136
+ }
137
+ else if (Buffer.isBuffer(blob)) {
138
+ // Already a Node.js Buffer
139
+ return blob;
140
+ }
141
+ else if (blob instanceof ArrayBuffer) {
142
+ return Buffer.from(blob);
143
+ }
144
+ else if (blob instanceof Blob) {
145
+ const arrayBuffer = await blob.arrayBuffer();
146
+ return Buffer.from(arrayBuffer);
147
+ }
148
+ else {
149
+ throw new Error(`Unexpected blob type: ${typeof blob}`);
150
+ }
151
+ }
152
+ catch (error) {
153
+ // Catch network errors, timeouts, or specific API error messages
154
+ const msg = error instanceof Error ? error.message : String(error);
155
+ errorStack_js_1.errorStack.stack_push("error", `Download failed for file ${fileId}: ${msg}`);
156
+ return null;
157
+ }
158
+ }
159
+ /**
160
+ * Uploads a file to ChRIS.
161
+ * @param fileBlob - The file content as a Blob.
162
+ * @param uploadDir - The directory path in ChRIS to upload to.
163
+ * @param filename - The name of the file to create.
164
+ * @returns A Promise resolving to true on success, false on failure.
165
+ */
166
+ async file_upload(fileBlob, uploadDir, filename) {
167
+ const client = await this.client_get();
168
+ if (!client) {
169
+ console.error("ChRIS client is not initialized");
170
+ return false;
171
+ }
172
+ try {
173
+ // ChRIS API expects paths WITHOUT leading slash
174
+ // upload_path should be the FULL PATH including filename
175
+ const normalizedUploadDir = uploadDir.startsWith('/') ? uploadDir.substring(1) : uploadDir;
176
+ const fullPath = normalizedUploadDir.endsWith('/')
177
+ ? normalizedUploadDir + filename
178
+ : normalizedUploadDir + '/' + filename;
179
+ const data = {
180
+ upload_path: fullPath,
181
+ };
182
+ let fileObj = fileBlob;
183
+ if (typeof File !== 'undefined') {
184
+ fileObj = new File([fileBlob], filename);
185
+ }
186
+ const uploadFileObj = { fname: fileObj };
187
+ const uploadPromise = client.uploadFile(data, uploadFileObj);
188
+ const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Upload timeout after 30s')), 30000));
189
+ const userFile = await Promise.race([uploadPromise, timeoutPromise]);
190
+ // ChRIS may rename the file to avoid collisions (e.g. world.txt → world_XXXXXXX.txt)
191
+ // when the path was recently deleted and not yet committed. Detect and rename back.
192
+ const actualFname = userFile.data?.fname ?? '';
193
+ const normalizedActual = actualFname.startsWith('/') ? actualFname.substring(1) : actualFname;
194
+ if (normalizedActual && normalizedActual !== fullPath) {
195
+ try {
196
+ await userFile.put({ upload_path: fullPath });
197
+ }
198
+ catch (renameErr) {
199
+ const renameMsg = renameErr instanceof Error ? renameErr.message : String(renameErr);
200
+ errorStack_js_1.errorStack.stack_push('warning', `Uploaded as '${actualFname}' — rename to '${fullPath}' failed: ${renameMsg}`);
201
+ // Don't fail the upload — file was uploaded, just at wrong name
202
+ }
203
+ }
204
+ return true;
205
+ }
206
+ catch (error) {
207
+ const errorMsg = error instanceof Error ? error.message : String(error);
208
+ errorStack_js_1.errorStack.stack_push("error", `Failed to upload file ${filename} to ${uploadDir}: ${errorMsg}`);
209
+ return false;
210
+ }
211
+ }
212
+ /**
213
+ * Creates a new folder in ChRIS at the specified path.
214
+ *
215
+ * @param folderPath - The path where the folder should be created.
216
+ * @returns A Result containing true if created, false if already exists, or Err on error.
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * const result = await chrisIO.folder_create('/uploads/data');
221
+ * if (result.ok && result.value) {
222
+ * console.log('Folder created successfully');
223
+ * }
224
+ * ```
225
+ */
226
+ async folder_create(folderPath) {
227
+ const client = await this.client_get();
228
+ if (!client) {
229
+ errorStack_js_1.errorStack.stack_push("error", "ChRIS client is not initialized");
230
+ return (0, result_js_1.Err)();
231
+ }
232
+ try {
233
+ const folderList = await client.getFileBrowserFolders();
234
+ const response = await folderList.post({ path: folderPath });
235
+ if (response && response.data) {
236
+ return (0, result_js_1.Ok)(true); // Folder created successfully
237
+ }
238
+ else {
239
+ errorStack_js_1.errorStack.stack_push("error", `Failed to create folder: ${folderPath}. No data in response.`);
240
+ return (0, result_js_1.Err)();
241
+ }
242
+ }
243
+ catch (error) {
244
+ // Check if this is an "already exists" error (400 status with specific message)
245
+ if (error &&
246
+ typeof error === 'object' &&
247
+ 'response' in error &&
248
+ error.response &&
249
+ typeof error.response === 'object' &&
250
+ 'status' in error.response &&
251
+ error.response.status === 400 &&
252
+ 'data' in error.response &&
253
+ error.response.data &&
254
+ typeof error.response.data === 'object' &&
255
+ 'path' in error.response.data &&
256
+ Array.isArray(error.response.data.path) &&
257
+ error.response.data.path[0] &&
258
+ typeof error.response.data.path[0] === 'string' &&
259
+ error.response.data.path[0].includes('already exists')) {
260
+ errorStack_js_1.errorStack.stack_push("warning", `Folder '${folderPath}' already exists.`);
261
+ return (0, result_js_1.Ok)(false); // Return false to indicate folder already existed
262
+ }
263
+ // Other errors
264
+ const errorMessage = error instanceof Error ? error.message : String(error);
265
+ errorStack_js_1.errorStack.stack_push("error", `Error creating folder '${folderPath}': ${errorMessage}`);
266
+ return (0, result_js_1.Err)();
267
+ }
268
+ }
269
+ /**
270
+ * Moves (renames) a folder in ChRIS by updating its path.
271
+ * @param srcPath - The current folder path.
272
+ * @param destPath - The new folder path.
273
+ * @returns Promise resolving to true on success, false on failure.
274
+ */
275
+ async folder_moveByPath(srcPath, destPath) {
276
+ const client = await this.client_get();
277
+ if (!client) {
278
+ errorStack_js_1.errorStack.stack_push("error", "ChRIS client is not initialized");
279
+ return (0, result_js_1.Err)();
280
+ }
281
+ try {
282
+ const folder = await client.getFileBrowserFolderByPath(srcPath);
283
+ if (!folder) {
284
+ errorStack_js_1.errorStack.stack_push("error", `Folder not found: ${srcPath}`);
285
+ return (0, result_js_1.Err)();
286
+ }
287
+ // chrisapi typings omit the path field, but API supports it for renames
288
+ await folder.put({ path: destPath });
289
+ return (0, result_js_1.Ok)(true);
290
+ }
291
+ catch (error) {
292
+ const errorMsg = error instanceof Error ? error.message : String(error);
293
+ errorStack_js_1.errorStack.stack_push("error", `Failed to move folder ${srcPath} to ${destPath}: ${errorMsg}`);
294
+ return (0, result_js_1.Err)();
295
+ }
296
+ }
297
+ /**
298
+ * Moves (renames) a file in ChRIS by updating its path.
299
+ * @param fileId - The file ID.
300
+ * @param destPath - The target path including filename.
301
+ * @returns Promise resolving to true on success, false on failure.
302
+ */
303
+ async file_moveById(fileId, destPath) {
304
+ const client = await this.client_get();
305
+ if (!client) {
306
+ errorStack_js_1.errorStack.stack_push("error", "ChRIS client is not initialized");
307
+ return (0, result_js_1.Err)();
308
+ }
309
+ try {
310
+ const userFile = await client.getUserFile(fileId);
311
+ if (!userFile) {
312
+ errorStack_js_1.errorStack.stack_push("error", `File not found with ID ${fileId}`);
313
+ return (0, result_js_1.Err)();
314
+ }
315
+ // chrisapi typings omit the path field, but API supports it for renames
316
+ await userFile.put({ path: destPath });
317
+ return (0, result_js_1.Ok)(true);
318
+ }
319
+ catch (error) {
320
+ const errorMsg = error instanceof Error ? error.message : String(error);
321
+ errorStack_js_1.errorStack.stack_push("error", `Failed to move file ID ${fileId} to ${destPath}: ${errorMsg}`);
322
+ return (0, result_js_1.Err)();
323
+ }
324
+ }
325
+ /**
326
+ * Uploads a local directory or file to ChRIS recursively.
327
+ * @param localPath - The path on the local filesystem.
328
+ * @param remotePath - The destination path on ChRIS. For directories, follows Unix cp semantics:
329
+ * the source directory name is appended to remotePath.
330
+ * @returns Promise<boolean> success status.
331
+ */
332
+ async uploadLocalPath(localPath, remotePath) {
333
+ if (!this.storageProvider) {
334
+ errorStack_js_1.errorStack.stack_push("error", "Storage provider not configured in ChrisIO.");
335
+ return false;
336
+ }
337
+ try {
338
+ const isDir = await this.storageProvider.isDirectory(localPath);
339
+ if (isDir) {
340
+ // For directories, follow Unix cp semantics: append source dir basename to target
341
+ // e.g., upload ~/test-upload /home/user -> /home/user/test-upload/
342
+ const dirBasename = this.storageProvider.basename(localPath);
343
+ const targetDir = remotePath.endsWith('/')
344
+ ? remotePath + dirBasename
345
+ : remotePath + '/' + dirBasename;
346
+ const entries = await this.storageProvider.readdir(localPath);
347
+ let success = true;
348
+ for (const entry of entries) {
349
+ const childLocal = this.storageProvider.join(localPath, entry);
350
+ const childRemote = targetDir.endsWith('/')
351
+ ? targetDir + entry
352
+ : targetDir + '/' + entry;
353
+ const result = await this.uploadLocalPath(childLocal, childRemote);
354
+ if (!result)
355
+ success = false;
356
+ }
357
+ return success;
358
+ }
359
+ else {
360
+ // It's a file
361
+ const content = await this.storageProvider.readBinary(localPath);
362
+ if (!content) {
363
+ errorStack_js_1.errorStack.stack_push("error", `Failed to read local file: ${localPath}`);
364
+ return false;
365
+ }
366
+ const blob = new Blob([content]);
367
+ // Split remotePath into dir and filename
368
+ // Since remote path is ChRIS path (Unix-like), we split by last '/'
369
+ const lastSlashIndex = remotePath.lastIndexOf('/');
370
+ let dir = "";
371
+ let name = remotePath;
372
+ if (lastSlashIndex !== -1) {
373
+ dir = remotePath.substring(0, lastSlashIndex);
374
+ name = remotePath.substring(lastSlashIndex + 1);
375
+ }
376
+ // If dir is empty, use root
377
+ if (!dir)
378
+ dir = "/";
379
+ return await this.file_upload(blob, dir, name);
380
+ }
381
+ }
382
+ catch (error) {
383
+ const msg = error instanceof Error ? error.message : String(error);
384
+ errorStack_js_1.errorStack.stack_push("error", `Recursive upload failed for ${localPath}: ${msg}`);
385
+ return false;
386
+ }
387
+ }
388
+ /**
389
+ * Performs a dummy upload for testing purposes.
390
+ * @returns A Promise resolving to true on success, or null if client is missing.
391
+ */
392
+ async dummy_upload() {
393
+ const client = await this.client_get();
394
+ if (!client) {
395
+ return null;
396
+ }
397
+ // dummy_upload is deprecated/test logic, fixing for compilation
398
+ const data = {
399
+ upload_path: this.chrisFolder,
400
+ };
401
+ const fileContent = "This is a test file";
402
+ const fileData = JSON.stringify(fileContent);
403
+ const uploadFileBlob = new Blob([fileData], {
404
+ type: "application/json",
405
+ });
406
+ const filename = "dummy.json";
407
+ return await this.file_upload(uploadFileBlob, this.chrisFolder, filename);
408
+ }
409
+ }
410
+ exports.ChrisIO = ChrisIO;
411
+ /**
412
+ * Global ChRIS IO instance.
413
+ */
414
+ exports.chrisIO = new ChrisIO();
415
+ //# sourceMappingURL=chrisIO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrisIO.js","sourceRoot":"","sources":["../../src/io/chrisIO.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file Storage-provider abstraction (IStorageProvider) and provider exports.
3
+ *
4
+ * Interface for storage providers.
5
+ * Defines the methods required for a storage provider to be compatible with cumin.
6
+ */
7
+ export interface IStorageProvider {
8
+ read(path: string): Promise<string | null>;
9
+ readBinary(path: string): Promise<ArrayBuffer | null>;
10
+ write(path: string, data: string): Promise<void>;
11
+ remove(path: string): Promise<void>;
12
+ mkdir(path: string, options?: {
13
+ recursive?: boolean;
14
+ }): Promise<void>;
15
+ exists(path: string): Promise<boolean>;
16
+ readdir(path: string): Promise<string[]>;
17
+ isDirectory(path: string): Promise<boolean>;
18
+ join(...paths: string[]): string;
19
+ basename(path: string): string;
20
+ }
21
+ export { BrowserStorageProvider } from "./browser_io";
package/dist/io/io.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrowserStorageProvider = void 0;
4
+ var browser_io_1 = require("./browser_io");
5
+ Object.defineProperty(exports, "BrowserStorageProvider", { enumerable: true, get: function () { return browser_io_1.BrowserStorageProvider; } });
6
+ //# sourceMappingURL=io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/io/io.ts"],"names":[],"mappings":";;;AAmBA,2CAAsD;AAA7C,oHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @file Node.js implementation of the Storage Provider interface.
3
+ *
4
+ * This module provides a concrete implementation of `IStorageProvider` using
5
+ * Node.js's native `fs` module. It handles file system operations such as
6
+ * reading, writing, listing directories, and checking file existence.
7
+ *
8
+ * @module
9
+ */
10
+ import { IStorageProvider } from "./io.js";
11
+ /**
12
+ * NodeStorageProvider implements IStorageProvider using Node.js's native 'fs' module.
13
+ * It handles file system operations for reading, writing, and removing files,
14
+ * and creating directories.
15
+ */
16
+ export declare class NodeStorageProvider implements IStorageProvider {
17
+ private resolvePath;
18
+ read(filepath: string): Promise<string | null>;
19
+ readBinary(filepath: string): Promise<ArrayBuffer | null>;
20
+ write(filepath: string, data: string): Promise<void>;
21
+ remove(filepath: string): Promise<void>;
22
+ mkdir(filepath: string, options?: {
23
+ recursive?: boolean;
24
+ }): Promise<void>;
25
+ exists(filepath: string): Promise<boolean>;
26
+ readdir(filepath: string): Promise<string[]>;
27
+ isDirectory(filepath: string): Promise<boolean>;
28
+ join(...paths: string[]): string;
29
+ basename(filepath: string): string;
30
+ }