@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.
- package/LICENSE +21 -0
- package/README.md +78 -0
- package/dist/activities/chrisActivity.d.ts +19 -0
- package/dist/activities/chrisActivity.js +29 -0
- package/dist/activities/chrisActivity.js.map +1 -0
- package/dist/cache/index.d.ts +9 -0
- package/dist/cache/index.js +15 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/listCache.d.ts +182 -0
- package/dist/cache/listCache.js +266 -0
- package/dist/cache/listCache.js.map +1 -0
- package/dist/cache/procCache.d.ts +150 -0
- package/dist/cache/procCache.js +257 -0
- package/dist/cache/procCache.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +43 -0
- package/dist/cli.js.map +1 -0
- package/dist/compute/computeResources.d.ts +65 -0
- package/dist/compute/computeResources.js +113 -0
- package/dist/compute/computeResources.js.map +1 -0
- package/dist/config/config.d.ts +221 -0
- package/dist/config/config.js +350 -0
- package/dist/config/config.js.map +1 -0
- package/dist/connect/chrisConnection.d.ts +121 -0
- package/dist/connect/chrisConnection.js +303 -0
- package/dist/connect/chrisConnection.js.map +1 -0
- package/dist/context/chrisContext.d.ts +110 -0
- package/dist/context/chrisContext.js +324 -0
- package/dist/context/chrisContext.js.map +1 -0
- package/dist/error/errorStack.d.ts +115 -0
- package/dist/error/errorStack.js +175 -0
- package/dist/error/errorStack.js.map +1 -0
- package/dist/feeds/chrisFeed.d.ts +188 -0
- package/dist/feeds/chrisFeed.js +432 -0
- package/dist/feeds/chrisFeed.js.map +1 -0
- package/dist/filebrowser/chrisFileBrowser.d.ts +77 -0
- package/dist/filebrowser/chrisFileBrowser.js +134 -0
- package/dist/filebrowser/chrisFileBrowser.js.map +1 -0
- package/dist/filebrowser/chrisFiles.d.ts +67 -0
- package/dist/filebrowser/chrisFiles.js +130 -0
- package/dist/filebrowser/chrisFiles.js.map +1 -0
- package/dist/filebrowser/chrisPACS.d.ts +43 -0
- package/dist/filebrowser/chrisPACS.js +103 -0
- package/dist/filebrowser/chrisPACS.js.map +1 -0
- package/dist/filebrowser/chrisPipeline.d.ts +47 -0
- package/dist/filebrowser/chrisPipeline.js +118 -0
- package/dist/filebrowser/chrisPipeline.js.map +1 -0
- package/dist/groups/chrisGroups.d.ts +11 -0
- package/dist/groups/chrisGroups.js +18 -0
- package/dist/groups/chrisGroups.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.js +86 -0
- package/dist/index.js.map +1 -0
- package/dist/io/browser_io.d.ts +97 -0
- package/dist/io/browser_io.js +149 -0
- package/dist/io/browser_io.js.map +1 -0
- package/dist/io/chrisIO.d.ts +110 -0
- package/dist/io/chrisIO.js +415 -0
- package/dist/io/chrisIO.js.map +1 -0
- package/dist/io/io.d.ts +21 -0
- package/dist/io/io.js +6 -0
- package/dist/io/io.js.map +1 -0
- package/dist/io/node_io.d.ts +30 -0
- package/dist/io/node_io.js +188 -0
- package/dist/io/node_io.js.map +1 -0
- package/dist/jobs/chrisJob.d.ts +43 -0
- package/dist/jobs/chrisJob.js +169 -0
- package/dist/jobs/chrisJob.js.map +1 -0
- package/dist/jobs/index.d.ts +7 -0
- package/dist/jobs/index.js +24 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/jobMonitor.d.ts +46 -0
- package/dist/jobs/jobMonitor.js +102 -0
- package/dist/jobs/jobMonitor.js.map +1 -0
- package/dist/pacs/chrisPACS.d.ts +200 -0
- package/dist/pacs/chrisPACS.js +562 -0
- package/dist/pacs/chrisPACS.js.map +1 -0
- package/dist/path/chrisPath.d.ts +78 -0
- package/dist/path/chrisPath.js +190 -0
- package/dist/path/chrisPath.js.map +1 -0
- package/dist/pipelines/chrisPipeline.d.ts +86 -0
- package/dist/pipelines/chrisPipeline.js +180 -0
- package/dist/pipelines/chrisPipeline.js.map +1 -0
- package/dist/pluginmetas/chrisPluginMetas.d.ts +11 -0
- package/dist/pluginmetas/chrisPluginMetas.js +18 -0
- package/dist/pluginmetas/chrisPluginMetas.js.map +1 -0
- package/dist/plugins/chrisPluginMetaPlugins.d.ts +12 -0
- package/dist/plugins/chrisPluginMetaPlugins.js +19 -0
- package/dist/plugins/chrisPluginMetaPlugins.js.map +1 -0
- package/dist/plugins/chrisPlugins.d.ts +127 -0
- package/dist/plugins/chrisPlugins.js +528 -0
- package/dist/plugins/chrisPlugins.js.map +1 -0
- package/dist/resources/chrisEmbeddedResourceGroup.d.ts +73 -0
- package/dist/resources/chrisEmbeddedResourceGroup.js +148 -0
- package/dist/resources/chrisEmbeddedResourceGroup.js.map +1 -0
- package/dist/resources/chrisObjContext.d.ts +16 -0
- package/dist/resources/chrisObjContext.js +109 -0
- package/dist/resources/chrisObjContext.js.map +1 -0
- package/dist/resources/chrisResourceGroup.d.ts +30 -0
- package/dist/resources/chrisResourceGroup.js +47 -0
- package/dist/resources/chrisResourceGroup.js.map +1 -0
- package/dist/resources/chrisResources.d.ts +163 -0
- package/dist/resources/chrisResources.js +415 -0
- package/dist/resources/chrisResources.js.map +1 -0
- package/dist/tags/chrisTags.d.ts +11 -0
- package/dist/tags/chrisTags.js +18 -0
- package/dist/tags/chrisTags.js.map +1 -0
- package/dist/users/chrisUsers.d.ts +34 -0
- package/dist/users/chrisUsers.js +57 -0
- package/dist/users/chrisUsers.js.map +1 -0
- package/dist/utils/keypair.d.ts +77 -0
- package/dist/utils/keypair.js +144 -0
- package/dist/utils/keypair.js.map +1 -0
- package/dist/utils/result.d.ts +77 -0
- package/dist/utils/result.js +58 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/searchable.d.ts +143 -0
- package/dist/utils/searchable.js +212 -0
- package/dist/utils/searchable.js.map +1 -0
- package/dist/workflows/chrisWorkflows.d.ts +11 -0
- package/dist/workflows/chrisWorkflows.js +18 -0
- package/dist/workflows/chrisWorkflows.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file ChRIS PACS Management
|
|
4
|
+
*
|
|
5
|
+
* Provides helpers to list PACS servers that the current CUBE knows about.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
43
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.ChRISPACSRetrieveGroup = exports.ChRISPACSQueryGroup = exports.ChRISPACSGroup = void 0;
|
|
47
|
+
exports.pacsServer_resolve = pacsServer_resolve;
|
|
48
|
+
exports.pacsServers_list = pacsServers_list;
|
|
49
|
+
exports.pacsQueries_list = pacsQueries_list;
|
|
50
|
+
exports.pacsQueries_create = pacsQueries_create;
|
|
51
|
+
exports.pacsQuery_resultDecode = pacsQuery_resultDecode;
|
|
52
|
+
exports.pacsQuery_get = pacsQuery_get;
|
|
53
|
+
exports.pacsRetrieve_create = pacsRetrieve_create;
|
|
54
|
+
exports.pacsRetrieves_list = pacsRetrieves_list;
|
|
55
|
+
exports.pacsRetrieve_delete = pacsRetrieve_delete;
|
|
56
|
+
exports.pacsRetrieve_statusForQuery = pacsRetrieve_statusForQuery;
|
|
57
|
+
const errorStack_js_1 = require("../error/errorStack.js");
|
|
58
|
+
const result_js_1 = require("../utils/result.js");
|
|
59
|
+
const chrisResourceGroup_js_1 = require("../resources/chrisResourceGroup.js");
|
|
60
|
+
const chrisConnection_js_1 = require("../connect/chrisConnection.js");
|
|
61
|
+
const zlib_1 = __importDefault(require("zlib"));
|
|
62
|
+
/**
|
|
63
|
+
* Group handler for PACS servers.
|
|
64
|
+
*/
|
|
65
|
+
class ChRISPACSGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
|
|
66
|
+
constructor() {
|
|
67
|
+
super("PACS", "getPACSList");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
exports.ChRISPACSGroup = ChRISPACSGroup;
|
|
71
|
+
/**
|
|
72
|
+
* Group handler for PACS queries.
|
|
73
|
+
*/
|
|
74
|
+
class ChRISPACSQueryGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
|
|
75
|
+
constructor() {
|
|
76
|
+
super("PACSQueries", "getPACSQueries");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.ChRISPACSQueryGroup = ChRISPACSQueryGroup;
|
|
80
|
+
/**
|
|
81
|
+
* Resolve a PACS server identifier or ID to an ID and identifier.
|
|
82
|
+
*
|
|
83
|
+
* @param pacsserver - Numeric ID or identifier string.
|
|
84
|
+
* @returns Result containing { id, identifier? } or Err on failure/ambiguity.
|
|
85
|
+
*/
|
|
86
|
+
async function pacsServer_resolve(pacsserver) {
|
|
87
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
88
|
+
if (!client) {
|
|
89
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
90
|
+
return (0, result_js_1.Err)();
|
|
91
|
+
}
|
|
92
|
+
if (/^\d+$/.test(pacsserver)) {
|
|
93
|
+
const id = Number(pacsserver);
|
|
94
|
+
return (0, result_js_1.Ok)({ id, identifier: undefined });
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const list = await client.getPACSList({
|
|
98
|
+
identifier: pacsserver,
|
|
99
|
+
limit: 5,
|
|
100
|
+
});
|
|
101
|
+
const matches = Array.isArray(list.data) ? list.data : [];
|
|
102
|
+
if (matches.length === 1) {
|
|
103
|
+
const match = matches[0];
|
|
104
|
+
return (0, result_js_1.Ok)({ id: match.id, identifier: match.identifier });
|
|
105
|
+
}
|
|
106
|
+
if (matches.length === 0) {
|
|
107
|
+
errorStack_js_1.errorStack.stack_push("error", `No PACS server found for "${pacsserver}".`);
|
|
108
|
+
return (0, result_js_1.Err)();
|
|
109
|
+
}
|
|
110
|
+
errorStack_js_1.errorStack.stack_push("error", `Multiple PACS servers matched "${pacsserver}". Please specify an ID or unique identifier.`);
|
|
111
|
+
return (0, result_js_1.Err)();
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
115
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to resolve PACS server "${pacsserver}": ${errorMessage}`);
|
|
116
|
+
return (0, result_js_1.Err)();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Fetch all PACS servers visible to the current ChRIS connection.
|
|
121
|
+
*
|
|
122
|
+
* @param options - Optional search/pagination parameters (identifier, limit, offset).
|
|
123
|
+
* @returns Result containing an array of PACS server records, or Err on failure.
|
|
124
|
+
*/
|
|
125
|
+
async function pacsServers_list(options = {}) {
|
|
126
|
+
try {
|
|
127
|
+
const group = new ChRISPACSGroup();
|
|
128
|
+
const clientAvailable = await group.client_get();
|
|
129
|
+
if (!clientAvailable) {
|
|
130
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
131
|
+
return (0, result_js_1.Err)();
|
|
132
|
+
}
|
|
133
|
+
const listOptions = options;
|
|
134
|
+
const filtered = await group.asset.resources_getAll(listOptions);
|
|
135
|
+
if (!filtered || !filtered.tableData) {
|
|
136
|
+
return (0, result_js_1.Ok)([]);
|
|
137
|
+
}
|
|
138
|
+
const servers = filtered.tableData.map((row) => ({
|
|
139
|
+
id: typeof row.id === "number" ? row.id : Number(row.id),
|
|
140
|
+
identifier: row.identifier || row.name || undefined,
|
|
141
|
+
name: row.name || undefined,
|
|
142
|
+
description: row.description || undefined,
|
|
143
|
+
}));
|
|
144
|
+
return (0, result_js_1.Ok)(servers);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
148
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to list PACS servers: ${errorMessage}`);
|
|
149
|
+
return (0, result_js_1.Err)();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* List PACS queries with optional filtering.
|
|
154
|
+
*
|
|
155
|
+
* @param options - Search/pagination options (pacs_id, pacs_identifier, limit, offset, etc.).
|
|
156
|
+
* @returns Result containing filtered resource data or Err.
|
|
157
|
+
*/
|
|
158
|
+
async function pacsQueries_list(options = {}) {
|
|
159
|
+
try {
|
|
160
|
+
const group = new ChRISPACSQueryGroup();
|
|
161
|
+
const filtered = await group.asset.resources_listAndFilterByOptions(options);
|
|
162
|
+
return (0, result_js_1.Ok)(filtered);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
166
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to list PACS queries: ${errorMessage}`);
|
|
167
|
+
return (0, result_js_1.Err)();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Create a PACS query against a specific PACS server.
|
|
172
|
+
*
|
|
173
|
+
* @param pacsserver - PACS server ID or identifier.
|
|
174
|
+
* @param data - Query creation data (title, query JSON string, optional description).
|
|
175
|
+
* @returns Result containing a PACSQueryRecord or Err.
|
|
176
|
+
*/
|
|
177
|
+
async function pacsQueries_create(pacsserver, data) {
|
|
178
|
+
const resolved = await pacsServer_resolve(pacsserver);
|
|
179
|
+
if (!resolved.ok) {
|
|
180
|
+
return (0, result_js_1.Err)();
|
|
181
|
+
}
|
|
182
|
+
const { id } = resolved.value;
|
|
183
|
+
try {
|
|
184
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
185
|
+
if (!client) {
|
|
186
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
187
|
+
return (0, result_js_1.Err)();
|
|
188
|
+
}
|
|
189
|
+
const query = await client.createPACSQuery(id, data);
|
|
190
|
+
const queryData = query.data;
|
|
191
|
+
const record = {
|
|
192
|
+
id: queryData?.id,
|
|
193
|
+
title: queryData?.title,
|
|
194
|
+
status: queryData?.status,
|
|
195
|
+
pacs_id: queryData?.pacs_id,
|
|
196
|
+
result: queryData?.result,
|
|
197
|
+
};
|
|
198
|
+
return (0, result_js_1.Ok)(record);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
202
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to create PACS query: ${errorMessage}`);
|
|
203
|
+
return (0, result_js_1.Err)();
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Attempt to decode a PACS query result payload.
|
|
208
|
+
*
|
|
209
|
+
* @param queryId - PACS query ID.
|
|
210
|
+
* @returns Result containing decoded forms (raw, decoded buffers, text, optional JSON) or Err on failure.
|
|
211
|
+
*/
|
|
212
|
+
async function pacsQuery_resultDecode(queryId) {
|
|
213
|
+
try {
|
|
214
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
215
|
+
if (!client) {
|
|
216
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
217
|
+
return (0, result_js_1.Err)();
|
|
218
|
+
}
|
|
219
|
+
const query = await client.getPACSQuery(queryId);
|
|
220
|
+
if (!query || !query.data) {
|
|
221
|
+
errorStack_js_1.errorStack.stack_push("error", `PACS query ${queryId} not found.`);
|
|
222
|
+
return (0, result_js_1.Err)();
|
|
223
|
+
}
|
|
224
|
+
const queryData = query.data;
|
|
225
|
+
const raw = queryData?.result;
|
|
226
|
+
if (!raw || typeof raw !== "string") {
|
|
227
|
+
errorStack_js_1.errorStack.stack_push("error", `PACS query ${queryId} has no result payload.`);
|
|
228
|
+
return (0, result_js_1.Err)();
|
|
229
|
+
}
|
|
230
|
+
const decoded = { raw };
|
|
231
|
+
let b64 = null;
|
|
232
|
+
try {
|
|
233
|
+
b64 = Buffer.from(raw, "base64");
|
|
234
|
+
decoded.base64Decoded = b64;
|
|
235
|
+
}
|
|
236
|
+
catch (e) {
|
|
237
|
+
errorStack_js_1.errorStack.stack_push("warning", `Base64 decode failed for query ${queryId}: ${e}`);
|
|
238
|
+
}
|
|
239
|
+
if (b64) {
|
|
240
|
+
try {
|
|
241
|
+
decoded.zlibDecoded = Buffer.from(zlib_1.default.inflateSync(b64));
|
|
242
|
+
}
|
|
243
|
+
catch (e) {
|
|
244
|
+
// Ignore; maybe not zlib
|
|
245
|
+
}
|
|
246
|
+
try {
|
|
247
|
+
decoded.gzipDecoded = Buffer.from(zlib_1.default.gunzipSync(b64));
|
|
248
|
+
}
|
|
249
|
+
catch (e) {
|
|
250
|
+
// Ignore; maybe not gzip
|
|
251
|
+
}
|
|
252
|
+
const textCandidate = decoded.zlibDecoded || decoded.gzipDecoded || decoded.base64Decoded;
|
|
253
|
+
if (textCandidate) {
|
|
254
|
+
decoded.text = textCandidate.toString("utf-8");
|
|
255
|
+
try {
|
|
256
|
+
decoded.json = JSON.parse(decoded.text);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// Not JSON; leave as text
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return (0, result_js_1.Ok)(decoded);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
267
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to decode PACS query result for ${queryId}: ${errorMessage}`);
|
|
268
|
+
return (0, result_js_1.Err)();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Fetch a single PACS query record by ID.
|
|
273
|
+
*
|
|
274
|
+
* @param queryId - PACS query ID.
|
|
275
|
+
* @returns Result containing a PACSQueryRecord (with current status/result) or Err.
|
|
276
|
+
*/
|
|
277
|
+
async function pacsQuery_get(queryId) {
|
|
278
|
+
try {
|
|
279
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
280
|
+
if (!client) {
|
|
281
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
282
|
+
return (0, result_js_1.Err)();
|
|
283
|
+
}
|
|
284
|
+
const query = await client.getPACSQuery(queryId);
|
|
285
|
+
if (!query || !query.data) {
|
|
286
|
+
errorStack_js_1.errorStack.stack_push("error", `PACS query ${queryId} not found.`);
|
|
287
|
+
return (0, result_js_1.Err)();
|
|
288
|
+
}
|
|
289
|
+
const qData = query.data;
|
|
290
|
+
return (0, result_js_1.Ok)({
|
|
291
|
+
id: queryId,
|
|
292
|
+
title: qData?.title,
|
|
293
|
+
status: qData?.status,
|
|
294
|
+
pacs_id: qData?.pacs_id,
|
|
295
|
+
result: qData?.result,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
300
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to get PACS query ${queryId}: ${msg}`);
|
|
301
|
+
return (0, result_js_1.Err)();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Group handler for PACS retrieves.
|
|
306
|
+
*/
|
|
307
|
+
class ChRISPACSRetrieveGroup extends chrisResourceGroup_js_1.ChRISResourceGroup {
|
|
308
|
+
constructor() {
|
|
309
|
+
super("PACSRetrieves", "getPACSRetrieves");
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
exports.ChRISPACSRetrieveGroup = ChRISPACSRetrieveGroup;
|
|
313
|
+
/**
|
|
314
|
+
* Create a PACS retrieve for a given query.
|
|
315
|
+
* This triggers the external service to pull DICOM data from PACS to ChRIS.
|
|
316
|
+
*
|
|
317
|
+
* @param queryId - PACS query ID to retrieve data for.
|
|
318
|
+
* @returns Result containing a PACSRetrieveRecord or Err.
|
|
319
|
+
*/
|
|
320
|
+
async function pacsRetrieve_create(queryId) {
|
|
321
|
+
try {
|
|
322
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
323
|
+
if (!client) {
|
|
324
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
325
|
+
return (0, result_js_1.Err)();
|
|
326
|
+
}
|
|
327
|
+
const retrieve = await client.createPACSRetrieve(queryId);
|
|
328
|
+
const retrieveData = retrieve.data;
|
|
329
|
+
const record = {
|
|
330
|
+
id: retrieveData?.id,
|
|
331
|
+
pacs_query_id: queryId,
|
|
332
|
+
status: retrieveData?.status,
|
|
333
|
+
creation_date: retrieveData?.creation_date,
|
|
334
|
+
};
|
|
335
|
+
return (0, result_js_1.Ok)(record);
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
339
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to create PACS retrieve for query ${queryId}: ${errorMessage}`);
|
|
340
|
+
return (0, result_js_1.Err)();
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* List all retrieves for a given PACS query.
|
|
345
|
+
*
|
|
346
|
+
* @param queryId - PACS query ID.
|
|
347
|
+
* @param options - Optional list options.
|
|
348
|
+
* @returns Result containing an array of PACSRetrieveRecord or Err.
|
|
349
|
+
*/
|
|
350
|
+
async function pacsRetrieves_list(queryId, options = {}) {
|
|
351
|
+
try {
|
|
352
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
353
|
+
if (!client) {
|
|
354
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
355
|
+
return (0, result_js_1.Err)();
|
|
356
|
+
}
|
|
357
|
+
const query = await client.getPACSQuery(queryId);
|
|
358
|
+
if (!query || !query.data) {
|
|
359
|
+
errorStack_js_1.errorStack.stack_push("error", `PACS query ${queryId} not found.`);
|
|
360
|
+
return (0, result_js_1.Err)();
|
|
361
|
+
}
|
|
362
|
+
const retrieveList = await query.getRetrieves(options);
|
|
363
|
+
const items = retrieveList.getItems();
|
|
364
|
+
if (!items) {
|
|
365
|
+
return (0, result_js_1.Ok)([]);
|
|
366
|
+
}
|
|
367
|
+
const records = items.map((item) => ({
|
|
368
|
+
id: item.data.id,
|
|
369
|
+
pacs_query_id: item.data.pacs_query_id,
|
|
370
|
+
status: item.data.status,
|
|
371
|
+
creation_date: item.data.creation_date,
|
|
372
|
+
}));
|
|
373
|
+
return (0, result_js_1.Ok)(records);
|
|
374
|
+
}
|
|
375
|
+
catch (error) {
|
|
376
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
377
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to list PACS retrieves for query ${queryId}: ${errorMessage}`);
|
|
378
|
+
return (0, result_js_1.Err)();
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Delete (cancel) a PACS retrieve.
|
|
383
|
+
*
|
|
384
|
+
* @param retrieveId - PACS retrieve ID to delete.
|
|
385
|
+
* @returns Result containing void or Err.
|
|
386
|
+
*/
|
|
387
|
+
async function pacsRetrieve_delete(retrieveId) {
|
|
388
|
+
try {
|
|
389
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
390
|
+
if (!client) {
|
|
391
|
+
errorStack_js_1.errorStack.stack_push("error", "Not connected to ChRIS. Please log in.");
|
|
392
|
+
return (0, result_js_1.Err)();
|
|
393
|
+
}
|
|
394
|
+
// The API typically has endpoints like /api/v1/pacsfiles/retrieves/{id}/
|
|
395
|
+
// We need to construct the URL and make a DELETE request
|
|
396
|
+
// For now, use a simple approach: we know retrieves exist, so direct delete via constructed object
|
|
397
|
+
// Note: This is a simplified implementation
|
|
398
|
+
// In a production system, you'd want to verify the retrieve exists first
|
|
399
|
+
const baseUrl = client.auth?.cubeUrl || "";
|
|
400
|
+
if (!baseUrl) {
|
|
401
|
+
errorStack_js_1.errorStack.stack_push("error", "Could not determine CUBE URL for delete operation.");
|
|
402
|
+
return (0, result_js_1.Err)();
|
|
403
|
+
}
|
|
404
|
+
const retrieveUrl = `${baseUrl}api/v1/pacsfiles/retrieves/${retrieveId}/`;
|
|
405
|
+
const { PACSRetrieve } = await Promise.resolve().then(() => __importStar(require("@fnndsc/chrisapi")));
|
|
406
|
+
const retrieve = new PACSRetrieve(retrieveUrl, client.auth);
|
|
407
|
+
await retrieve.delete();
|
|
408
|
+
return (0, result_js_1.Ok)(undefined);
|
|
409
|
+
}
|
|
410
|
+
catch (error) {
|
|
411
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
412
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to delete PACS retrieve ${retrieveId}: ${errorMessage}`);
|
|
413
|
+
return (0, result_js_1.Err)();
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Count PACSFiles for a given SeriesInstanceUID.
|
|
418
|
+
*
|
|
419
|
+
* @param seriesInstanceUID - The series instance UID to count files for.
|
|
420
|
+
* @returns Result containing file count or Err.
|
|
421
|
+
*/
|
|
422
|
+
async function seriesFiles_count(seriesInstanceUID) {
|
|
423
|
+
try {
|
|
424
|
+
const client = await chrisConnection_js_1.chrisConnection.client_get();
|
|
425
|
+
if (!client) {
|
|
426
|
+
return (0, result_js_1.Ok)(0);
|
|
427
|
+
}
|
|
428
|
+
// First get the PACSSeries record to find the folder_path
|
|
429
|
+
const seriesList = await client.getPACSSeriesList({
|
|
430
|
+
SeriesInstanceUID: seriesInstanceUID,
|
|
431
|
+
limit: 1,
|
|
432
|
+
});
|
|
433
|
+
const seriesItems = seriesList.getItems();
|
|
434
|
+
if (!seriesItems || seriesItems.length === 0) {
|
|
435
|
+
return (0, result_js_1.Ok)(0);
|
|
436
|
+
}
|
|
437
|
+
const series = seriesItems[0];
|
|
438
|
+
if (!series || !series.data) {
|
|
439
|
+
return (0, result_js_1.Ok)(0);
|
|
440
|
+
}
|
|
441
|
+
const folderPath = series.data.folder_path;
|
|
442
|
+
if (!folderPath) {
|
|
443
|
+
return (0, result_js_1.Ok)(0);
|
|
444
|
+
}
|
|
445
|
+
// Count PACSFiles in that folder
|
|
446
|
+
const filesList = await client.getPACSFiles({
|
|
447
|
+
fname: folderPath,
|
|
448
|
+
limit: 1000,
|
|
449
|
+
});
|
|
450
|
+
const items = filesList.getItems();
|
|
451
|
+
return (0, result_js_1.Ok)(filesList.totalCount || (items ? items.length : 0));
|
|
452
|
+
}
|
|
453
|
+
catch (error) {
|
|
454
|
+
errorStack_js_1.errorStack.stack_push("warning", `Failed to count files for series ${seriesInstanceUID}: ${error}`);
|
|
455
|
+
return (0, result_js_1.Ok)(0); // Return 0 rather than failing the whole operation
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Extract value from a DICOM tag object or return as-is.
|
|
460
|
+
*
|
|
461
|
+
* @param val - Potentially a tag object with {label, value} or a primitive.
|
|
462
|
+
* @returns The extracted value.
|
|
463
|
+
*/
|
|
464
|
+
function tag_extractValue(val) {
|
|
465
|
+
if (val && typeof val === "object" && "value" in val) {
|
|
466
|
+
const tagObj = val;
|
|
467
|
+
return tagObj.value;
|
|
468
|
+
}
|
|
469
|
+
return val;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Determine series status based on file counts.
|
|
473
|
+
*
|
|
474
|
+
* @param expected - Expected number of files.
|
|
475
|
+
* @param actual - Actual number of files pulled.
|
|
476
|
+
* @returns Status string.
|
|
477
|
+
*/
|
|
478
|
+
function series_determineStatus(expected, actual) {
|
|
479
|
+
if (actual === 0) {
|
|
480
|
+
return "pending";
|
|
481
|
+
}
|
|
482
|
+
if (actual < expected) {
|
|
483
|
+
return "pulling";
|
|
484
|
+
}
|
|
485
|
+
if (actual === expected) {
|
|
486
|
+
return "pulled";
|
|
487
|
+
}
|
|
488
|
+
return "error"; // More files than expected
|
|
489
|
+
}
|
|
490
|
+
async function retrieve_latestFromQuery(queryId) {
|
|
491
|
+
const retrievesResult = await pacsRetrieves_list(queryId);
|
|
492
|
+
if (!retrievesResult.ok || retrievesResult.value.length === 0)
|
|
493
|
+
return {};
|
|
494
|
+
const latest = retrievesResult.value[retrievesResult.value.length - 1];
|
|
495
|
+
return { retrieveStatus: latest.status, retrieveId: latest.id };
|
|
496
|
+
}
|
|
497
|
+
async function studySeries_buildStatus(study) {
|
|
498
|
+
const studyStatus = {
|
|
499
|
+
studyInfo: study,
|
|
500
|
+
studyInstanceUID: tag_extractValue(study.StudyInstanceUID),
|
|
501
|
+
studyDescription: tag_extractValue(study.StudyDescription),
|
|
502
|
+
series: [],
|
|
503
|
+
};
|
|
504
|
+
const seriesArray = Array.isArray(study.series) ? study.series :
|
|
505
|
+
Array.isArray(study.Series) ? study.Series :
|
|
506
|
+
Array.isArray(study.results) ? study.results :
|
|
507
|
+
[];
|
|
508
|
+
for (const seriesObj of seriesArray) {
|
|
509
|
+
if (!seriesObj || typeof seriesObj !== "object")
|
|
510
|
+
continue;
|
|
511
|
+
const series = seriesObj;
|
|
512
|
+
const seriesUID = tag_extractValue(series.SeriesInstanceUID);
|
|
513
|
+
if (!seriesUID)
|
|
514
|
+
continue;
|
|
515
|
+
const expectedFiles = Number(tag_extractValue(series.NumberOfSeriesRelatedInstances)) || 0;
|
|
516
|
+
const actualFilesResult = await seriesFiles_count(seriesUID);
|
|
517
|
+
const actualFiles = actualFilesResult.ok ? actualFilesResult.value : 0;
|
|
518
|
+
const status = series_determineStatus(expectedFiles, actualFiles);
|
|
519
|
+
studyStatus.series.push({
|
|
520
|
+
seriesInfo: series,
|
|
521
|
+
seriesInstanceUID: seriesUID,
|
|
522
|
+
seriesDescription: tag_extractValue(series.SeriesDescription),
|
|
523
|
+
expectedFiles,
|
|
524
|
+
actualFiles,
|
|
525
|
+
status,
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
return studyStatus;
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Reports the retrieve status for a PACS query.
|
|
532
|
+
*
|
|
533
|
+
* @param queryId - ID of the PACS query to inspect.
|
|
534
|
+
* @returns Result wrapping the status report, or Err on failure.
|
|
535
|
+
*/
|
|
536
|
+
async function pacsRetrieve_statusForQuery(queryId) {
|
|
537
|
+
try {
|
|
538
|
+
const decodedResult = await pacsQuery_resultDecode(queryId);
|
|
539
|
+
if (!decodedResult.ok)
|
|
540
|
+
return (0, result_js_1.Err)();
|
|
541
|
+
const decoded = decodedResult.value;
|
|
542
|
+
if (!decoded.json) {
|
|
543
|
+
errorStack_js_1.errorStack.stack_push("error", `Query ${queryId} has no decoded JSON result.`);
|
|
544
|
+
return (0, result_js_1.Err)();
|
|
545
|
+
}
|
|
546
|
+
const { retrieveStatus, retrieveId } = await retrieve_latestFromQuery(queryId);
|
|
547
|
+
const payloadArray = Array.isArray(decoded.json) ? decoded.json : [decoded.json];
|
|
548
|
+
const studies = [];
|
|
549
|
+
for (const obj of payloadArray) {
|
|
550
|
+
if (!obj || typeof obj !== "object")
|
|
551
|
+
continue;
|
|
552
|
+
studies.push(await studySeries_buildStatus(obj));
|
|
553
|
+
}
|
|
554
|
+
return (0, result_js_1.Ok)({ queryId, retrieveStatus, retrieveId, studies });
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
558
|
+
errorStack_js_1.errorStack.stack_push("error", `Failed to generate status report for query ${queryId}: ${errorMessage}`);
|
|
559
|
+
return (0, result_js_1.Err)();
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=chrisPACS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrisPACS.js","sourceRoot":"","sources":["../../src/pacs/chrisPACS.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ChRIS Path Analysis
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for analyzing ChRIS filesystem paths.
|
|
5
|
+
* It determines execution context based on directory structure and extracts
|
|
6
|
+
* metadata from path components.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Determines if a path is within a ChRIS feed directory.
|
|
12
|
+
*
|
|
13
|
+
* Checks if the path contains the pattern: /feeds/feed_<numeric-id>/
|
|
14
|
+
*
|
|
15
|
+
* @param dirPath - The directory path to check.
|
|
16
|
+
* @returns True if the path is within a feed directory, false otherwise.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* path_isInFeed('/home/chris/feeds/feed_123/pl-dircopy_456/data/') // true
|
|
21
|
+
* path_isInFeed('/home/chris/uploads/data/') // false
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function path_isInFeed(dirPath: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Extracts the plugin instance ID from a path by finding the nearest
|
|
27
|
+
* ancestor directory matching the pattern: <plugin-name>_<instanceID>
|
|
28
|
+
*
|
|
29
|
+
* Walks up the directory tree from the given path until finding a directory
|
|
30
|
+
* that matches the plugin instance naming pattern.
|
|
31
|
+
*
|
|
32
|
+
* @param dirPath - The directory path to analyze.
|
|
33
|
+
* @returns The plugin instance ID as a number, or null if not found.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // From deep subdirectory
|
|
38
|
+
* path_extractPluginInstanceID('/home/chris/feeds/feed_123/pl-dircopy_456/data/sub/dir/')
|
|
39
|
+
* // Returns: 456
|
|
40
|
+
*
|
|
41
|
+
* // From data directory
|
|
42
|
+
* path_extractPluginInstanceID('/home/chris/feeds/feed_123/pl-dcm2niix_789/data/')
|
|
43
|
+
* // Returns: 789
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function path_extractPluginInstanceID(dirPath: string): number | null;
|
|
47
|
+
/**
|
|
48
|
+
* Extracts the feed ID from a path.
|
|
49
|
+
*
|
|
50
|
+
* Looks for the pattern: /feeds/feed_<numeric-id>/ in the path.
|
|
51
|
+
*
|
|
52
|
+
* @param dirPath - The directory path to analyze.
|
|
53
|
+
* @returns The feed ID as a number, or null if not found.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* path_extractFeedID('/home/chris/feeds/feed_123/pl-dircopy_456/data/')
|
|
58
|
+
* // Returns: 123
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare function path_extractFeedID(dirPath: string): number | null;
|
|
62
|
+
/**
|
|
63
|
+
* Finds the highest version of pl-dircopy in a bin listing.
|
|
64
|
+
*
|
|
65
|
+
* If multiple pl-dircopy versions exist (e.g., pl-dircopy-v1.0.0, pl-dircopy-v2.1.0),
|
|
66
|
+
* returns the one with the highest version number.
|
|
67
|
+
*
|
|
68
|
+
* @param binListing - Array of plugin names from /bin directory.
|
|
69
|
+
* @returns The full name of the latest pl-dircopy plugin, or null if not found.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const plugins = ['pl-dircopy-v1.0.0', 'pl-dircopy-v2.1.0', 'pl-other-v1.0.0'];
|
|
74
|
+
* path_findLatestDircopy(plugins);
|
|
75
|
+
* // Returns: 'pl-dircopy-v2.1.0'
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export declare function path_findLatestDircopy(binListing: string[]): string | null;
|