@ubercode/dcmtk 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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-CEqwLKgE.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 ReceiverFileReceivedData, at as ReceiverFileStoredData, au as ReceiverInstanceData, av as ReceiverListeningData, aw as RefusingAssociationData, ax as STORESCP_FATAL_EVENTS, ay as STORESCP_PATTERNS, az as StorageMode, aA as StorageModeValue, aB as StoreSCP, aC as StoreSCPEventMap, aD as StoreSCPOptions, aE as StoreSCPPreset, aF as StoreSCPPresetName, aG as StoredFileData, aH as StorescpEvent, aI as StorescpEventValue, aJ as StoringFileData, aK as SubdirectoryCreatedData, aL as SubdirectoryMode, aM as SubdirectoryModeValue, aN as TrackedFile, aO as WLMSCPFS_FATAL_EVENTS, aP as WLMSCPFS_PATTERNS, aQ as WlmAssociationAcknowledgedData, aR as WlmAssociationReceivedData, aS as WlmCFindRequestData, aT as WlmCannotStartListenerData, aU as WlmListeningData, aV as Wlmscpfs, aW as WlmscpfsEvent, aX as WlmscpfsEventMap, aY as WlmscpfsEventValue, aZ as WlmscpfsOptions } from './index-CVDMaxd8.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-Hp4Ri9y5.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 ReceiverFileReceivedData, at as ReceiverFileStoredData, au as ReceiverInstanceData, av as ReceiverListeningData, aw as RefusingAssociationData, ax as STORESCP_FATAL_EVENTS, ay as STORESCP_PATTERNS, az as StorageMode, aA as StorageModeValue, aB as StoreSCP, aC as StoreSCPEventMap, aD as StoreSCPOptions, aE as StoreSCPPreset, aF as StoreSCPPresetName, aG as StoredFileData, aH as StorescpEvent, aI as StorescpEventValue, aJ as StoringFileData, aK as SubdirectoryCreatedData, aL as SubdirectoryMode, aM as SubdirectoryModeValue, aN as TrackedFile, aO as WLMSCPFS_FATAL_EVENTS, aP as WLMSCPFS_PATTERNS, aQ as WlmAssociationAcknowledgedData, aR as WlmAssociationReceivedData, aS as WlmCFindRequestData, aT as WlmCannotStartListenerData, aU as WlmListeningData, aV as Wlmscpfs, aW as WlmscpfsEvent, aX as WlmscpfsEventMap, aY as WlmscpfsEventValue, aZ as WlmscpfsOptions } from './index--dDQfutR.js';
2
2
  import './types-Cgumy1N4.js';
3
3
  import 'node:events';
4
4
  import 'node:net';
package/dist/servers.js CHANGED
@@ -2007,13 +2007,14 @@ async function execCommand(binary, args, options) {
2007
2007
  windowsHide: true,
2008
2008
  signal: options?.signal
2009
2009
  });
2010
- wireSpawnListeners(child, timeoutMs, resolve);
2010
+ wireSpawnListeners(binary, child, timeoutMs, resolve);
2011
2011
  });
2012
2012
  }
2013
- function wireSpawnListeners(child, timeoutMs, resolve) {
2013
+ function wireSpawnListeners(binary, child, timeoutMs, resolve) {
2014
2014
  let stdout = "";
2015
2015
  let stderr6 = "";
2016
2016
  let settled = false;
2017
+ const name = binary.split("/").pop() ?? binary;
2017
2018
  const settle = (result) => {
2018
2019
  if (settled) return;
2019
2020
  settled = true;
@@ -2022,25 +2023,25 @@ function wireSpawnListeners(child, timeoutMs, resolve) {
2022
2023
  };
2023
2024
  const timer = setTimeout(() => {
2024
2025
  if (child.pid !== void 0 && child.pid !== null) killTree(child.pid);
2025
- settle(err(new Error(`Process timed out after ${timeoutMs}ms`)));
2026
+ settle(err(new Error(`${name} timed out after ${timeoutMs}ms (pid: ${String(child.pid ?? "unknown")})`)));
2026
2027
  }, timeoutMs);
2027
2028
  child.stdout?.on("data", (chunk) => {
2028
2029
  stdout += String(chunk);
2029
2030
  if (stdout.length + stderr6.length > MAX_OUTPUT_BYTES) {
2030
2031
  if (child.pid !== void 0 && child.pid !== null) killTree(child.pid);
2031
- settle(err(new Error(`Process output exceeded ${MAX_OUTPUT_BYTES} bytes`)));
2032
+ settle(err(new Error(`${name} output exceeded ${MAX_OUTPUT_BYTES} bytes`)));
2032
2033
  }
2033
2034
  });
2034
2035
  child.stderr?.on("data", (chunk) => {
2035
2036
  stderr6 += String(chunk);
2036
2037
  if (stdout.length + stderr6.length > MAX_OUTPUT_BYTES) {
2037
2038
  if (child.pid !== void 0 && child.pid !== null) killTree(child.pid);
2038
- settle(err(new Error(`Process output exceeded ${MAX_OUTPUT_BYTES} bytes`)));
2039
+ settle(err(new Error(`${name} output exceeded ${MAX_OUTPUT_BYTES} bytes`)));
2039
2040
  }
2040
2041
  });
2041
2042
  child.on("error", (error) => {
2042
2043
  if (child.pid !== void 0 && child.pid !== null) killTree(child.pid);
2043
- settle(err(new Error(`Process error: ${error.message}`)));
2044
+ settle(err(new Error(`${name} error: ${error.message}`)));
2044
2045
  });
2045
2046
  child.on("close", (code) => {
2046
2047
  settle(ok({ stdout, stderr: stderr6, exitCode: code ?? 1 }));
@@ -2055,7 +2056,7 @@ async function spawnCommand(binary, args, options) {
2055
2056
  windowsHide: true,
2056
2057
  signal: options?.signal
2057
2058
  });
2058
- wireSpawnListeners(child, timeoutMs, resolve);
2059
+ wireSpawnListeners(binary, child, timeoutMs, resolve);
2059
2060
  });
2060
2061
  }
2061
2062
  var PN_REPS = ["Alphabetic", "Ideographic", "Phonetic"];
@@ -3029,14 +3030,32 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3029
3030
  return this.on(event, listener);
3030
3031
  }
3031
3032
  /**
3032
- * Registers a listener for received files.
3033
+ * Registers a listener for files received by dcmrecv (before move/parse).
3033
3034
  *
3034
- * @param listener - Callback receiving file data
3035
+ * @param listener - Callback receiving raw file data
3035
3036
  * @returns this for chaining
3036
3037
  */
3037
3038
  onFileReceived(listener) {
3038
3039
  return this.on("FILE_RECEIVED", listener);
3039
3040
  }
3041
+ /**
3042
+ * Registers a listener for files stored in the association directory.
3043
+ *
3044
+ * @param listener - Callback receiving stored file data with size
3045
+ * @returns this for chaining
3046
+ */
3047
+ onFileStored(listener) {
3048
+ return this.on("FILE_STORED", listener);
3049
+ }
3050
+ /**
3051
+ * Registers a listener for parsed DicomInstance availability.
3052
+ *
3053
+ * @param listener - Callback receiving instance data
3054
+ * @returns this for chaining
3055
+ */
3056
+ onInstanceReceived(listener) {
3057
+ return this.on("INSTANCE_RECEIVED", listener);
3058
+ }
3040
3059
  /**
3041
3060
  * Registers a listener for completed associations.
3042
3061
  *
@@ -3330,11 +3349,18 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3330
3349
  });
3331
3350
  return;
3332
3351
  }
3352
+ this.emit("FILE_RECEIVED", {
3353
+ filePath: data.filePath,
3354
+ associationId: ctx.associationId,
3355
+ callingAE: data.callingAE,
3356
+ calledAE: data.calledAE,
3357
+ source: data.source
3358
+ });
3333
3359
  const promise = this.handleFileReceived(worker, data, ctx);
3334
3360
  worker.trackFile(promise);
3335
3361
  });
3336
3362
  }
3337
- /** Moves a received file, opens it as DicomInstance, and emits FILE_RECEIVED. */
3363
+ /** Moves file to association dir, emits FILE_STORED, then parses instance. */
3338
3364
  async handleFileReceived(worker, data, ctx) {
3339
3365
  try {
3340
3366
  await this.moveAndEmitFile(worker, data, ctx);
@@ -3351,7 +3377,7 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3351
3377
  });
3352
3378
  }
3353
3379
  }
3354
- /** Inner handler: move file, parse DICOM, emit FILE_RECEIVED or error. */
3380
+ /** Inner handler: move file, emit FILE_STORED, parse DICOM, emit INSTANCE_RECEIVED. */
3355
3381
  async moveAndEmitFile(worker, data, ctx) {
3356
3382
  const srcPath = data.filePath;
3357
3383
  const destPath = path.join(ctx.associationDir, path.basename(srcPath));
@@ -3359,28 +3385,42 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
3359
3385
  const finalPath = moveResult.ok ? destPath : srcPath;
3360
3386
  const fileSize = await statFileSafe(finalPath);
3361
3387
  worker.recordFile(finalPath, fileSize);
3362
- const openResult = await DicomInstance.open(finalPath);
3363
- if (!openResult.ok) {
3364
- this.emit("error", {
3365
- error: openResult.error,
3366
- filePath: finalPath,
3367
- associationId: ctx.associationId,
3368
- associationDir: ctx.associationDir,
3369
- callingAE: data.callingAE,
3370
- calledAE: data.calledAE,
3371
- source: data.source
3372
- });
3373
- return;
3374
- }
3375
- this.emit("FILE_RECEIVED", {
3388
+ this.emit("FILE_STORED", {
3376
3389
  filePath: finalPath,
3377
3390
  fileSize,
3378
3391
  associationId: ctx.associationId,
3379
3392
  associationDir: ctx.associationDir,
3380
3393
  callingAE: data.callingAE,
3381
3394
  calledAE: data.calledAE,
3382
- source: data.source,
3383
- instance: openResult.value
3395
+ source: data.source
3396
+ });
3397
+ this.emitInstanceReceived(finalPath, fileSize, data, ctx);
3398
+ }
3399
+ /** Parses a DICOM file and emits INSTANCE_RECEIVED or error. */
3400
+ emitInstanceReceived(filePath, fileSize, data, ctx) {
3401
+ void DicomInstance.open(filePath).then((openResult) => {
3402
+ if (!openResult.ok) {
3403
+ this.emit("error", {
3404
+ error: openResult.error,
3405
+ filePath,
3406
+ associationId: ctx.associationId,
3407
+ associationDir: ctx.associationDir,
3408
+ callingAE: data.callingAE,
3409
+ calledAE: data.calledAE,
3410
+ source: data.source
3411
+ });
3412
+ return;
3413
+ }
3414
+ this.emit("INSTANCE_RECEIVED", {
3415
+ filePath,
3416
+ fileSize,
3417
+ associationId: ctx.associationId,
3418
+ associationDir: ctx.associationDir,
3419
+ callingAE: data.callingAE,
3420
+ calledAE: data.calledAE,
3421
+ source: data.source,
3422
+ instance: openResult.value
3423
+ });
3384
3424
  });
3385
3425
  }
3386
3426
  /** Returns worker to idle pool on association complete, emits summary. */