@ubercode/dcmtk 0.13.2 → 0.15.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.
package/dist/index.d.cts CHANGED
@@ -3,12 +3,12 @@ export { L as LineSource, P as ProcessLine, a as ResultValue, b as assertUnreach
3
3
  import { A as AETitle, D as DicomTag, a as DicomTagPath, P as Port, S as SOPClassUID, T as TransferSyntaxUID, b as DicomDataset } from './DicomInstance-BGXtON9T.cjs';
4
4
  export { B as Brand, C as ChangeSet, c as DicomFilePath, d as DicomInstance, e as DicomOpenOptions, W as WalkTagEntry, f as WalkTagsOptions, g as createAETitle, h as createDicomFilePath, i as createDicomTag, j as createDicomTagPath, k as createPort, l as createSOPClassUID, m as createTransferSyntaxUID, t as tag, w as walkTags } from './DicomInstance-BGXtON9T.cjs';
5
5
  import { z } from 'zod';
6
- 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, _ as PoolAssociationReceivedData, $ as PoolCStoreRequestData, a0 as PoolEchoRequestData, a1 as PoolRefusingAssociationData, 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 ReceiverAssociationFinalizedData, al as ReceiverAssociationReceivedData, am as ReceiverCStoreRequestData, an as ReceiverCannotStartListenerData, ao as ReceiverConfigErrorData, ap as ReceiverDatabaseReadyData, aq as ReceiverEchoRequestData, ar as ReceiverErrorData, as as ReceiverFileData, at as ReceiverFileReceivedData, au as ReceiverFileStoredData, av as ReceiverInstanceData, aw as ReceiverInstanceErrorData, ax as ReceiverListeningData, ay as RefusingAssociationData, az as STORESCP_FATAL_EVENTS, aA as STORESCP_PATTERNS, aB as StorageMode, aC as StorageModeValue, aD as StoreSCP, aE as StoreSCPEventMap, aF as StoreSCPOptions, aG as StoreSCPPreset, aH as StoreSCPPresetName, aI as StoredFileData, aJ as StorescpEvent, aK as StorescpEventValue, aL as StoringFileData, aM as SubdirectoryCreatedData, aN as SubdirectoryMode, aO as SubdirectoryModeValue, aP as TrackedFile, aQ as WLMSCPFS_FATAL_EVENTS, aR as WLMSCPFS_PATTERNS, aS as WlmAssociationAcknowledgedData, aT as WlmAssociationReceivedData, aU as WlmCFindRequestData, aV as WlmCannotStartListenerData, aW as WlmListeningData, aX as Wlmscpfs, aY as WlmscpfsEvent, aZ as WlmscpfsEventMap, a_ as WlmscpfsEventValue, a$ as WlmscpfsOptions } from './index-Bve4fMIh.cjs';
6
+ 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, _ as PoolAssociationReceivedData, $ as PoolCStoreRequestData, a0 as PoolEchoRequestData, a1 as PoolRefusingAssociationData, 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 ReceiverAssociationFinalizedData, al as ReceiverAssociationReceivedData, am as ReceiverCStoreRequestData, an as ReceiverCannotStartListenerData, ao as ReceiverConfigErrorData, ap as ReceiverDatabaseReadyData, aq as ReceiverEchoRequestData, ar as ReceiverErrorData, as as ReceiverFileData, at as ReceiverFileReceivedData, au as ReceiverFileStoredData, av as ReceiverInstanceData, aw as ReceiverInstanceErrorData, ax as ReceiverListeningData, ay as RefusingAssociationData, az as STORESCP_FATAL_EVENTS, aA as STORESCP_PATTERNS, aB as StorageMode, aC as StorageModeValue, aD as StoreSCP, aE as StoreSCPEventMap, aF as StoreSCPOptions, aG as StoreSCPPreset, aH as StoreSCPPresetName, aI as StoredFileData, aJ as StorescpEvent, aK as StorescpEventValue, aL as StoringFileData, aM as SubdirectoryCreatedData, aN as SubdirectoryMode, aO as SubdirectoryModeValue, aP as TrackedFile, aQ as WLMSCPFS_FATAL_EVENTS, aR as WLMSCPFS_PATTERNS, aS as WlmAssociationAcknowledgedData, aT as WlmAssociationReceivedData, aU as WlmCFindRequestData, aV as WlmCannotStartListenerData, aW as WlmListeningData, aX as Wlmscpfs, aY as WlmscpfsEvent, aZ as WlmscpfsEventMap, a_ as WlmscpfsEventValue, a$ as WlmscpfsOptions } from './index-CtqMUrjP.cjs';
7
7
  import { T as TagModification } from './dcmodify-Cf-RPHF3.cjs';
8
8
  export { b as DcmodifyOptions, c as DcmodifyResult, D as DicomJsonElement, a as DicomJsonModel, d as ToolBaseOptions, e as dcmodify, x as xmlToJson } from './dcmodify-Cf-RPHF3.cjs';
9
- export { DictionaryEntry, SOPClassName, SOP_CLASSES, TagSegment, VR, VRCategoryName, VRMetadata, VRValue, VR_CATEGORY, VR_CATEGORY_NAME, VR_META, getVRCategory, isBinaryVR, isNumericVR, isStringVR, lookupTag, lookupTagByKeyword, lookupTagByName, segmentsToModifyPath, segmentsToString, sopClassNameFromUID, tagPathToSegments } from './dicom.cjs';
10
9
  import { ProposedTransferSyntaxValue } from './tools.cjs';
11
- export { Cda2dcmOptions, Cda2dcmResult, ColorConversion, ColorConversionValue, Dcm2cdaOptions, Dcm2cdaResult, Dcm2jsonOptions, Dcm2jsonResult, Dcm2jsonSource, Dcm2pdfOptions, Dcm2pdfResult, Dcm2pnmOptions, Dcm2pnmOutputFormat, Dcm2pnmOutputFormatValue, Dcm2pnmResult, Dcm2xmlCharset, Dcm2xmlCharsetValue, Dcm2xmlOptions, Dcm2xmlResult, DcmcjpegOptions, DcmcjpegResult, DcmcjplsOptions, DcmcjplsResult, DcmconvOptions, DcmconvResult, DcmcrleOptions, DcmcrleResult, DcmdecapOptions, DcmdecapResult, DcmdjpegOptions, DcmdjpegResult, DcmdjplsOptions, DcmdjplsResult, DcmdrleOptions, DcmdrleResult, DcmdspfnOptions, DcmdspfnResult, DcmdumpFormat, DcmdumpFormatValue, DcmdumpOptions, DcmdumpResult, DcmencapOptions, DcmencapResult, DcmftestOptions, DcmftestResult, DcmgpdirOptions, DcmgpdirResult, Dcmj2pnmOptions, Dcmj2pnmOutputFormat, Dcmj2pnmOutputFormatValue, Dcmj2pnmResult, DcmmkcrvOptions, DcmmkcrvResult, DcmmkdirOptions, DcmmkdirResult, DcmmklutOptions, DcmmklutResult, Dcmp2pgmOptions, Dcmp2pgmResult, DcmprscuOptions, DcmprscuResult, DcmpschkOptions, DcmpschkResult, DcmpsmkOptions, DcmpsmkResult, DcmpsprtOptions, DcmpsprtResult, DcmqridxOptions, DcmqridxResult, DcmquantOptions, DcmquantResult, DcmscaleOptions, DcmscaleResult, DcmsendOptions, DcmsendResult, Dcod2lumOptions, Dcod2lumResult, DconvlumOptions, DconvlumResult, DrtdumpOptions, DrtdumpResult, Dsr2xmlOptions, Dsr2xmlResult, DsrdumpOptions, DsrdumpResult, Dump2dcmOptions, Dump2dcmResult, EchoscuOptions, EchoscuResult, FindscuOptions, FindscuResult, GetQueryModel, GetQueryModelValue, GetscuOptions, GetscuResult, Img2dcmInputFormat, Img2dcmInputFormatValue, Img2dcmOptions, Img2dcmResult, JplsColorConversion, JplsColorConversionValue, Json2dcmOptions, Json2dcmResult, LutType, LutTypeValue, MoveQueryModel, MoveQueryModelValue, MovescuOptions, MovescuResult, Pdf2dcmOptions, Pdf2dcmResult, ProposedTransferSyntax, QueryModel, QueryModelValue, Stl2dcmOptions, Stl2dcmResult, StorescuOptions, StorescuResult, TermscuOptions, TermscuResult, TransferSyntax, TransferSyntaxValue, Xml2dcmOptions, Xml2dcmResult, Xml2dsrOptions, Xml2dsrResult, cda2dcm, dcm2cda, dcm2json, dcm2pdf, dcm2pnm, dcm2xml, dcmcjpeg, dcmcjpls, dcmconv, dcmcrle, dcmdecap, dcmdjpeg, dcmdjpls, dcmdrle, dcmdspfn, dcmdump, dcmencap, dcmftest, dcmgpdir, dcmj2pnm, dcmmkcrv, dcmmkdir, dcmmklut, dcmp2pgm, dcmprscu, dcmpschk, dcmpsmk, dcmpsprt, dcmqridx, dcmquant, dcmscale, dcmsend, dcod2lum, dconvlum, drtdump, dsr2xml, dsrdump, dump2dcm, echoscu, findscu, getscu, img2dcm, json2dcm, movescu, pdf2dcm, stl2dcm, storescu, termscu, xml2dcm, xml2dsr } from './tools.cjs';
10
+ export { Cda2dcmOptions, Cda2dcmResult, ColorConversion, ColorConversionValue, Dcm2cdaOptions, Dcm2cdaResult, Dcm2jsonOptions, Dcm2jsonResult, Dcm2jsonSource, Dcm2pdfOptions, Dcm2pdfResult, Dcm2pnmOptions, Dcm2pnmOutputFormat, Dcm2pnmOutputFormatValue, Dcm2pnmResult, Dcm2xmlCharset, Dcm2xmlCharsetValue, Dcm2xmlOptions, Dcm2xmlResult, DcmcjpegOptions, DcmcjpegResult, DcmcjplsOptions, DcmcjplsResult, DcmconvOptions, DcmconvResult, DcmcrleOptions, DcmcrleResult, DcmdecapOptions, DcmdecapResult, DcmdjpegOptions, DcmdjpegResult, DcmdjplsOptions, DcmdjplsResult, DcmdrleOptions, DcmdrleResult, DcmdspfnOptions, DcmdspfnResult, DcmdumpFormat, DcmdumpFormatValue, DcmdumpOptions, DcmdumpResult, DcmencapOptions, DcmencapResult, DcmftestOptions, DcmftestResult, DcmgpdirOptions, DcmgpdirResult, Dcmj2pnmOptions, Dcmj2pnmOutputFormat, Dcmj2pnmOutputFormatValue, Dcmj2pnmResult, DcmmkcrvOptions, DcmmkcrvResult, DcmmkdirOptions, DcmmkdirResult, DcmmklutOptions, DcmmklutResult, Dcmp2pgmOptions, Dcmp2pgmResult, DcmprscuOptions, DcmprscuResult, DcmpschkOptions, DcmpschkResult, DcmpsmkOptions, DcmpsmkResult, DcmpsprtOptions, DcmpsprtResult, DcmqridxOptions, DcmqridxResult, DcmquantOptions, DcmquantResult, DcmscaleOptions, DcmscaleResult, DcmsendOptions, DcmsendResult, Dcod2lumOptions, Dcod2lumResult, DconvlumOptions, DconvlumResult, DrtdumpOptions, DrtdumpResult, Dsr2xmlOptions, Dsr2xmlResult, DsrdumpOptions, DsrdumpResult, Dump2dcmOptions, Dump2dcmResult, EchoscuOptions, EchoscuResult, FindscuOptions, FindscuResult, GetQueryModel, GetQueryModelValue, GetscuOptions, GetscuResult, Img2dcmInputFormat, Img2dcmInputFormatValue, Img2dcmOptions, Img2dcmResult, JplsColorConversion, JplsColorConversionValue, Json2dcmOptions, Json2dcmResult, LutType, LutTypeValue, MoveQueryModel, MoveQueryModelValue, MovescuOptions, MovescuResult, Pdf2dcmOptions, Pdf2dcmResult, ProposedTransferSyntax, QueryModel, QueryModelValue, Stl2dcmOptions, Stl2dcmResult, StorescuOptions, StorescuResult, TermscuOptions, TermscuResult, ToolExecutionError, TransferSyntax, TransferSyntaxValue, Xml2dcmOptions, Xml2dcmResult, Xml2dsrOptions, Xml2dsrResult, cda2dcm, dcm2cda, dcm2json, dcm2pdf, dcm2pnm, dcm2xml, dcmcjpeg, dcmcjpls, dcmconv, dcmcrle, dcmdecap, dcmdjpeg, dcmdjpls, dcmdrle, dcmdspfn, dcmdump, dcmencap, dcmftest, dcmgpdir, dcmj2pnm, dcmmkcrv, dcmmkdir, dcmmklut, dcmp2pgm, dcmprscu, dcmpschk, dcmpsmk, dcmpsprt, dcmqridx, dcmquant, dcmscale, dcmsend, dcod2lum, dconvlum, drtdump, dsr2xml, dsrdump, dump2dcm, echoscu, findscu, getscu, img2dcm, json2dcm, movescu, pdf2dcm, stl2dcm, storescu, termscu, xml2dcm, xml2dsr } from './tools.cjs';
11
+ export { DictionaryEntry, SOPClassName, SOP_CLASSES, TagSegment, VR, VRCategoryName, VRMetadata, VRValue, VR_CATEGORY, VR_CATEGORY_NAME, VR_META, getVRCategory, isBinaryVR, isNumericVR, isStringVR, lookupTag, lookupTagByKeyword, lookupTagByName, segmentsToModifyPath, segmentsToString, sopClassNameFromUID, tagPathToSegments } from './dicom.cjs';
12
12
  import { EventEmitter } from 'node:events';
13
13
  export { B as BatchOptions, a as BatchResult, R as RetryOptions, b as batch, r as retry } from './retry-CJ60nZxE.cjs';
14
14
  import 'node:net';
package/dist/index.d.ts CHANGED
@@ -3,12 +3,12 @@ export { L as LineSource, P as ProcessLine, a as ResultValue, b as assertUnreach
3
3
  import { A as AETitle, D as DicomTag, a as DicomTagPath, P as Port, S as SOPClassUID, T as TransferSyntaxUID, b as DicomDataset } from './DicomInstance-DGWB2mfD.js';
4
4
  export { B as Brand, C as ChangeSet, c as DicomFilePath, d as DicomInstance, e as DicomOpenOptions, W as WalkTagEntry, f as WalkTagsOptions, g as createAETitle, h as createDicomFilePath, i as createDicomTag, j as createDicomTagPath, k as createPort, l as createSOPClassUID, m as createTransferSyntaxUID, t as tag, w as walkTags } from './DicomInstance-DGWB2mfD.js';
5
5
  import { z } from 'zod';
6
- 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, _ as PoolAssociationReceivedData, $ as PoolCStoreRequestData, a0 as PoolEchoRequestData, a1 as PoolRefusingAssociationData, 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 ReceiverAssociationFinalizedData, al as ReceiverAssociationReceivedData, am as ReceiverCStoreRequestData, an as ReceiverCannotStartListenerData, ao as ReceiverConfigErrorData, ap as ReceiverDatabaseReadyData, aq as ReceiverEchoRequestData, ar as ReceiverErrorData, as as ReceiverFileData, at as ReceiverFileReceivedData, au as ReceiverFileStoredData, av as ReceiverInstanceData, aw as ReceiverInstanceErrorData, ax as ReceiverListeningData, ay as RefusingAssociationData, az as STORESCP_FATAL_EVENTS, aA as STORESCP_PATTERNS, aB as StorageMode, aC as StorageModeValue, aD as StoreSCP, aE as StoreSCPEventMap, aF as StoreSCPOptions, aG as StoreSCPPreset, aH as StoreSCPPresetName, aI as StoredFileData, aJ as StorescpEvent, aK as StorescpEventValue, aL as StoringFileData, aM as SubdirectoryCreatedData, aN as SubdirectoryMode, aO as SubdirectoryModeValue, aP as TrackedFile, aQ as WLMSCPFS_FATAL_EVENTS, aR as WLMSCPFS_PATTERNS, aS as WlmAssociationAcknowledgedData, aT as WlmAssociationReceivedData, aU as WlmCFindRequestData, aV as WlmCannotStartListenerData, aW as WlmListeningData, aX as Wlmscpfs, aY as WlmscpfsEvent, aZ as WlmscpfsEventMap, a_ as WlmscpfsEventValue, a$ as WlmscpfsOptions } from './index-CZiFWENk.js';
6
+ 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, _ as PoolAssociationReceivedData, $ as PoolCStoreRequestData, a0 as PoolEchoRequestData, a1 as PoolRefusingAssociationData, 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 ReceiverAssociationFinalizedData, al as ReceiverAssociationReceivedData, am as ReceiverCStoreRequestData, an as ReceiverCannotStartListenerData, ao as ReceiverConfigErrorData, ap as ReceiverDatabaseReadyData, aq as ReceiverEchoRequestData, ar as ReceiverErrorData, as as ReceiverFileData, at as ReceiverFileReceivedData, au as ReceiverFileStoredData, av as ReceiverInstanceData, aw as ReceiverInstanceErrorData, ax as ReceiverListeningData, ay as RefusingAssociationData, az as STORESCP_FATAL_EVENTS, aA as STORESCP_PATTERNS, aB as StorageMode, aC as StorageModeValue, aD as StoreSCP, aE as StoreSCPEventMap, aF as StoreSCPOptions, aG as StoreSCPPreset, aH as StoreSCPPresetName, aI as StoredFileData, aJ as StorescpEvent, aK as StorescpEventValue, aL as StoringFileData, aM as SubdirectoryCreatedData, aN as SubdirectoryMode, aO as SubdirectoryModeValue, aP as TrackedFile, aQ as WLMSCPFS_FATAL_EVENTS, aR as WLMSCPFS_PATTERNS, aS as WlmAssociationAcknowledgedData, aT as WlmAssociationReceivedData, aU as WlmCFindRequestData, aV as WlmCannotStartListenerData, aW as WlmListeningData, aX as Wlmscpfs, aY as WlmscpfsEvent, aZ as WlmscpfsEventMap, a_ as WlmscpfsEventValue, a$ as WlmscpfsOptions } from './index-D7nnTY1R.js';
7
7
  import { T as TagModification } from './dcmodify-CHvwChFu.js';
8
8
  export { b as DcmodifyOptions, c as DcmodifyResult, D as DicomJsonElement, a as DicomJsonModel, d as ToolBaseOptions, e as dcmodify, x as xmlToJson } from './dcmodify-CHvwChFu.js';
9
- export { DictionaryEntry, SOPClassName, SOP_CLASSES, TagSegment, VR, VRCategoryName, VRMetadata, VRValue, VR_CATEGORY, VR_CATEGORY_NAME, VR_META, getVRCategory, isBinaryVR, isNumericVR, isStringVR, lookupTag, lookupTagByKeyword, lookupTagByName, segmentsToModifyPath, segmentsToString, sopClassNameFromUID, tagPathToSegments } from './dicom.js';
10
9
  import { ProposedTransferSyntaxValue } from './tools.js';
11
- export { Cda2dcmOptions, Cda2dcmResult, ColorConversion, ColorConversionValue, Dcm2cdaOptions, Dcm2cdaResult, Dcm2jsonOptions, Dcm2jsonResult, Dcm2jsonSource, Dcm2pdfOptions, Dcm2pdfResult, Dcm2pnmOptions, Dcm2pnmOutputFormat, Dcm2pnmOutputFormatValue, Dcm2pnmResult, Dcm2xmlCharset, Dcm2xmlCharsetValue, Dcm2xmlOptions, Dcm2xmlResult, DcmcjpegOptions, DcmcjpegResult, DcmcjplsOptions, DcmcjplsResult, DcmconvOptions, DcmconvResult, DcmcrleOptions, DcmcrleResult, DcmdecapOptions, DcmdecapResult, DcmdjpegOptions, DcmdjpegResult, DcmdjplsOptions, DcmdjplsResult, DcmdrleOptions, DcmdrleResult, DcmdspfnOptions, DcmdspfnResult, DcmdumpFormat, DcmdumpFormatValue, DcmdumpOptions, DcmdumpResult, DcmencapOptions, DcmencapResult, DcmftestOptions, DcmftestResult, DcmgpdirOptions, DcmgpdirResult, Dcmj2pnmOptions, Dcmj2pnmOutputFormat, Dcmj2pnmOutputFormatValue, Dcmj2pnmResult, DcmmkcrvOptions, DcmmkcrvResult, DcmmkdirOptions, DcmmkdirResult, DcmmklutOptions, DcmmklutResult, Dcmp2pgmOptions, Dcmp2pgmResult, DcmprscuOptions, DcmprscuResult, DcmpschkOptions, DcmpschkResult, DcmpsmkOptions, DcmpsmkResult, DcmpsprtOptions, DcmpsprtResult, DcmqridxOptions, DcmqridxResult, DcmquantOptions, DcmquantResult, DcmscaleOptions, DcmscaleResult, DcmsendOptions, DcmsendResult, Dcod2lumOptions, Dcod2lumResult, DconvlumOptions, DconvlumResult, DrtdumpOptions, DrtdumpResult, Dsr2xmlOptions, Dsr2xmlResult, DsrdumpOptions, DsrdumpResult, Dump2dcmOptions, Dump2dcmResult, EchoscuOptions, EchoscuResult, FindscuOptions, FindscuResult, GetQueryModel, GetQueryModelValue, GetscuOptions, GetscuResult, Img2dcmInputFormat, Img2dcmInputFormatValue, Img2dcmOptions, Img2dcmResult, JplsColorConversion, JplsColorConversionValue, Json2dcmOptions, Json2dcmResult, LutType, LutTypeValue, MoveQueryModel, MoveQueryModelValue, MovescuOptions, MovescuResult, Pdf2dcmOptions, Pdf2dcmResult, ProposedTransferSyntax, QueryModel, QueryModelValue, Stl2dcmOptions, Stl2dcmResult, StorescuOptions, StorescuResult, TermscuOptions, TermscuResult, TransferSyntax, TransferSyntaxValue, Xml2dcmOptions, Xml2dcmResult, Xml2dsrOptions, Xml2dsrResult, cda2dcm, dcm2cda, dcm2json, dcm2pdf, dcm2pnm, dcm2xml, dcmcjpeg, dcmcjpls, dcmconv, dcmcrle, dcmdecap, dcmdjpeg, dcmdjpls, dcmdrle, dcmdspfn, dcmdump, dcmencap, dcmftest, dcmgpdir, dcmj2pnm, dcmmkcrv, dcmmkdir, dcmmklut, dcmp2pgm, dcmprscu, dcmpschk, dcmpsmk, dcmpsprt, dcmqridx, dcmquant, dcmscale, dcmsend, dcod2lum, dconvlum, drtdump, dsr2xml, dsrdump, dump2dcm, echoscu, findscu, getscu, img2dcm, json2dcm, movescu, pdf2dcm, stl2dcm, storescu, termscu, xml2dcm, xml2dsr } from './tools.js';
10
+ export { Cda2dcmOptions, Cda2dcmResult, ColorConversion, ColorConversionValue, Dcm2cdaOptions, Dcm2cdaResult, Dcm2jsonOptions, Dcm2jsonResult, Dcm2jsonSource, Dcm2pdfOptions, Dcm2pdfResult, Dcm2pnmOptions, Dcm2pnmOutputFormat, Dcm2pnmOutputFormatValue, Dcm2pnmResult, Dcm2xmlCharset, Dcm2xmlCharsetValue, Dcm2xmlOptions, Dcm2xmlResult, DcmcjpegOptions, DcmcjpegResult, DcmcjplsOptions, DcmcjplsResult, DcmconvOptions, DcmconvResult, DcmcrleOptions, DcmcrleResult, DcmdecapOptions, DcmdecapResult, DcmdjpegOptions, DcmdjpegResult, DcmdjplsOptions, DcmdjplsResult, DcmdrleOptions, DcmdrleResult, DcmdspfnOptions, DcmdspfnResult, DcmdumpFormat, DcmdumpFormatValue, DcmdumpOptions, DcmdumpResult, DcmencapOptions, DcmencapResult, DcmftestOptions, DcmftestResult, DcmgpdirOptions, DcmgpdirResult, Dcmj2pnmOptions, Dcmj2pnmOutputFormat, Dcmj2pnmOutputFormatValue, Dcmj2pnmResult, DcmmkcrvOptions, DcmmkcrvResult, DcmmkdirOptions, DcmmkdirResult, DcmmklutOptions, DcmmklutResult, Dcmp2pgmOptions, Dcmp2pgmResult, DcmprscuOptions, DcmprscuResult, DcmpschkOptions, DcmpschkResult, DcmpsmkOptions, DcmpsmkResult, DcmpsprtOptions, DcmpsprtResult, DcmqridxOptions, DcmqridxResult, DcmquantOptions, DcmquantResult, DcmscaleOptions, DcmscaleResult, DcmsendOptions, DcmsendResult, Dcod2lumOptions, Dcod2lumResult, DconvlumOptions, DconvlumResult, DrtdumpOptions, DrtdumpResult, Dsr2xmlOptions, Dsr2xmlResult, DsrdumpOptions, DsrdumpResult, Dump2dcmOptions, Dump2dcmResult, EchoscuOptions, EchoscuResult, FindscuOptions, FindscuResult, GetQueryModel, GetQueryModelValue, GetscuOptions, GetscuResult, Img2dcmInputFormat, Img2dcmInputFormatValue, Img2dcmOptions, Img2dcmResult, JplsColorConversion, JplsColorConversionValue, Json2dcmOptions, Json2dcmResult, LutType, LutTypeValue, MoveQueryModel, MoveQueryModelValue, MovescuOptions, MovescuResult, Pdf2dcmOptions, Pdf2dcmResult, ProposedTransferSyntax, QueryModel, QueryModelValue, Stl2dcmOptions, Stl2dcmResult, StorescuOptions, StorescuResult, TermscuOptions, TermscuResult, ToolExecutionError, TransferSyntax, TransferSyntaxValue, Xml2dcmOptions, Xml2dcmResult, Xml2dsrOptions, Xml2dsrResult, cda2dcm, dcm2cda, dcm2json, dcm2pdf, dcm2pnm, dcm2xml, dcmcjpeg, dcmcjpls, dcmconv, dcmcrle, dcmdecap, dcmdjpeg, dcmdjpls, dcmdrle, dcmdspfn, dcmdump, dcmencap, dcmftest, dcmgpdir, dcmj2pnm, dcmmkcrv, dcmmkdir, dcmmklut, dcmp2pgm, dcmprscu, dcmpschk, dcmpsmk, dcmpsprt, dcmqridx, dcmquant, dcmscale, dcmsend, dcod2lum, dconvlum, drtdump, dsr2xml, dsrdump, dump2dcm, echoscu, findscu, getscu, img2dcm, json2dcm, movescu, pdf2dcm, stl2dcm, storescu, termscu, xml2dcm, xml2dsr } from './tools.js';
11
+ export { DictionaryEntry, SOPClassName, SOP_CLASSES, TagSegment, VR, VRCategoryName, VRMetadata, VRValue, VR_CATEGORY, VR_CATEGORY_NAME, VR_META, getVRCategory, isBinaryVR, isNumericVR, isStringVR, lookupTag, lookupTagByKeyword, lookupTagByName, segmentsToModifyPath, segmentsToString, sopClassNameFromUID, tagPathToSegments } from './dicom.js';
12
12
  import { EventEmitter } from 'node:events';
13
13
  export { B as BatchOptions, a as BatchResult, R as RetryOptions, b as batch, r as retry } from './retry-Aryrk1uP.js';
14
14
  import 'node:net';
package/dist/index.js CHANGED
@@ -688,6 +688,51 @@ var LineParser = class extends EventEmitter {
688
688
  }
689
689
  };
690
690
 
691
+ // src/tools/_toolError.ts
692
+ var MAX_ARGS_LENGTH = 200;
693
+ var MAX_STDERR_LENGTH = 500;
694
+ function truncate(value, maxLength) {
695
+ if (value.length <= maxLength) {
696
+ return value;
697
+ }
698
+ return `${value.substring(0, maxLength)}...`;
699
+ }
700
+ var ToolExecutionError = class extends Error {
701
+ constructor(message, details) {
702
+ super(message);
703
+ __publicField(this, "stdout");
704
+ __publicField(this, "stderr");
705
+ __publicField(this, "exitCode");
706
+ this.name = "ToolExecutionError";
707
+ this.stdout = details.stdout;
708
+ this.stderr = details.stderr;
709
+ this.exitCode = details.exitCode;
710
+ }
711
+ };
712
+ function createToolError(toolName, args, exitCode, stderr8, stdout = "") {
713
+ const argsStr = truncate(args.join(" "), MAX_ARGS_LENGTH);
714
+ const stderrStr = truncate(stderr8.trim(), MAX_STDERR_LENGTH);
715
+ const parts = [`${toolName} failed (exit code ${String(exitCode)})`];
716
+ if (argsStr.length > 0) {
717
+ parts.push(`args: ${argsStr}`);
718
+ }
719
+ if (stderrStr.length > 0) {
720
+ parts.push(`stderr: ${stderrStr}`);
721
+ }
722
+ return new ToolExecutionError(parts.join(" | "), { stdout, stderr: stderr8, exitCode });
723
+ }
724
+ function createValidationError(toolName, zodError) {
725
+ const parts = [];
726
+ for (let i = 0; i < zodError.issues.length; i++) {
727
+ const issue = zodError.issues[i];
728
+ if (issue === void 0) continue;
729
+ const path2 = issue.path.length > 0 ? issue.path.map(String).join(".") : "(root)";
730
+ parts.push(`${path2}: ${issue.message}`);
731
+ }
732
+ const detail = parts.length > 0 ? parts.join("; ") : "unknown validation error";
733
+ return new Error(`${toolName}: invalid options \u2014 ${detail}`);
734
+ }
735
+
691
736
  // src/dicom/vr.ts
692
737
  var VR = {
693
738
  /** Application Entity — 16 bytes max, leading/trailing spaces significant */
@@ -31111,39 +31156,6 @@ function resolveBinary(toolName) {
31111
31156
  return ok(join(pathResult.value, binaryName2));
31112
31157
  }
31113
31158
 
31114
- // src/tools/_toolError.ts
31115
- var MAX_ARGS_LENGTH = 200;
31116
- var MAX_STDERR_LENGTH = 500;
31117
- function truncate(value, maxLength) {
31118
- if (value.length <= maxLength) {
31119
- return value;
31120
- }
31121
- return `${value.substring(0, maxLength)}...`;
31122
- }
31123
- function createToolError(toolName, args, exitCode, stderr8) {
31124
- const argsStr = truncate(args.join(" "), MAX_ARGS_LENGTH);
31125
- const stderrStr = truncate(stderr8.trim(), MAX_STDERR_LENGTH);
31126
- const parts = [`${toolName} failed (exit code ${String(exitCode)})`];
31127
- if (argsStr.length > 0) {
31128
- parts.push(`args: ${argsStr}`);
31129
- }
31130
- if (stderrStr.length > 0) {
31131
- parts.push(`stderr: ${stderrStr}`);
31132
- }
31133
- return new Error(parts.join(" | "));
31134
- }
31135
- function createValidationError(toolName, zodError) {
31136
- const parts = [];
31137
- for (let i = 0; i < zodError.issues.length; i++) {
31138
- const issue = zodError.issues[i];
31139
- if (issue === void 0) continue;
31140
- const path2 = issue.path.length > 0 ? issue.path.map(String).join(".") : "(root)";
31141
- parts.push(`${path2}: ${issue.message}`);
31142
- }
31143
- const detail = parts.length > 0 ? parts.join("; ") : "unknown validation error";
31144
- return new Error(`${toolName}: invalid options \u2014 ${detail}`);
31145
- }
31146
-
31147
31159
  // src/tools/dcm2xml.ts
31148
31160
  var Dcm2xmlCharset = {
31149
31161
  /** Use UTF-8 encoding (default). */
@@ -31527,15 +31539,17 @@ async function dcm2json(inputPath, options) {
31527
31539
  }
31528
31540
  const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
31529
31541
  const signal = options?.signal;
31542
+ const startTime = Date.now();
31543
+ const remaining = () => Math.max(1e3, timeoutMs - (Date.now() - startTime));
31530
31544
  const verbosity = options?.verbosity;
31531
31545
  if (options?.directOnly === true) {
31532
- return tryDirectPath(inputPath, timeoutMs, signal, verbosity);
31546
+ return tryDirectPath(inputPath, remaining(), signal, verbosity);
31533
31547
  }
31534
- const xmlResult = await tryXmlPath(inputPath, timeoutMs, signal, buildXmlOpts(options));
31548
+ const xmlResult = await tryXmlPath(inputPath, remaining(), signal, buildXmlOpts(options));
31535
31549
  if (xmlResult.ok) {
31536
31550
  return xmlResult;
31537
31551
  }
31538
- return tryDirectPath(inputPath, timeoutMs, signal, verbosity);
31552
+ return tryDirectPath(inputPath, remaining(), signal, verbosity);
31539
31553
  }
31540
31554
  var DcmdumpFormat = {
31541
31555
  /** Print standard DCMTK format. */
@@ -33263,7 +33277,7 @@ async function dcmsend(options) {
33263
33277
  return err(result.error);
33264
33278
  }
33265
33279
  if (result.value.exitCode !== 0) {
33266
- return err(createToolError("dcmsend", args, result.value.exitCode, result.value.stderr));
33280
+ return err(createToolError("dcmsend", args, result.value.exitCode, result.value.stderr, result.value.stdout));
33267
33281
  }
33268
33282
  return ok({ success: true, stdout: result.value.stdout, stderr: result.value.stderr });
33269
33283
  }
@@ -33418,10 +33432,10 @@ async function storescu(options) {
33418
33432
  return err(result.error);
33419
33433
  }
33420
33434
  if (result.value.exitCode !== 0) {
33421
- return err(createToolError("storescu", args, result.value.exitCode, result.value.stderr));
33435
+ return err(createToolError("storescu", args, result.value.exitCode, result.value.stderr, result.value.stdout));
33422
33436
  }
33423
33437
  if (DIMSE_ERROR_PATTERN.test(result.value.stderr)) {
33424
- return err(createToolError("storescu", args, 0, result.value.stderr));
33438
+ return err(createToolError("storescu", args, 0, result.value.stderr, result.value.stdout));
33425
33439
  }
33426
33440
  return ok({ success: true, stdout: result.value.stdout, stderr: result.value.stderr });
33427
33441
  }
@@ -36492,7 +36506,7 @@ var Worker = class {
36492
36506
  this.port = port;
36493
36507
  this.tempDir = tempDir;
36494
36508
  }
36495
- /** Current worker state. */
36509
+ /** Current worker state: idle (ready), busy (handling association), finalizing (draining). */
36496
36510
  get state() {
36497
36511
  return this._state;
36498
36512
  }
@@ -36524,6 +36538,10 @@ var Worker = class {
36524
36538
  this._instancesReceived = 0;
36525
36539
  this._instanceErrors = 0;
36526
36540
  }
36541
+ /** Marks the worker as finalizing — still has valid context but cannot accept new connections. */
36542
+ markFinalizing() {
36543
+ this._state = "finalizing";
36544
+ }
36527
36545
  /**
36528
36546
  * Returns the worker to idle. Context is intentionally preserved so that
36529
36547
  * late FILE_RECEIVED events (arriving in a subsequent pipe chunk after
@@ -36706,6 +36724,7 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
36706
36724
  this.options.signal.removeEventListener("abort", this.abortHandler);
36707
36725
  }
36708
36726
  await this.closeTcpProxy();
36727
+ await this.drainAllWorkers();
36709
36728
  const stopPromises = [];
36710
36729
  for (const worker of this.workers.values()) {
36711
36730
  stopPromises.push(this.stopWorker(worker));
@@ -36874,6 +36893,18 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
36874
36893
  this.tcpServer.close(() => resolve());
36875
36894
  });
36876
36895
  }
36896
+ /** Drains in-flight file and instance work on all non-idle workers, with a 5s safety timeout. */
36897
+ async drainAllWorkers() {
36898
+ const drainPromises = [];
36899
+ for (const worker of this.workers.values()) {
36900
+ if (worker.state !== "idle") {
36901
+ drainPromises.push(worker.drainPendingFiles());
36902
+ drainPromises.push(worker.drainInstancePending());
36903
+ }
36904
+ }
36905
+ if (drainPromises.length === 0) return;
36906
+ await Promise.race([Promise.all(drainPromises), setTimeout$1(5e3)]);
36907
+ }
36877
36908
  // -----------------------------------------------------------------------
36878
36909
  // Connection routing
36879
36910
  // -----------------------------------------------------------------------
@@ -36902,7 +36933,9 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
36902
36933
  };
36903
36934
  worker.beginAssociation(ctx);
36904
36935
  this.pipeConnection(worker, remoteSocket);
36905
- void this.replenishPool();
36936
+ void this.replenishPool().catch((e) => {
36937
+ this.emit("error", { error: e instanceof Error ? e : new Error(String(e)) });
36938
+ });
36906
36939
  }
36907
36940
  /** Finds an idle worker, retrying up to connectionTimeoutMs. */
36908
36941
  async findIdleWorker() {
@@ -37141,6 +37174,7 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
37141
37174
  /** Returns worker to idle pool on association complete, emits summary. */
37142
37175
  wireAssociationComplete(worker) {
37143
37176
  worker.dcmrecv.onAssociationComplete((data) => {
37177
+ worker.markFinalizing();
37144
37178
  setImmediate(() => {
37145
37179
  void this.finalizeAssociation(worker, data);
37146
37180
  });
@@ -37294,8 +37328,14 @@ var SenderEngine = class {
37294
37328
  // Bucket state (bucket mode only)
37295
37329
  __publicField(this, "currentBucket", []);
37296
37330
  __publicField(this, "bucketTimer");
37331
+ // Abort wiring: stopController fires on stop(); combinedSignal also fires
37332
+ // when the externally provided config.signal aborts. Passed into the
37333
+ // executor and into delayInterruptible so stop() unblocks promptly.
37334
+ __publicField(this, "stopController", new AbortController());
37335
+ __publicField(this, "combinedSignal");
37297
37336
  this.config = config;
37298
37337
  this.effectiveMaxAssociations = config.configuredMaxAssociations;
37338
+ this.combinedSignal = combineSignals(this.stopController.signal, config.signal);
37299
37339
  }
37300
37340
  // -----------------------------------------------------------------------
37301
37341
  // Public API
@@ -37321,6 +37361,7 @@ var SenderEngine = class {
37321
37361
  async stop() {
37322
37362
  if (this.isStopped) return;
37323
37363
  this.isStopped = true;
37364
+ this.stopController.abort();
37324
37365
  this.clearBucketTimer();
37325
37366
  this.rejectBucket(`${this.config.senderName}: sender stopped`);
37326
37367
  this.rejectQueue(`${this.config.senderName}: sender stopped`);
@@ -37437,18 +37478,48 @@ var SenderEngine = class {
37437
37478
  }
37438
37479
  };
37439
37480
  }
37440
- /** Flushes the current bucket: combines all files, dispatches as one send. */
37481
+ /**
37482
+ * Flushes the current bucket. Entries with the same bucketParamsKey merge
37483
+ * into one underlying call; differing keys split into separate calls,
37484
+ * preserving first-occurrence order. Each group emits its own
37485
+ * BUCKET_FLUSHED. If the number of groups exceeds available capacity,
37486
+ * the surplus is queued and drains as capacity frees.
37487
+ */
37441
37488
  flushBucketInternal(reason) {
37442
37489
  if (this.currentBucket.length === 0) return;
37443
37490
  const entries = [...this.currentBucket];
37444
37491
  this.currentBucket = [];
37445
- const bucketEntry = this.mergeBucketEntries(entries);
37446
- this.config.emitters.emitBucketFlushed({ fileCount: bucketEntry.files.length, reason });
37447
- if (this.activeAssociations < this.effectiveMaxAssociations) {
37448
- void this.executeEntry(bucketEntry);
37449
- } else {
37450
- this.queue.push(bucketEntry);
37492
+ const groups = this.groupBucketByParams(entries);
37493
+ for (const group of groups) {
37494
+ const bucketEntry = this.mergeBucketEntries(group);
37495
+ this.config.emitters.emitBucketFlushed({ fileCount: bucketEntry.files.length, reason });
37496
+ if (this.activeAssociations < this.effectiveMaxAssociations) {
37497
+ void this.executeEntry(bucketEntry);
37498
+ } else {
37499
+ this.queue.push(bucketEntry);
37500
+ }
37501
+ }
37502
+ }
37503
+ /**
37504
+ * Groups bucket entries by bucketParamsKey while preserving first-occurrence
37505
+ * order. Without a key function, returns a single group containing every
37506
+ * entry (current behavior for callers that don't vary binaryParams).
37507
+ */
37508
+ groupBucketByParams(entries) {
37509
+ const keyFn = this.config.bucketParamsKey;
37510
+ if (keyFn === void 0) return [entries.slice()];
37511
+ const groups = /* @__PURE__ */ new Map();
37512
+ for (let i = 0; i < entries.length; i++) {
37513
+ const entry = entries[i];
37514
+ const key = keyFn(entry.binaryParams);
37515
+ let group = groups.get(key);
37516
+ if (group === void 0) {
37517
+ group = [];
37518
+ groups.set(key, group);
37519
+ }
37520
+ group.push(entry);
37451
37521
  }
37522
+ return Array.from(groups.values());
37452
37523
  }
37453
37524
  /** Resets the bucket flush timer. */
37454
37525
  resetBucketTimer() {
@@ -37490,25 +37561,33 @@ var SenderEngine = class {
37490
37561
  /** Attempts the binary call up to maxAttempts times. Returns undefined on success. */
37491
37562
  async attemptSend(entry, maxAttempts, startMs) {
37492
37563
  let lastError;
37493
- const lastOutput = { stdout: "", stderr: "" };
37564
+ let lastOutput = { stdout: "", stderr: "" };
37494
37565
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
37495
37566
  if (this.isStopped) {
37496
- this.activeAssociations--;
37497
- entry.resolve(err(new Error(`${this.config.senderName}: sender stopped`)));
37498
- return void 0;
37567
+ return this.resolveStopped(entry);
37499
37568
  }
37500
- const result = await this.config.executor(entry.files, entry.timeoutMs, entry.binaryParams, this.config.signal);
37501
- if (result.ok) {
37502
- this.handleSendSuccess(entry, startMs, result.value);
37569
+ const outcome = await this.config.executor(entry.files, entry.timeoutMs, entry.binaryParams, this.combinedSignal);
37570
+ lastOutput = { stdout: outcome.stdout, stderr: outcome.stderr };
37571
+ if (outcome.error === void 0) {
37572
+ this.handleSendSuccess(entry, startMs, lastOutput);
37503
37573
  return void 0;
37504
37574
  }
37505
- lastError = result.error;
37575
+ if (this.isStopped) {
37576
+ return this.resolveStopped(entry);
37577
+ }
37578
+ lastError = outcome.error;
37506
37579
  if (attempt < maxAttempts - 1) {
37507
- await delay2(this.config.retryDelayMs * (attempt + 1));
37580
+ await delayInterruptible(this.config.retryDelayMs * (attempt + 1), this.combinedSignal);
37508
37581
  }
37509
37582
  }
37510
37583
  return { error: lastError ?? new Error(`${this.config.senderName}: send failed`), output: lastOutput };
37511
37584
  }
37585
+ /** Resolves the entry as stopped and decrements activeAssociations. Used from attemptSend. */
37586
+ resolveStopped(entry) {
37587
+ this.activeAssociations--;
37588
+ entry.resolve(err(new Error(`${this.config.senderName}: sender stopped`)));
37589
+ return void 0;
37590
+ }
37512
37591
  /** Handles a successful send: updates state, emits event, resolves promise. */
37513
37592
  handleSendSuccess(entry, startMs, output) {
37514
37593
  this.activeAssociations--;
@@ -37614,11 +37693,41 @@ var SenderEngine = class {
37614
37693
  });
37615
37694
  }
37616
37695
  };
37617
- function delay2(ms) {
37696
+ function delayInterruptible(ms, signal) {
37697
+ if (signal.aborted) return Promise.resolve();
37618
37698
  return new Promise((resolve) => {
37619
- setTimeout(resolve, ms);
37699
+ const onAbort = () => {
37700
+ clearTimeout(timer);
37701
+ resolve();
37702
+ };
37703
+ const timer = setTimeout(() => {
37704
+ signal.removeEventListener("abort", onAbort);
37705
+ resolve();
37706
+ }, ms);
37707
+ signal.addEventListener("abort", onAbort, { once: true });
37620
37708
  });
37621
37709
  }
37710
+ function combineSignals(primary, external) {
37711
+ if (external === void 0) return primary;
37712
+ if (primary.aborted) return primary;
37713
+ if (external.aborted) {
37714
+ const c = new AbortController();
37715
+ c.abort(external.reason);
37716
+ return c.signal;
37717
+ }
37718
+ const merged = new AbortController();
37719
+ const onPrimary = () => {
37720
+ merged.abort(primary.reason);
37721
+ external.removeEventListener("abort", onExternal);
37722
+ };
37723
+ const onExternal = () => {
37724
+ merged.abort(external.reason);
37725
+ primary.removeEventListener("abort", onPrimary);
37726
+ };
37727
+ primary.addEventListener("abort", onPrimary, { once: true });
37728
+ external.addEventListener("abort", onExternal, { once: true });
37729
+ return merged.signal;
37730
+ }
37622
37731
 
37623
37732
  // src/senders/DicomSender.ts
37624
37733
  var DEFAULT_MAX_ASSOCIATIONS = 4;
@@ -37653,6 +37762,9 @@ var DicomSenderOptionsSchema = z.object({
37653
37762
  required: z.boolean().optional(),
37654
37763
  signal: z.instanceof(AbortSignal).optional()
37655
37764
  }).strict();
37765
+ function storescuBucketKey(p) {
37766
+ return JSON.stringify(p);
37767
+ }
37656
37768
  function createStorescuExecutor(options) {
37657
37769
  return async (files, timeoutMs, params, signal) => {
37658
37770
  const result = await storescu({
@@ -37674,8 +37786,13 @@ function createStorescuExecutor(options) {
37674
37786
  timeoutMs,
37675
37787
  signal
37676
37788
  });
37677
- if (!result.ok) return err(result.error);
37678
- return ok({ stdout: result.value.stdout, stderr: result.value.stderr });
37789
+ if (!result.ok) {
37790
+ const e = result.error;
37791
+ const stdout = e instanceof ToolExecutionError ? e.stdout : "";
37792
+ const stderr8 = e instanceof ToolExecutionError ? e.stderr : "";
37793
+ return { stdout, stderr: stderr8, error: e };
37794
+ }
37795
+ return { stdout: result.value.stdout, stderr: result.value.stderr };
37679
37796
  };
37680
37797
  }
37681
37798
  function resolveConfig2(options) {
@@ -37732,6 +37849,7 @@ var DicomSender = class _DicomSender extends EventEmitter {
37732
37849
  executor: createStorescuExecutor(options),
37733
37850
  signal: options.signal,
37734
37851
  senderName: "DicomSender",
37852
+ bucketParamsKey: storescuBucketKey,
37735
37853
  emitters: {
37736
37854
  emitSendComplete: (data) => {
37737
37855
  senderRef.current.emit("SEND_COMPLETE", data);
@@ -37900,6 +38018,9 @@ var DicomSendOptionsSchema = z.object({
37900
38018
  noUidChecks: z.boolean().optional(),
37901
38019
  signal: z.instanceof(AbortSignal).optional()
37902
38020
  }).strict();
38021
+ function dcmsendBucketKey(p) {
38022
+ return JSON.stringify(p);
38023
+ }
37903
38024
  function createDcmsendExecutor(options) {
37904
38025
  return async (files, timeoutMs, params, signal) => {
37905
38026
  const result = await dcmsend({
@@ -37923,8 +38044,13 @@ function createDcmsendExecutor(options) {
37923
38044
  timeoutMs,
37924
38045
  signal
37925
38046
  });
37926
- if (!result.ok) return err(result.error);
37927
- return ok({ stdout: result.value.stdout, stderr: result.value.stderr });
38047
+ if (!result.ok) {
38048
+ const e = result.error;
38049
+ const stdout = e instanceof ToolExecutionError ? e.stdout : "";
38050
+ const stderr8 = e instanceof ToolExecutionError ? e.stderr : "";
38051
+ return { stdout, stderr: stderr8, error: e };
38052
+ }
38053
+ return { stdout: result.value.stdout, stderr: result.value.stderr };
37928
38054
  };
37929
38055
  }
37930
38056
  function resolveConfig3(options) {
@@ -37981,6 +38107,7 @@ var DicomSend = class _DicomSend extends EventEmitter {
37981
38107
  executor: createDcmsendExecutor(options),
37982
38108
  signal: options.signal,
37983
38109
  senderName: "DicomSend",
38110
+ bucketParamsKey: dcmsendBucketKey,
37984
38111
  emitters: {
37985
38112
  emitSendComplete: (data) => {
37986
38113
  senderRef.current.emit("SEND_COMPLETE", data);
@@ -38668,7 +38795,7 @@ function computeThroughput(succeeded, totalBytes, durationMs) {
38668
38795
  bytesPerSec: durationSec > 0 ? totalBytes / durationSec : 0
38669
38796
  };
38670
38797
  }
38671
- function delay3(ms) {
38798
+ function delay2(ms) {
38672
38799
  return new Promise((resolve) => {
38673
38800
  setTimeout(resolve, ms);
38674
38801
  });
@@ -38815,7 +38942,7 @@ var DicomHammer = class _DicomHammer extends EventEmitter {
38815
38942
  /** Sends a single file, with optional delay. */
38816
38943
  async sendOneFile(file) {
38817
38944
  if (this.opts.delayMs > 0) {
38818
- await delay3(this.opts.delayMs);
38945
+ await delay2(this.opts.delayMs);
38819
38946
  }
38820
38947
  const result = await dcmsend({
38821
38948
  host: this.opts.host,
@@ -38911,6 +39038,6 @@ var DicomHammer = class _DicomHammer extends EventEmitter {
38911
39038
  }
38912
39039
  };
38913
39040
 
38914
- export { AETitleSchema, AssociationTracker, ChangeSet, ColorConversion, DCMPRSCP_FATAL_EVENTS, DCMPRSCP_PATTERNS, DCMPSRCV_FATAL_EVENTS, DCMPSRCV_PATTERNS, DCMQRSCP_FATAL_EVENTS, DCMQRSCP_PATTERNS, DCMRECV_FATAL_EVENTS, DCMRECV_PATTERNS, DEFAULT_BLOCK_TIMEOUT_MS, DEFAULT_DICOM_PORT, DEFAULT_DRAIN_TIMEOUT_MS, DEFAULT_PARSE_CONCURRENCY, DEFAULT_START_TIMEOUT_MS, DEFAULT_TIMEOUT_MS, Dcm2pnmOutputFormat, Dcm2xmlCharset, DcmQRSCP, DcmdumpFormat, Dcmj2pnmOutputFormat, DcmprsCP, DcmprscpEvent, Dcmpsrcv, DcmpsrcvEvent, DcmqrscpEvent, Dcmrecv, DcmrecvEvent, DcmtkProcess, DicomDataset, DicomHammer, DicomInstance, DicomReceiver, DicomSend, DicomSender, DicomTagPathSchema, DicomTagSchema, FilenameMode, GetQueryModel, HammerPhase, Img2dcmInputFormat, JplsColorConversion, LineParser, LutType, MAX_BLOCK_LINES, MAX_CHANGESET_OPERATIONS, MAX_EVENT_PATTERNS, MAX_TRAVERSAL_DEPTH, MoveQueryModel, PDU_SIZE, PacsClient, PortSchema, PreferredTransferSyntax, ProcessState, ProposedTransferSyntax, QueryLevel, QueryModel, REQUIRED_BINARIES, RetrieveMode, SOP_CLASSES, STORESCP_FATAL_EVENTS, STORESCP_PATTERNS, SenderHealth, SenderMode, StorageMode, StoreSCP, StoreSCPPreset, StorescpEvent, SubdirectoryMode, TransferSyntax, UIDSchema, UNIX_SEARCH_PATHS, VR, VR_CATEGORY, VR_CATEGORY_NAME, VR_META, WINDOWS_SEARCH_PATHS, WLMSCPFS_FATAL_EVENTS, WLMSCPFS_PATTERNS, Wlmscpfs, WlmscpfsEvent, assertUnreachable, batch, cda2dcm, clearDcmtkPathCache, createAETitle, createDicomFilePath, createDicomTag, createDicomTagPath, createPort, createSOPClassUID, createTransferSyntaxUID, dcm2cda, dcm2json, dcm2pdf, dcm2pnm, dcm2xml, dcmcjpeg, dcmcjpls, dcmconv, dcmcrle, dcmdecap, dcmdjpeg, dcmdjpls, dcmdrle, dcmdspfn, dcmdump, dcmencap, dcmftest, dcmgpdir, dcmj2pnm, dcmmkcrv, dcmmkdir, dcmmklut, dcmodify, dcmp2pgm, dcmprscu, dcmpschk, dcmpsmk, dcmpsprt, dcmqridx, dcmquant, dcmscale, dcmsend, dcod2lum, dconvlum, drtdump, dsr2xml, dsrdump, dump2dcm, echoscu, err, execCommand, findDcmtkPath, findscu, getVRCategory, getscu, img2dcm, isBinaryVR, isNumericVR, isStringVR, json2dcm, lookupTag, lookupTagByKeyword, lookupTagByName, mapResult, movescu, ok, parseAETitle, parseDicomTag, parseDicomTagPath, parsePort, parseSOPClassUID, parseTransferSyntaxUID, pdf2dcm, retry, segmentsToModifyPath, segmentsToString, sopClassNameFromUID, spawnCommand, stl2dcm, storescu, tag, tagPathToSegments, termscu, walkTags, xml2dcm, xml2dsr, xmlToJson };
39041
+ export { AETitleSchema, AssociationTracker, ChangeSet, ColorConversion, DCMPRSCP_FATAL_EVENTS, DCMPRSCP_PATTERNS, DCMPSRCV_FATAL_EVENTS, DCMPSRCV_PATTERNS, DCMQRSCP_FATAL_EVENTS, DCMQRSCP_PATTERNS, DCMRECV_FATAL_EVENTS, DCMRECV_PATTERNS, DEFAULT_BLOCK_TIMEOUT_MS, DEFAULT_DICOM_PORT, DEFAULT_DRAIN_TIMEOUT_MS, DEFAULT_PARSE_CONCURRENCY, DEFAULT_START_TIMEOUT_MS, DEFAULT_TIMEOUT_MS, Dcm2pnmOutputFormat, Dcm2xmlCharset, DcmQRSCP, DcmdumpFormat, Dcmj2pnmOutputFormat, DcmprsCP, DcmprscpEvent, Dcmpsrcv, DcmpsrcvEvent, DcmqrscpEvent, Dcmrecv, DcmrecvEvent, DcmtkProcess, DicomDataset, DicomHammer, DicomInstance, DicomReceiver, DicomSend, DicomSender, DicomTagPathSchema, DicomTagSchema, FilenameMode, GetQueryModel, HammerPhase, Img2dcmInputFormat, JplsColorConversion, LineParser, LutType, MAX_BLOCK_LINES, MAX_CHANGESET_OPERATIONS, MAX_EVENT_PATTERNS, MAX_TRAVERSAL_DEPTH, MoveQueryModel, PDU_SIZE, PacsClient, PortSchema, PreferredTransferSyntax, ProcessState, ProposedTransferSyntax, QueryLevel, QueryModel, REQUIRED_BINARIES, RetrieveMode, SOP_CLASSES, STORESCP_FATAL_EVENTS, STORESCP_PATTERNS, SenderHealth, SenderMode, StorageMode, StoreSCP, StoreSCPPreset, StorescpEvent, SubdirectoryMode, ToolExecutionError, TransferSyntax, UIDSchema, UNIX_SEARCH_PATHS, VR, VR_CATEGORY, VR_CATEGORY_NAME, VR_META, WINDOWS_SEARCH_PATHS, WLMSCPFS_FATAL_EVENTS, WLMSCPFS_PATTERNS, Wlmscpfs, WlmscpfsEvent, assertUnreachable, batch, cda2dcm, clearDcmtkPathCache, createAETitle, createDicomFilePath, createDicomTag, createDicomTagPath, createPort, createSOPClassUID, createTransferSyntaxUID, dcm2cda, dcm2json, dcm2pdf, dcm2pnm, dcm2xml, dcmcjpeg, dcmcjpls, dcmconv, dcmcrle, dcmdecap, dcmdjpeg, dcmdjpls, dcmdrle, dcmdspfn, dcmdump, dcmencap, dcmftest, dcmgpdir, dcmj2pnm, dcmmkcrv, dcmmkdir, dcmmklut, dcmodify, dcmp2pgm, dcmprscu, dcmpschk, dcmpsmk, dcmpsprt, dcmqridx, dcmquant, dcmscale, dcmsend, dcod2lum, dconvlum, drtdump, dsr2xml, dsrdump, dump2dcm, echoscu, err, execCommand, findDcmtkPath, findscu, getVRCategory, getscu, img2dcm, isBinaryVR, isNumericVR, isStringVR, json2dcm, lookupTag, lookupTagByKeyword, lookupTagByName, mapResult, movescu, ok, parseAETitle, parseDicomTag, parseDicomTagPath, parsePort, parseSOPClassUID, parseTransferSyntaxUID, pdf2dcm, retry, segmentsToModifyPath, segmentsToString, sopClassNameFromUID, spawnCommand, stl2dcm, storescu, tag, tagPathToSegments, termscu, walkTags, xml2dcm, xml2dsr, xmlToJson };
38915
39042
  //# sourceMappingURL=index.js.map
38916
39043
  //# sourceMappingURL=index.js.map