@ubercode/dcmtk 0.6.1 → 0.6.3

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.
@@ -1,4 +1,4 @@
1
- export { A as AssociationAcknowledgedData, a as AssociationCompleteData, b as AssociationContext, c as AssociationReceivedData, d as AssociationSummary, e as AssociationTracker, C as CStoreRequestData, f as CannotStartListenerData, g as ConfigErrorData, D as DCMPRSCP_FATAL_EVENTS, h as DCMPRSCP_PATTERNS, i as DCMPSRCV_FATAL_EVENTS, j as DCMPSRCV_PATTERNS, k as DCMQRSCP_FATAL_EVENTS, l as DCMQRSCP_PATTERNS, m as DCMRECV_FATAL_EVENTS, n as DCMRECV_PATTERNS, o as DatabaseReadyData, p as DcmQRSCP, q as DcmQRSCPEventMap, r as DcmQRSCPOptions, s as DcmprsCP, t as DcmprsCPEventMap, u as DcmprsCPOptions, v as DcmprscpEvent, w as DcmprscpEventValue, x as Dcmpsrcv, y as DcmpsrcvEvent, z as DcmpsrcvEventMap, B as DcmpsrcvEventValue, E as DcmpsrcvOptions, F as DcmqrscpEvent, G as DcmqrscpEventValue, H as Dcmrecv, I as DcmrecvEvent, J as DcmrecvEventMap, K as DcmrecvEventValue, L as DcmrecvOptions, M as DcmtkProcess, N as DcmtkProcessConfig, O as DcmtkProcessEventMap, P as DicomReceiver, Q as DicomReceiverEventMap, R as DicomReceiverOptions, S as EventPattern, T as FileDeletedData, U as FileReceivedData, V as FilenameMode, W as FilenameModeValue, X as LineParser, Y as LineParserEventMap, Z as MultiLineConfig, a2 as PoolStatus, a3 as PreferredTransferSyntax, a4 as PreferredTransferSyntaxValue, a5 as PrintAssociationAcknowledgedData, a6 as PrintAssociationReceivedData, a7 as PrintCannotStartListenerData, a8 as ProcessState, a9 as ProcessStateValue, aa as QRAssociationAcknowledgedData, ab as QRAssociationReceivedData, ac as QRCFindRequestData, ad as QRCGetRequestData, ae as QRCMoveRequestData, af as QRCStoreRequestData, ag as QRCannotStartListenerData, ah as QRListeningData, ai as ReceiverAssociationAcknowledgedData, aj as ReceiverAssociationData, ak as ReceiverAssociationReceivedData, al as ReceiverCStoreRequestData, am as ReceiverCannotStartListenerData, an as ReceiverConfigErrorData, ao as ReceiverDatabaseReadyData, ap as ReceiverEchoRequestData, aq as ReceiverErrorData, ar as ReceiverFileData, as as ReceiverListeningData, at as RefusingAssociationData, au as STORESCP_FATAL_EVENTS, av as STORESCP_PATTERNS, aw as StorageMode, ax as StorageModeValue, ay as StoreSCP, az as StoreSCPEventMap, aA as StoreSCPOptions, aB as StoreSCPPreset, aC as StoreSCPPresetName, aD as StoredFileData, aE as StorescpEvent, aF as StorescpEventValue, aG as StoringFileData, aH as SubdirectoryCreatedData, aI as SubdirectoryMode, aJ as SubdirectoryModeValue, aK as TrackedFile, aL as WLMSCPFS_FATAL_EVENTS, aM as WLMSCPFS_PATTERNS, aN as WlmAssociationAcknowledgedData, aO as WlmAssociationReceivedData, aP as WlmCFindRequestData, aQ as WlmCannotStartListenerData, aR as WlmListeningData, aS as Wlmscpfs, aT as WlmscpfsEvent, aU as WlmscpfsEventMap, aV as WlmscpfsEventValue, aW as WlmscpfsOptions } from './index-BuGhfFlQ.cjs';
1
+ export { A as AssociationAcknowledgedData, a as AssociationCompleteData, b as AssociationContext, c as AssociationReceivedData, d as AssociationSummary, e as AssociationTracker, C as CStoreRequestData, f as CannotStartListenerData, g as ConfigErrorData, D as DCMPRSCP_FATAL_EVENTS, h as DCMPRSCP_PATTERNS, i as DCMPSRCV_FATAL_EVENTS, j as DCMPSRCV_PATTERNS, k as DCMQRSCP_FATAL_EVENTS, l as DCMQRSCP_PATTERNS, m as DCMRECV_FATAL_EVENTS, n as DCMRECV_PATTERNS, o as DatabaseReadyData, p as DcmQRSCP, q as DcmQRSCPEventMap, r as DcmQRSCPOptions, s as DcmprsCP, t as DcmprsCPEventMap, u as DcmprsCPOptions, v as DcmprscpEvent, w as DcmprscpEventValue, x as Dcmpsrcv, y as DcmpsrcvEvent, z as DcmpsrcvEventMap, B as DcmpsrcvEventValue, E as DcmpsrcvOptions, F as DcmqrscpEvent, G as DcmqrscpEventValue, H as Dcmrecv, I as DcmrecvEvent, J as DcmrecvEventMap, K as DcmrecvEventValue, L as DcmrecvOptions, M as DcmtkProcess, N as DcmtkProcessConfig, O as DcmtkProcessEventMap, P as DicomReceiver, Q as DicomReceiverEventMap, R as DicomReceiverOptions, S as EventPattern, T as FileDeletedData, U as FileReceivedData, V as FilenameMode, W as FilenameModeValue, X as LineParser, Y as LineParserEventMap, Z as MultiLineConfig, a2 as PoolStatus, a3 as PreferredTransferSyntax, a4 as PreferredTransferSyntaxValue, a5 as PrintAssociationAcknowledgedData, a6 as PrintAssociationReceivedData, a7 as PrintCannotStartListenerData, a8 as ProcessState, a9 as ProcessStateValue, aa as QRAssociationAcknowledgedData, ab as QRAssociationReceivedData, ac as QRCFindRequestData, ad as QRCGetRequestData, ae as QRCMoveRequestData, af as QRCStoreRequestData, ag as QRCannotStartListenerData, ah as QRListeningData, ai as ReceiverAssociationAcknowledgedData, aj as ReceiverAssociationData, ak as ReceiverAssociationReceivedData, al as ReceiverCStoreRequestData, am as ReceiverCannotStartListenerData, an as ReceiverConfigErrorData, ao as ReceiverDatabaseReadyData, ap as ReceiverEchoRequestData, aq as ReceiverErrorData, ar as ReceiverFileData, as as ReceiverListeningData, at as RefusingAssociationData, au as STORESCP_FATAL_EVENTS, av as STORESCP_PATTERNS, aw as StorageMode, ax as StorageModeValue, ay as StoreSCP, az as StoreSCPEventMap, aA as StoreSCPOptions, aB as StoreSCPPreset, aC as StoreSCPPresetName, aD as StoredFileData, aE as StorescpEvent, aF as StorescpEventValue, aG as StoringFileData, aH as SubdirectoryCreatedData, aI as SubdirectoryMode, aJ as SubdirectoryModeValue, aK as TrackedFile, aL as WLMSCPFS_FATAL_EVENTS, aM as WLMSCPFS_PATTERNS, aN as WlmAssociationAcknowledgedData, aO as WlmAssociationReceivedData, aP as WlmCFindRequestData, aQ as WlmCannotStartListenerData, aR as WlmListeningData, aS as Wlmscpfs, aT as WlmscpfsEvent, aU as WlmscpfsEventMap, aV as WlmscpfsEventValue, aW as WlmscpfsOptions } from './index-D_ew9kha.cjs';
2
2
  import './types-Cgumy1N4.cjs';
3
3
  import 'node:events';
4
4
  import 'node:net';
package/dist/servers.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as AssociationAcknowledgedData, a as AssociationCompleteData, b as AssociationContext, c as AssociationReceivedData, d as AssociationSummary, e as AssociationTracker, C as CStoreRequestData, f as CannotStartListenerData, g as ConfigErrorData, D as DCMPRSCP_FATAL_EVENTS, h as DCMPRSCP_PATTERNS, i as DCMPSRCV_FATAL_EVENTS, j as DCMPSRCV_PATTERNS, k as DCMQRSCP_FATAL_EVENTS, l as DCMQRSCP_PATTERNS, m as DCMRECV_FATAL_EVENTS, n as DCMRECV_PATTERNS, o as DatabaseReadyData, p as DcmQRSCP, q as DcmQRSCPEventMap, r as DcmQRSCPOptions, s as DcmprsCP, t as DcmprsCPEventMap, u as DcmprsCPOptions, v as DcmprscpEvent, w as DcmprscpEventValue, x as Dcmpsrcv, y as DcmpsrcvEvent, z as DcmpsrcvEventMap, B as DcmpsrcvEventValue, E as DcmpsrcvOptions, F as DcmqrscpEvent, G as DcmqrscpEventValue, H as Dcmrecv, I as DcmrecvEvent, J as DcmrecvEventMap, K as DcmrecvEventValue, L as DcmrecvOptions, M as DcmtkProcess, N as DcmtkProcessConfig, O as DcmtkProcessEventMap, P as DicomReceiver, Q as DicomReceiverEventMap, R as DicomReceiverOptions, S as EventPattern, T as FileDeletedData, U as FileReceivedData, V as FilenameMode, W as FilenameModeValue, X as LineParser, Y as LineParserEventMap, Z as MultiLineConfig, a2 as PoolStatus, a3 as PreferredTransferSyntax, a4 as PreferredTransferSyntaxValue, a5 as PrintAssociationAcknowledgedData, a6 as PrintAssociationReceivedData, a7 as PrintCannotStartListenerData, a8 as ProcessState, a9 as ProcessStateValue, aa as QRAssociationAcknowledgedData, ab as QRAssociationReceivedData, ac as QRCFindRequestData, ad as QRCGetRequestData, ae as QRCMoveRequestData, af as QRCStoreRequestData, ag as QRCannotStartListenerData, ah as QRListeningData, ai as ReceiverAssociationAcknowledgedData, aj as ReceiverAssociationData, ak as ReceiverAssociationReceivedData, al as ReceiverCStoreRequestData, am as ReceiverCannotStartListenerData, an as ReceiverConfigErrorData, ao as ReceiverDatabaseReadyData, ap as ReceiverEchoRequestData, aq as ReceiverErrorData, ar as ReceiverFileData, as as ReceiverListeningData, at as RefusingAssociationData, au as STORESCP_FATAL_EVENTS, av as STORESCP_PATTERNS, aw as StorageMode, ax as StorageModeValue, ay as StoreSCP, az as StoreSCPEventMap, aA as StoreSCPOptions, aB as StoreSCPPreset, aC as StoreSCPPresetName, aD as StoredFileData, aE as StorescpEvent, aF as StorescpEventValue, aG as StoringFileData, aH as SubdirectoryCreatedData, aI as SubdirectoryMode, aJ as SubdirectoryModeValue, aK as TrackedFile, aL as WLMSCPFS_FATAL_EVENTS, aM as WLMSCPFS_PATTERNS, aN as WlmAssociationAcknowledgedData, aO as WlmAssociationReceivedData, aP as WlmCFindRequestData, aQ as WlmCannotStartListenerData, aR as WlmListeningData, aS as Wlmscpfs, aT as WlmscpfsEvent, aU as WlmscpfsEventMap, aV as WlmscpfsEventValue, aW as WlmscpfsOptions } from './index-DylL4aB-.js';
1
+ export { A as AssociationAcknowledgedData, a as AssociationCompleteData, b as AssociationContext, c as AssociationReceivedData, d as AssociationSummary, e as AssociationTracker, C as CStoreRequestData, f as CannotStartListenerData, g as ConfigErrorData, D as DCMPRSCP_FATAL_EVENTS, h as DCMPRSCP_PATTERNS, i as DCMPSRCV_FATAL_EVENTS, j as DCMPSRCV_PATTERNS, k as DCMQRSCP_FATAL_EVENTS, l as DCMQRSCP_PATTERNS, m as DCMRECV_FATAL_EVENTS, n as DCMRECV_PATTERNS, o as DatabaseReadyData, p as DcmQRSCP, q as DcmQRSCPEventMap, r as DcmQRSCPOptions, s as DcmprsCP, t as DcmprsCPEventMap, u as DcmprsCPOptions, v as DcmprscpEvent, w as DcmprscpEventValue, x as Dcmpsrcv, y as DcmpsrcvEvent, z as DcmpsrcvEventMap, B as DcmpsrcvEventValue, E as DcmpsrcvOptions, F as DcmqrscpEvent, G as DcmqrscpEventValue, H as Dcmrecv, I as DcmrecvEvent, J as DcmrecvEventMap, K as DcmrecvEventValue, L as DcmrecvOptions, M as DcmtkProcess, N as DcmtkProcessConfig, O as DcmtkProcessEventMap, P as DicomReceiver, Q as DicomReceiverEventMap, R as DicomReceiverOptions, S as EventPattern, T as FileDeletedData, U as FileReceivedData, V as FilenameMode, W as FilenameModeValue, X as LineParser, Y as LineParserEventMap, Z as MultiLineConfig, a2 as PoolStatus, a3 as PreferredTransferSyntax, a4 as PreferredTransferSyntaxValue, a5 as PrintAssociationAcknowledgedData, a6 as PrintAssociationReceivedData, a7 as PrintCannotStartListenerData, a8 as ProcessState, a9 as ProcessStateValue, aa as QRAssociationAcknowledgedData, ab as QRAssociationReceivedData, ac as QRCFindRequestData, ad as QRCGetRequestData, ae as QRCMoveRequestData, af as QRCStoreRequestData, ag as QRCannotStartListenerData, ah as QRListeningData, ai as ReceiverAssociationAcknowledgedData, aj as ReceiverAssociationData, ak as ReceiverAssociationReceivedData, al as ReceiverCStoreRequestData, am as ReceiverCannotStartListenerData, an as ReceiverConfigErrorData, ao as ReceiverDatabaseReadyData, ap as ReceiverEchoRequestData, aq as ReceiverErrorData, ar as ReceiverFileData, as as ReceiverListeningData, at as RefusingAssociationData, au as STORESCP_FATAL_EVENTS, av as STORESCP_PATTERNS, aw as StorageMode, ax as StorageModeValue, ay as StoreSCP, az as StoreSCPEventMap, aA as StoreSCPOptions, aB as StoreSCPPreset, aC as StoreSCPPresetName, aD as StoredFileData, aE as StorescpEvent, aF as StorescpEventValue, aG as StoringFileData, aH as SubdirectoryCreatedData, aI as SubdirectoryMode, aJ as SubdirectoryModeValue, aK as TrackedFile, aL as WLMSCPFS_FATAL_EVENTS, aM as WLMSCPFS_PATTERNS, aN as WlmAssociationAcknowledgedData, aO as WlmAssociationReceivedData, aP as WlmCFindRequestData, aQ as WlmCannotStartListenerData, aR as WlmListeningData, aS as Wlmscpfs, aT as WlmscpfsEvent, aU as WlmscpfsEventMap, aV as WlmscpfsEventValue, aW as WlmscpfsOptions } from './index-DHsEm87K.js';
2
2
  import './types-Cgumy1N4.js';
3
3
  import 'node:events';
4
4
  import 'node:net';
package/dist/servers.js CHANGED
@@ -3003,6 +3003,7 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3003
3003
  worker.files = [];
3004
3004
  worker.fileSizes = [];
3005
3005
  worker.outputLines = [];
3006
+ worker.pendingFiles = [];
3006
3007
  worker.startAt = Date.now();
3007
3008
  this.pipeConnection(worker, remoteSocket);
3008
3009
  void this.replenishPool();
@@ -3067,7 +3068,7 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3067
3068
  createDcmrecv(port, tempDir) {
3068
3069
  return Dcmrecv.create({
3069
3070
  port,
3070
- aeTitle: this.options.aeTitle ?? "DCMRECV",
3071
+ aeTitle: this.options.aeTitle,
3071
3072
  outputDirectory: tempDir,
3072
3073
  configFile: this.options.configFile,
3073
3074
  configProfile: this.options.configProfile,
@@ -3097,6 +3098,7 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3097
3098
  files: [],
3098
3099
  fileSizes: [],
3099
3100
  outputLines: [],
3101
+ pendingFiles: [],
3100
3102
  startAt: void 0,
3101
3103
  remoteSocket: void 0,
3102
3104
  workerSocket: void 0
@@ -3171,7 +3173,9 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3171
3173
  /** Wires FILE_RECEIVED from dcmrecv worker to handleFileReceived. */
3172
3174
  wireFileReceived(worker) {
3173
3175
  worker.dcmrecv.onFileReceived((data) => {
3174
- void this.handleFileReceived(worker, data);
3176
+ const promise = this.handleFileReceived(worker, data);
3177
+ worker.pendingFiles.push(promise);
3178
+ void promise.finally(() => removePending(worker.pendingFiles, promise));
3175
3179
  });
3176
3180
  }
3177
3181
  /** Moves a received file, opens it as DicomInstance, and emits FILE_RECEIVED. */
@@ -3211,42 +3215,58 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3211
3215
  /** Returns worker to idle pool on association complete, emits summary. */
3212
3216
  wireAssociationComplete(worker) {
3213
3217
  worker.dcmrecv.onAssociationComplete((data) => {
3214
- const assocId = worker.associationId ?? data.associationId;
3215
- const assocDir = worker.associationDir ?? "";
3216
- const files = [...worker.files];
3217
- const output = [...worker.outputLines];
3218
- const endAt = Date.now();
3219
- const startAt = worker.startAt ?? endAt;
3220
- const totalBytes = sumArray(worker.fileSizes);
3221
- const elapsedMs = endAt - startAt;
3222
- const bytesPerSecond = elapsedMs > 0 ? Math.round(totalBytes / elapsedMs * 1e3) : 0;
3223
- this.emit("ASSOCIATION_COMPLETE", {
3224
- associationId: assocId,
3225
- associationDir: assocDir,
3226
- callingAE: data.callingAE,
3227
- calledAE: data.calledAE,
3228
- source: data.source,
3229
- files,
3230
- durationMs: data.durationMs,
3231
- endReason: data.endReason,
3232
- totalBytes,
3233
- bytesPerSecond,
3234
- startAt,
3235
- endAt,
3236
- output
3237
- });
3238
- worker.state = "idle";
3239
- worker.associationId = void 0;
3240
- worker.associationDir = void 0;
3241
- worker.files = [];
3242
- worker.fileSizes = [];
3243
- worker.outputLines = [];
3244
- worker.startAt = void 0;
3245
- worker.remoteSocket = void 0;
3246
- worker.workerSocket = void 0;
3247
- void this.scaleDown();
3218
+ void this.finalizeAssociation(worker, data);
3219
+ });
3220
+ }
3221
+ /** Awaits pending file operations, emits ASSOCIATION_COMPLETE, resets worker state. */
3222
+ async finalizeAssociation(worker, data) {
3223
+ if (worker.pendingFiles.length > 0) {
3224
+ await Promise.all(worker.pendingFiles);
3225
+ }
3226
+ this.emitAssociationComplete(worker, data);
3227
+ this.resetWorker(worker);
3228
+ void this.scaleDown();
3229
+ }
3230
+ /** Emits the ASSOCIATION_COMPLETE event with transfer stats. */
3231
+ emitAssociationComplete(worker, data) {
3232
+ const assocId = worker.associationId ?? data.associationId;
3233
+ const assocDir = worker.associationDir ?? "";
3234
+ const files = [...worker.files];
3235
+ const output = [...worker.outputLines];
3236
+ const endAt = Date.now();
3237
+ const startAt = worker.startAt ?? endAt;
3238
+ const totalBytes = sumArray(worker.fileSizes);
3239
+ const elapsedMs = endAt - startAt;
3240
+ const bytesPerSecond = elapsedMs > 0 ? Math.round(totalBytes / elapsedMs * 1e3) : 0;
3241
+ this.emit("ASSOCIATION_COMPLETE", {
3242
+ associationId: assocId,
3243
+ associationDir: assocDir,
3244
+ callingAE: data.callingAE,
3245
+ calledAE: data.calledAE,
3246
+ source: data.source,
3247
+ files,
3248
+ durationMs: data.durationMs,
3249
+ endReason: data.endReason,
3250
+ totalBytes,
3251
+ bytesPerSecond,
3252
+ startAt,
3253
+ endAt,
3254
+ output
3248
3255
  });
3249
3256
  }
3257
+ /** Resets worker state to idle after an association completes. */
3258
+ resetWorker(worker) {
3259
+ worker.state = "idle";
3260
+ worker.associationId = void 0;
3261
+ worker.associationDir = void 0;
3262
+ worker.files = [];
3263
+ worker.fileSizes = [];
3264
+ worker.outputLines = [];
3265
+ worker.pendingFiles = [];
3266
+ worker.startAt = void 0;
3267
+ worker.remoteSocket = void 0;
3268
+ worker.workerSocket = void 0;
3269
+ }
3250
3270
  /** Bubbles ASSOCIATION_RECEIVED from dcmrecv worker. */
3251
3271
  wireAssociationReceived(worker) {
3252
3272
  worker.dcmrecv.onEvent("ASSOCIATION_RECEIVED", (data) => {
@@ -3351,6 +3371,10 @@ async function removeDirSafe(dirPath) {
3351
3371
  } catch {
3352
3372
  }
3353
3373
  }
3374
+ function removePending(arr, promise) {
3375
+ const idx = arr.indexOf(promise);
3376
+ if (idx !== -1) void arr.splice(idx, 1);
3377
+ }
3354
3378
  function delay(ms) {
3355
3379
  return new Promise((resolve) => {
3356
3380
  setTimeout(resolve, ms);