@ubercode/dcmtk 0.11.1 → 0.12.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--dDQfutR.d.ts → index-B5FQoIqM.d.ts} +47 -5
- package/dist/{index-CVDMaxd8.d.cts → index-DV8HaHEX.d.cts} +47 -5
- package/dist/index.cjs +91 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +91 -14
- package/dist/index.js.map +1 -1
- package/dist/servers.cjs +91 -14
- package/dist/servers.cjs.map +1 -1
- package/dist/servers.d.cts +1 -1
- package/dist/servers.d.ts +1 -1
- package/dist/servers.js +91 -14
- package/dist/servers.js.map +1 -1
- package/package.json +1 -1
package/dist/servers.d.cts
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
|
|
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 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-DV8HaHEX.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
|
|
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 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-B5FQoIqM.js';
|
|
2
2
|
import './types-Cgumy1N4.js';
|
|
3
3
|
import 'node:events';
|
|
4
4
|
import 'node:net';
|
package/dist/servers.js
CHANGED
|
@@ -2830,6 +2830,9 @@ var Worker = class {
|
|
|
2830
2830
|
__publicField(this, "_state", "idle");
|
|
2831
2831
|
__publicField(this, "_context");
|
|
2832
2832
|
__publicField(this, "_pending", /* @__PURE__ */ new Set());
|
|
2833
|
+
__publicField(this, "_instancePending", /* @__PURE__ */ new Set());
|
|
2834
|
+
__publicField(this, "_instancesReceived", 0);
|
|
2835
|
+
__publicField(this, "_instanceErrors", 0);
|
|
2833
2836
|
__publicField(this, "_files", []);
|
|
2834
2837
|
__publicField(this, "_fileSizes", []);
|
|
2835
2838
|
__publicField(this, "_outputLines", []);
|
|
@@ -2867,6 +2870,9 @@ var Worker = class {
|
|
|
2867
2870
|
this._fileSizes.length = 0;
|
|
2868
2871
|
this._outputLines.length = 0;
|
|
2869
2872
|
this._pending.clear();
|
|
2873
|
+
this._instancePending.clear();
|
|
2874
|
+
this._instancesReceived = 0;
|
|
2875
|
+
this._instanceErrors = 0;
|
|
2870
2876
|
}
|
|
2871
2877
|
/** Returns the worker to idle and clears all association state. */
|
|
2872
2878
|
endAssociation() {
|
|
@@ -2876,6 +2882,9 @@ var Worker = class {
|
|
|
2876
2882
|
this._fileSizes.length = 0;
|
|
2877
2883
|
this._outputLines.length = 0;
|
|
2878
2884
|
this._pending.clear();
|
|
2885
|
+
this._instancePending.clear();
|
|
2886
|
+
this._instancesReceived = 0;
|
|
2887
|
+
this._instanceErrors = 0;
|
|
2879
2888
|
this._remoteSocket = void 0;
|
|
2880
2889
|
this._workerSocket = void 0;
|
|
2881
2890
|
}
|
|
@@ -2886,6 +2895,35 @@ var Worker = class {
|
|
|
2886
2895
|
this._pending.delete(promise);
|
|
2887
2896
|
});
|
|
2888
2897
|
}
|
|
2898
|
+
/** Tracks an in-flight instance parsing promise; auto-removes on completion. */
|
|
2899
|
+
trackInstance(promise) {
|
|
2900
|
+
this._instancePending.add(promise);
|
|
2901
|
+
void promise.finally(() => {
|
|
2902
|
+
this._instancePending.delete(promise);
|
|
2903
|
+
});
|
|
2904
|
+
}
|
|
2905
|
+
/** Records a successful instance parse. */
|
|
2906
|
+
recordInstanceSuccess() {
|
|
2907
|
+
this._instancesReceived++;
|
|
2908
|
+
}
|
|
2909
|
+
/** Records a failed instance parse. */
|
|
2910
|
+
recordInstanceError() {
|
|
2911
|
+
this._instanceErrors++;
|
|
2912
|
+
}
|
|
2913
|
+
/** Awaits all in-flight instance parsing promises. */
|
|
2914
|
+
async drainInstancePending() {
|
|
2915
|
+
if (this._instancePending.size > 0) {
|
|
2916
|
+
await Promise.all(this._instancePending);
|
|
2917
|
+
}
|
|
2918
|
+
}
|
|
2919
|
+
/** Number of successfully parsed instances in this association. */
|
|
2920
|
+
get instancesReceived() {
|
|
2921
|
+
return this._instancesReceived;
|
|
2922
|
+
}
|
|
2923
|
+
/** Number of failed instance parses in this association. */
|
|
2924
|
+
get instanceErrors() {
|
|
2925
|
+
return this._instanceErrors;
|
|
2926
|
+
}
|
|
2889
2927
|
/** Records a successfully received file path and its size. */
|
|
2890
2928
|
recordFile(filePath, size) {
|
|
2891
2929
|
this._files.push(filePath);
|
|
@@ -3057,7 +3095,16 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
|
|
|
3057
3095
|
return this.on("INSTANCE_RECEIVED", listener);
|
|
3058
3096
|
}
|
|
3059
3097
|
/**
|
|
3060
|
-
* Registers a listener for
|
|
3098
|
+
* Registers a listener for DicomInstance.open failures.
|
|
3099
|
+
*
|
|
3100
|
+
* @param listener - Callback receiving instance error data
|
|
3101
|
+
* @returns this for chaining
|
|
3102
|
+
*/
|
|
3103
|
+
onInstanceError(listener) {
|
|
3104
|
+
return this.on("INSTANCE_ERROR", listener);
|
|
3105
|
+
}
|
|
3106
|
+
/**
|
|
3107
|
+
* Registers a listener for completed associations (file moves done).
|
|
3061
3108
|
*
|
|
3062
3109
|
* @param listener - Callback receiving association data
|
|
3063
3110
|
* @returns this for chaining
|
|
@@ -3065,6 +3112,15 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
|
|
|
3065
3112
|
onAssociationComplete(listener) {
|
|
3066
3113
|
return this.on("ASSOCIATION_COMPLETE", listener);
|
|
3067
3114
|
}
|
|
3115
|
+
/**
|
|
3116
|
+
* Registers a listener for fully finalized associations (all parsing done).
|
|
3117
|
+
*
|
|
3118
|
+
* @param listener - Callback receiving finalized data with instance counts
|
|
3119
|
+
* @returns this for chaining
|
|
3120
|
+
*/
|
|
3121
|
+
onAssociationFinalized(listener) {
|
|
3122
|
+
return this.on("ASSOCIATION_FINALIZED", listener);
|
|
3123
|
+
}
|
|
3068
3124
|
/**
|
|
3069
3125
|
* Registers a listener for new associations (bubbled from workers).
|
|
3070
3126
|
*
|
|
@@ -3394,28 +3450,33 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
|
|
|
3394
3450
|
calledAE: data.calledAE,
|
|
3395
3451
|
source: data.source
|
|
3396
3452
|
});
|
|
3397
|
-
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
emitInstanceReceived(filePath, fileSize, data, ctx) {
|
|
3401
|
-
const errorCtx = {
|
|
3402
|
-
filePath,
|
|
3453
|
+
const instanceCtx = {
|
|
3454
|
+
filePath: finalPath,
|
|
3455
|
+
fileSize,
|
|
3403
3456
|
associationId: ctx.associationId,
|
|
3404
3457
|
associationDir: ctx.associationDir,
|
|
3405
3458
|
callingAE: data.callingAE,
|
|
3406
3459
|
calledAE: data.calledAE,
|
|
3407
3460
|
source: data.source
|
|
3408
3461
|
};
|
|
3409
|
-
|
|
3462
|
+
worker.trackInstance(this.parseAndEmitInstance(worker, instanceCtx));
|
|
3463
|
+
}
|
|
3464
|
+
/** Parses a DICOM file and emits INSTANCE_RECEIVED or INSTANCE_ERROR. */
|
|
3465
|
+
async parseAndEmitInstance(worker, ctx) {
|
|
3466
|
+
try {
|
|
3467
|
+
const openResult = await DicomInstance.open(ctx.filePath);
|
|
3410
3468
|
if (!openResult.ok) {
|
|
3411
|
-
|
|
3469
|
+
worker.recordInstanceError();
|
|
3470
|
+
this.emit("INSTANCE_ERROR", { error: openResult.error, thrown: false, ...ctx });
|
|
3412
3471
|
return;
|
|
3413
3472
|
}
|
|
3414
|
-
|
|
3415
|
-
|
|
3473
|
+
worker.recordInstanceSuccess();
|
|
3474
|
+
this.emit("INSTANCE_RECEIVED", { ...ctx, instance: openResult.value });
|
|
3475
|
+
} catch (thrown) {
|
|
3416
3476
|
const error = thrown instanceof Error ? thrown : new Error(String(thrown));
|
|
3417
|
-
|
|
3418
|
-
|
|
3477
|
+
worker.recordInstanceError();
|
|
3478
|
+
this.emit("INSTANCE_ERROR", { error, thrown: true, ...ctx });
|
|
3479
|
+
}
|
|
3419
3480
|
}
|
|
3420
3481
|
/** Returns worker to idle pool on association complete, emits summary. */
|
|
3421
3482
|
wireAssociationComplete(worker) {
|
|
@@ -3423,10 +3484,12 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
|
|
|
3423
3484
|
void this.finalizeAssociation(worker, data);
|
|
3424
3485
|
});
|
|
3425
3486
|
}
|
|
3426
|
-
/** Awaits
|
|
3487
|
+
/** Awaits file ops, emits ASSOCIATION_COMPLETE, awaits parsing, emits ASSOCIATION_FINALIZED. */
|
|
3427
3488
|
async finalizeAssociation(worker, data) {
|
|
3428
3489
|
await worker.drainPendingFiles();
|
|
3429
3490
|
this.emitAssociationComplete(worker, data);
|
|
3491
|
+
await worker.drainInstancePending();
|
|
3492
|
+
this.emitAssociationFinalized(worker, data);
|
|
3430
3493
|
worker.endAssociation();
|
|
3431
3494
|
void this.scaleDown();
|
|
3432
3495
|
}
|
|
@@ -3458,6 +3521,20 @@ var DicomReceiver = class _DicomReceiver extends EventEmitter {
|
|
|
3458
3521
|
output
|
|
3459
3522
|
});
|
|
3460
3523
|
}
|
|
3524
|
+
/** Emits ASSOCIATION_FINALIZED after all instance parsing is done. */
|
|
3525
|
+
emitAssociationFinalized(worker, data) {
|
|
3526
|
+
const ctx = worker.context;
|
|
3527
|
+
this.emit("ASSOCIATION_FINALIZED", {
|
|
3528
|
+
associationId: ctx?.associationId ?? data.associationId,
|
|
3529
|
+
associationDir: ctx?.associationDir ?? "",
|
|
3530
|
+
callingAE: data.callingAE,
|
|
3531
|
+
calledAE: data.calledAE,
|
|
3532
|
+
source: data.source,
|
|
3533
|
+
files: [...worker.files],
|
|
3534
|
+
instancesReceived: worker.instancesReceived,
|
|
3535
|
+
instanceErrors: worker.instanceErrors
|
|
3536
|
+
});
|
|
3537
|
+
}
|
|
3461
3538
|
/** Bubbles ASSOCIATION_RECEIVED from dcmrecv worker. */
|
|
3462
3539
|
wireAssociationReceived(worker) {
|
|
3463
3540
|
worker.dcmrecv.onEvent("ASSOCIATION_RECEIVED", (data) => {
|