pp-command-bus 1.5.0 → 2.0.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/README.md +400 -1219
- package/dist/command-bus/command-bus.spec.js +138 -359
- package/dist/command-bus/command-bus.spec.js.map +1 -1
- package/dist/command-bus/command.d.ts +3 -4
- package/dist/command-bus/command.js +3 -32
- package/dist/command-bus/command.js.map +1 -1
- package/dist/command-bus/config/command-bus-config.d.ts +75 -21
- package/dist/command-bus/config/command-bus-config.js +99 -58
- package/dist/command-bus/config/command-bus-config.js.map +1 -1
- package/dist/command-bus/config/command-bus-config.spec.js +174 -100
- package/dist/command-bus/config/command-bus-config.spec.js.map +1 -1
- package/dist/command-bus/index.d.ts +39 -52
- package/dist/command-bus/index.js +133 -126
- package/dist/command-bus/index.js.map +1 -1
- package/dist/command-bus/logging/command-logger.d.ts +2 -0
- package/dist/command-bus/logging/command-logger.js +7 -0
- package/dist/command-bus/logging/command-logger.js.map +1 -1
- package/dist/command-bus/logging/command-logger.spec.js +36 -0
- package/dist/command-bus/logging/command-logger.spec.js.map +1 -1
- package/dist/command-bus/serialization/index.d.ts +6 -0
- package/dist/command-bus/serialization/index.js +9 -0
- package/dist/command-bus/serialization/index.js.map +1 -0
- package/dist/command-bus/serialization/msgpack-serializer.d.ts +26 -0
- package/dist/command-bus/serialization/msgpack-serializer.js +70 -0
- package/dist/command-bus/serialization/msgpack-serializer.js.map +1 -0
- package/dist/command-bus/serialization/msgpack-serializer.spec.js +223 -0
- package/dist/command-bus/serialization/msgpack-serializer.spec.js.map +1 -0
- package/dist/command-bus/serialization/serializer.interface.d.ts +21 -0
- package/dist/command-bus/serialization/serializer.interface.js +3 -0
- package/dist/command-bus/serialization/serializer.interface.js.map +1 -0
- package/dist/command-bus/transport/consumer-loop.d.ts +45 -0
- package/dist/command-bus/transport/consumer-loop.js +90 -0
- package/dist/command-bus/transport/consumer-loop.js.map +1 -0
- package/dist/command-bus/transport/consumer-loop.spec.js +216 -0
- package/dist/command-bus/transport/consumer-loop.spec.js.map +1 -0
- package/dist/command-bus/transport/index.d.ts +21 -0
- package/dist/command-bus/transport/index.js +23 -0
- package/dist/command-bus/transport/index.js.map +1 -0
- package/dist/command-bus/transport/message-processor.d.ts +59 -0
- package/dist/command-bus/transport/message-processor.js +111 -0
- package/dist/command-bus/transport/message-processor.js.map +1 -0
- package/dist/command-bus/transport/message-processor.spec.js +185 -0
- package/dist/command-bus/transport/message-processor.spec.js.map +1 -0
- package/dist/command-bus/transport/pending-recovery.d.ts +54 -0
- package/dist/command-bus/transport/pending-recovery.js +139 -0
- package/dist/command-bus/transport/pending-recovery.js.map +1 -0
- package/dist/command-bus/transport/pending-recovery.spec.js +176 -0
- package/dist/command-bus/transport/pending-recovery.spec.js.map +1 -0
- package/dist/command-bus/transport/redis-codec.d.ts +24 -0
- package/dist/command-bus/transport/redis-codec.js +33 -0
- package/dist/command-bus/transport/redis-codec.js.map +1 -0
- package/dist/command-bus/transport/redis-codec.spec.js +53 -0
- package/dist/command-bus/transport/redis-codec.spec.js.map +1 -0
- package/dist/command-bus/transport/redis-streams-transport.d.ts +91 -0
- package/dist/command-bus/transport/redis-streams-transport.js +134 -0
- package/dist/command-bus/transport/redis-streams-transport.js.map +1 -0
- package/dist/command-bus/transport/redis-streams-transport.spec.js +420 -0
- package/dist/command-bus/transport/redis-streams-transport.spec.js.map +1 -0
- package/dist/command-bus/transport/rpc-handler.d.ts +39 -0
- package/dist/command-bus/transport/rpc-handler.js +87 -0
- package/dist/command-bus/transport/rpc-handler.js.map +1 -0
- package/dist/command-bus/transport/rpc-handler.spec.js +157 -0
- package/dist/command-bus/transport/rpc-handler.spec.js.map +1 -0
- package/dist/command-bus/transport/stream-consumer.d.ts +89 -0
- package/dist/command-bus/transport/stream-consumer.js +181 -0
- package/dist/command-bus/transport/stream-consumer.js.map +1 -0
- package/dist/command-bus/transport/stream-consumer.spec.js +284 -0
- package/dist/command-bus/transport/stream-consumer.spec.js.map +1 -0
- package/dist/command-bus/transport/stream-producer.d.ts +23 -0
- package/dist/command-bus/transport/stream-producer.js +70 -0
- package/dist/command-bus/transport/stream-producer.js.map +1 -0
- package/dist/command-bus/transport/stream-producer.spec.js +125 -0
- package/dist/command-bus/transport/stream-producer.spec.js.map +1 -0
- package/dist/command-bus/transport/transport.interface.d.ts +87 -0
- package/dist/command-bus/transport/transport.interface.js +3 -0
- package/dist/command-bus/transport/transport.interface.js.map +1 -0
- package/dist/command-bus/types/index.d.ts +0 -84
- package/dist/examples/rpc.demo.js +1 -1
- package/dist/examples/rpc.demo.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/pp-command-bus-2.0.0.tgz +0 -0
- package/dist/shared/redis/connection-pool.d.ts +54 -0
- package/dist/shared/redis/connection-pool.js +117 -0
- package/dist/shared/redis/connection-pool.js.map +1 -0
- package/dist/shared/redis/connection-pool.spec.js +114 -0
- package/dist/shared/redis/connection-pool.spec.js.map +1 -0
- package/dist/shared/redis/index.d.ts +5 -3
- package/dist/shared/redis/index.js +6 -4
- package/dist/shared/redis/index.js.map +1 -1
- package/dist/shared/redis/rpc-connection-pool.d.ts +61 -0
- package/dist/shared/redis/rpc-connection-pool.js +154 -0
- package/dist/shared/redis/rpc-connection-pool.js.map +1 -0
- package/dist/shared/redis/rpc-connection-pool.spec.d.ts +1 -0
- package/dist/shared/redis/rpc-connection-pool.spec.js +173 -0
- package/dist/shared/redis/rpc-connection-pool.spec.js.map +1 -0
- package/dist/shared/types.d.ts +0 -4
- package/dist/shared/utils/error-utils.d.ts +8 -0
- package/dist/shared/utils/error-utils.js +14 -0
- package/dist/shared/utils/error-utils.js.map +1 -0
- package/package.json +12 -12
- package/dist/command-bus/config/auto-config-optimizer.d.ts +0 -35
- package/dist/command-bus/config/auto-config-optimizer.js +0 -52
- package/dist/command-bus/config/auto-config-optimizer.js.map +0 -1
- package/dist/command-bus/config/auto-config-optimizer.spec.js +0 -42
- package/dist/command-bus/config/auto-config-optimizer.spec.js.map +0 -1
- package/dist/command-bus/job/index.d.ts +0 -6
- package/dist/command-bus/job/index.js +0 -15
- package/dist/command-bus/job/index.js.map +0 -1
- package/dist/command-bus/job/job-options-builder.d.ts +0 -21
- package/dist/command-bus/job/job-options-builder.js +0 -58
- package/dist/command-bus/job/job-options-builder.js.map +0 -1
- package/dist/command-bus/job/job-options-builder.spec.js +0 -156
- package/dist/command-bus/job/job-options-builder.spec.js.map +0 -1
- package/dist/command-bus/job/job-processor.d.ts +0 -39
- package/dist/command-bus/job/job-processor.js +0 -203
- package/dist/command-bus/job/job-processor.js.map +0 -1
- package/dist/command-bus/job/job-processor.spec.js +0 -436
- package/dist/command-bus/job/job-processor.spec.js.map +0 -1
- package/dist/command-bus/queue/index.d.ts +0 -5
- package/dist/command-bus/queue/index.js +0 -13
- package/dist/command-bus/queue/index.js.map +0 -1
- package/dist/command-bus/queue/queue-manager.d.ts +0 -56
- package/dist/command-bus/queue/queue-manager.js +0 -163
- package/dist/command-bus/queue/queue-manager.js.map +0 -1
- package/dist/command-bus/queue/queue-manager.spec.js +0 -371
- package/dist/command-bus/queue/queue-manager.spec.js.map +0 -1
- package/dist/command-bus/rpc/index.d.ts +0 -11
- package/dist/command-bus/rpc/index.js +0 -19
- package/dist/command-bus/rpc/index.js.map +0 -1
- package/dist/command-bus/rpc/payload-compression.service.d.ts +0 -50
- package/dist/command-bus/rpc/payload-compression.service.js +0 -215
- package/dist/command-bus/rpc/payload-compression.service.js.map +0 -1
- package/dist/command-bus/rpc/payload-compression.service.spec.js +0 -376
- package/dist/command-bus/rpc/payload-compression.service.spec.js.map +0 -1
- package/dist/command-bus/rpc/rpc-coordinator.d.ts +0 -96
- package/dist/command-bus/rpc/rpc-coordinator.js +0 -500
- package/dist/command-bus/rpc/rpc-coordinator.js.map +0 -1
- package/dist/command-bus/rpc/rpc-coordinator.spec.js +0 -621
- package/dist/command-bus/rpc/rpc-coordinator.spec.js.map +0 -1
- package/dist/command-bus/rpc/rpc-job-cancellation.service.d.ts +0 -82
- package/dist/command-bus/rpc/rpc-job-cancellation.service.js +0 -180
- package/dist/command-bus/rpc/rpc-job-cancellation.service.js.map +0 -1
- package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js +0 -286
- package/dist/command-bus/rpc/rpc-job-cancellation.service.spec.js.map +0 -1
- package/dist/command-bus/worker/index.d.ts +0 -10
- package/dist/command-bus/worker/index.js +0 -19
- package/dist/command-bus/worker/index.js.map +0 -1
- package/dist/command-bus/worker/worker-benchmark.d.ts +0 -71
- package/dist/command-bus/worker/worker-benchmark.js +0 -202
- package/dist/command-bus/worker/worker-benchmark.js.map +0 -1
- package/dist/command-bus/worker/worker-benchmark.spec.js +0 -310
- package/dist/command-bus/worker/worker-benchmark.spec.js.map +0 -1
- package/dist/command-bus/worker/worker-metrics-collector.d.ts +0 -98
- package/dist/command-bus/worker/worker-metrics-collector.js +0 -242
- package/dist/command-bus/worker/worker-metrics-collector.js.map +0 -1
- package/dist/command-bus/worker/worker-orchestrator.d.ts +0 -70
- package/dist/command-bus/worker/worker-orchestrator.js +0 -339
- package/dist/command-bus/worker/worker-orchestrator.js.map +0 -1
- package/dist/command-bus/worker/worker-orchestrator.spec.js +0 -712
- package/dist/command-bus/worker/worker-orchestrator.spec.js.map +0 -1
- package/dist/examples/auto-config.demo.d.ts +0 -9
- package/dist/examples/auto-config.demo.js +0 -106
- package/dist/examples/auto-config.demo.js.map +0 -1
- package/dist/examples/rpc-compression.demo.d.ts +0 -5
- package/dist/examples/rpc-compression.demo.js +0 -358
- package/dist/examples/rpc-compression.demo.js.map +0 -1
- package/dist/examples/rpc-resilience.demo.d.ts +0 -15
- package/dist/examples/rpc-resilience.demo.js +0 -233
- package/dist/examples/rpc-resilience.demo.js.map +0 -1
- package/dist/pp-command-bus-1.5.0.tgz +0 -0
- package/dist/shared/config/base-config.d.ts +0 -54
- package/dist/shared/config/base-config.js +0 -114
- package/dist/shared/config/base-config.js.map +0 -1
- package/dist/shared/config/base-config.spec.js +0 -204
- package/dist/shared/config/base-config.spec.js.map +0 -1
- package/dist/shared/config/index.d.ts +0 -1
- package/dist/shared/config/index.js +0 -9
- package/dist/shared/config/index.js.map +0 -1
- package/dist/shared/redis/redis-connection-factory.d.ts +0 -66
- package/dist/shared/redis/redis-connection-factory.js +0 -113
- package/dist/shared/redis/redis-connection-factory.js.map +0 -1
- /package/dist/command-bus/{config/auto-config-optimizer.spec.d.ts → serialization/msgpack-serializer.spec.d.ts} +0 -0
- /package/dist/command-bus/{job/job-options-builder.spec.d.ts → transport/consumer-loop.spec.d.ts} +0 -0
- /package/dist/command-bus/{job/job-processor.spec.d.ts → transport/message-processor.spec.d.ts} +0 -0
- /package/dist/command-bus/{queue/queue-manager.spec.d.ts → transport/pending-recovery.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/payload-compression.service.spec.d.ts → transport/redis-codec.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/rpc-coordinator.spec.d.ts → transport/redis-streams-transport.spec.d.ts} +0 -0
- /package/dist/command-bus/{rpc/rpc-job-cancellation.service.spec.d.ts → transport/rpc-handler.spec.d.ts} +0 -0
- /package/dist/command-bus/{worker/worker-benchmark.spec.d.ts → transport/stream-consumer.spec.d.ts} +0 -0
- /package/dist/command-bus/{worker/worker-orchestrator.spec.d.ts → transport/stream-producer.spec.d.ts} +0 -0
- /package/dist/shared/{config/base-config.spec.d.ts → redis/connection-pool.spec.d.ts} +0 -0
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const zlib_1 = require("zlib");
|
|
13
|
-
const util_1 = require("util");
|
|
14
|
-
/**
|
|
15
|
-
* Async wersje funkcji zlib (nie blokują event loop)
|
|
16
|
-
*/
|
|
17
|
-
const gzipAsync = (0, util_1.promisify)(zlib_1.gzip);
|
|
18
|
-
const gunzipAsync = (0, util_1.promisify)(zlib_1.gunzip);
|
|
19
|
-
/**
|
|
20
|
-
* Serwis kompresji payloadów RPC
|
|
21
|
-
* Automatycznie kompresuje payloady większe niż threshold za pomocą gzip (async)
|
|
22
|
-
* Używa async gzip aby nie blokować event loop Node.js
|
|
23
|
-
*/
|
|
24
|
-
class PayloadCompressionService {
|
|
25
|
-
constructor(threshold, logger) {
|
|
26
|
-
this.threshold = threshold;
|
|
27
|
-
this.logger = logger;
|
|
28
|
-
this.logger.debug('PayloadCompressionService utworzony', {
|
|
29
|
-
threshold: `${threshold} bytes`,
|
|
30
|
-
timestamp: new Date().toISOString(),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Kompresuje payload jeśli przekracza threshold (async - nie blokuje event loop)
|
|
35
|
-
* @param payload - Dane do kompresji
|
|
36
|
-
* @returns Promise z obiektem zawierającym data (JSON lub base64 gzip) i flagą compressed
|
|
37
|
-
*/
|
|
38
|
-
compress(payload) {
|
|
39
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
-
// Serializuj do JSON
|
|
41
|
-
const json = JSON.stringify(payload);
|
|
42
|
-
const originalSize = Buffer.byteLength(json, 'utf8');
|
|
43
|
-
// Sprawdź czy przekracza threshold
|
|
44
|
-
if (originalSize <= this.threshold) {
|
|
45
|
-
this.logger.debug('Payload NIE skompresowany (poniżej threshold)', {
|
|
46
|
-
originalSize,
|
|
47
|
-
threshold: this.threshold,
|
|
48
|
-
timestamp: new Date().toISOString(),
|
|
49
|
-
});
|
|
50
|
-
return {
|
|
51
|
-
data: json,
|
|
52
|
-
compressed: false,
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// Kompresuj gzip (async - nie blokuje event loop)
|
|
56
|
-
const compressed = yield gzipAsync(Buffer.from(json, 'utf8'));
|
|
57
|
-
const compressedBase64 = compressed.toString('base64');
|
|
58
|
-
const compressedSize = Buffer.byteLength(compressedBase64, 'utf8');
|
|
59
|
-
const compressionRatio = Math.round(((originalSize - compressedSize) / originalSize) * 100);
|
|
60
|
-
this.logger.debug('Payload skompresowany gzip', {
|
|
61
|
-
originalSize,
|
|
62
|
-
compressedSize,
|
|
63
|
-
compressionRatio: `${compressionRatio}%`,
|
|
64
|
-
timestamp: new Date().toISOString(),
|
|
65
|
-
});
|
|
66
|
-
return {
|
|
67
|
-
data: compressedBase64,
|
|
68
|
-
compressed: true,
|
|
69
|
-
};
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Dekompresuje payload na podstawie flagi compressed (async - nie blokuje event loop)
|
|
74
|
-
* @param data - Dane do dekompresji (JSON string lub base64 gzip)
|
|
75
|
-
* @param compressed - Czy dane są skompresowane
|
|
76
|
-
* @returns Promise ze zdeserializowanym obiektem
|
|
77
|
-
* @throws Error jeśli dekompresja lub parsowanie się nie powiedzie
|
|
78
|
-
*/
|
|
79
|
-
decompress(data, compressed) {
|
|
80
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
-
if (!compressed) {
|
|
82
|
-
// Proste parsowanie JSON
|
|
83
|
-
return JSON.parse(data);
|
|
84
|
-
}
|
|
85
|
-
// Dekompresja gzip (async - nie blokuje event loop)
|
|
86
|
-
try {
|
|
87
|
-
const compressedBuffer = Buffer.from(data, 'base64');
|
|
88
|
-
const decompressed = yield gunzipAsync(compressedBuffer);
|
|
89
|
-
const json = decompressed.toString('utf8');
|
|
90
|
-
this.logger.debug('Payload zdekompresowany', {
|
|
91
|
-
compressedSize: data.length,
|
|
92
|
-
decompressedSize: json.length,
|
|
93
|
-
timestamp: new Date().toISOString(),
|
|
94
|
-
});
|
|
95
|
-
return JSON.parse(json);
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
this.logger.error('Błąd dekompresji payloadu', {
|
|
99
|
-
error: error instanceof Error ? error.message : String(error),
|
|
100
|
-
dataLength: data.length,
|
|
101
|
-
timestamp: new Date().toISOString(),
|
|
102
|
-
});
|
|
103
|
-
throw new Error('Failed to decompress payload');
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Kompresuje Command obiekt jeśli przekracza threshold
|
|
109
|
-
* Zachowuje metadane Command (__name, __id, __time) i kompresuje __payload
|
|
110
|
-
*
|
|
111
|
-
* @param command - Command do kompresji
|
|
112
|
-
* @returns Promise z CompressibleCommand (może być skompresowany lub nie)
|
|
113
|
-
*/
|
|
114
|
-
compressCommand(command) {
|
|
115
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
// Wyodrębnij metadane i payload Command
|
|
117
|
-
const { __name, __id, __time, __payload } = command;
|
|
118
|
-
// Serializuj payload do JSON
|
|
119
|
-
const json = JSON.stringify(__payload);
|
|
120
|
-
const originalSize = Buffer.byteLength(json, 'utf8');
|
|
121
|
-
// Sprawdź czy przekracza threshold
|
|
122
|
-
if (originalSize <= this.threshold) {
|
|
123
|
-
this.logger.debug('Command NIE skompresowany (poniżej threshold)', {
|
|
124
|
-
commandName: __name,
|
|
125
|
-
commandId: __id,
|
|
126
|
-
originalSize,
|
|
127
|
-
threshold: this.threshold,
|
|
128
|
-
timestamp: new Date().toISOString(),
|
|
129
|
-
});
|
|
130
|
-
// Zwróć command bez kompresji (z flagą __compressed=false)
|
|
131
|
-
return Object.assign(Object.assign({}, command), { __compressed: false });
|
|
132
|
-
}
|
|
133
|
-
// Kompresuj gzip (async - nie blokuje event loop)
|
|
134
|
-
const compressed = yield gzipAsync(Buffer.from(json, 'utf8'));
|
|
135
|
-
const compressedBase64 = compressed.toString('base64');
|
|
136
|
-
const compressedSize = Buffer.byteLength(compressedBase64, 'utf8');
|
|
137
|
-
const compressionRatio = Math.round(((originalSize - compressedSize) / originalSize) * 100);
|
|
138
|
-
this.logger.debug('Command skompresowany gzip', {
|
|
139
|
-
commandName: __name,
|
|
140
|
-
commandId: __id,
|
|
141
|
-
originalSize,
|
|
142
|
-
compressedSize,
|
|
143
|
-
compressionRatio: `${compressionRatio}%`,
|
|
144
|
-
timestamp: new Date().toISOString(),
|
|
145
|
-
});
|
|
146
|
-
// Zwróć command z metadanymi, pustym payload i skompresowanymi danymi
|
|
147
|
-
return {
|
|
148
|
-
__name,
|
|
149
|
-
__id,
|
|
150
|
-
__time,
|
|
151
|
-
__payload: undefined, // Payload jest skompresowany w __compressedData
|
|
152
|
-
__compressed: true,
|
|
153
|
-
__compressedData: compressedBase64,
|
|
154
|
-
};
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Dekompresuje Command obiekt na podstawie flagi __compressed
|
|
159
|
-
*
|
|
160
|
-
* @param command - CompressibleCommand do dekompresji
|
|
161
|
-
* @returns Promise ze zdekompresowanym Command
|
|
162
|
-
* @throws Error jeśli dekompresja się nie powiedzie lub brakuje danych
|
|
163
|
-
*/
|
|
164
|
-
decompressCommand(command) {
|
|
165
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
166
|
-
// Jeśli nie jest skompresowany, zwróć bez zmian
|
|
167
|
-
if (!command.__compressed) {
|
|
168
|
-
return command;
|
|
169
|
-
}
|
|
170
|
-
// Sprawdź czy są skompresowane dane
|
|
171
|
-
if (!command.__compressedData) {
|
|
172
|
-
this.logger.error('Brak skompresowanych danych w Command', {
|
|
173
|
-
commandName: command.__name,
|
|
174
|
-
commandId: command.__id,
|
|
175
|
-
timestamp: new Date().toISOString(),
|
|
176
|
-
});
|
|
177
|
-
throw new Error('Missing compressed data');
|
|
178
|
-
}
|
|
179
|
-
try {
|
|
180
|
-
// Dekompresuj dane
|
|
181
|
-
const compressedBuffer = Buffer.from(command.__compressedData, 'base64');
|
|
182
|
-
const decompressed = yield gunzipAsync(compressedBuffer);
|
|
183
|
-
const json = decompressed.toString('utf8');
|
|
184
|
-
this.logger.debug('Command zdekompresowany', {
|
|
185
|
-
commandName: command.__name,
|
|
186
|
-
commandId: command.__id,
|
|
187
|
-
compressedSize: command.__compressedData.length,
|
|
188
|
-
decompressedSize: json.length,
|
|
189
|
-
timestamp: new Date().toISOString(),
|
|
190
|
-
});
|
|
191
|
-
// Parsuj JSON do payloadu
|
|
192
|
-
const payload = JSON.parse(json);
|
|
193
|
-
// Rekonstruuj Command z metadanymi i zdekompresowanym payloadem
|
|
194
|
-
return {
|
|
195
|
-
__name: command.__name,
|
|
196
|
-
__id: command.__id,
|
|
197
|
-
__time: command.__time,
|
|
198
|
-
__payload: payload,
|
|
199
|
-
__compressed: false,
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
catch (error) {
|
|
203
|
-
this.logger.error('Błąd dekompresji Command', {
|
|
204
|
-
commandName: command.__name,
|
|
205
|
-
commandId: command.__id,
|
|
206
|
-
error: error instanceof Error ? error.message : String(error),
|
|
207
|
-
timestamp: new Date().toISOString(),
|
|
208
|
-
});
|
|
209
|
-
throw new Error('Failed to decompress payload');
|
|
210
|
-
}
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
exports.default = PayloadCompressionService;
|
|
215
|
-
//# sourceMappingURL=payload-compression.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payload-compression.service.js","sourceRoot":"","sources":["../../../src/command-bus/rpc/payload-compression.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const payload_compression_service_1 = __importDefault(require("./payload-compression.service"));
|
|
16
|
-
const command_1 = __importDefault(require("../command"));
|
|
17
|
-
/**
|
|
18
|
-
* Test command class
|
|
19
|
-
*/
|
|
20
|
-
class TestCommand extends command_1.default {
|
|
21
|
-
constructor(payload) {
|
|
22
|
-
super(payload);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Testy dla PayloadCompressionService
|
|
27
|
-
* Testuje kompresję gzip dla payloadów RPC >threshold oraz Command obiektów
|
|
28
|
-
*/
|
|
29
|
-
describe('PayloadCompressionService', () => {
|
|
30
|
-
let service;
|
|
31
|
-
let mockLogger;
|
|
32
|
-
beforeEach(() => {
|
|
33
|
-
mockLogger = {
|
|
34
|
-
debug: jest.fn(),
|
|
35
|
-
log: jest.fn(),
|
|
36
|
-
warn: jest.fn(),
|
|
37
|
-
error: jest.fn(),
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
describe('compress()', () => {
|
|
41
|
-
it('nie kompresuje payloadu mniejszego niż threshold (1KB)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
42
|
-
// Arrange
|
|
43
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
44
|
-
const smallPayload = { correlationId: 'test-123', result: 'ok', error: null };
|
|
45
|
-
// Act
|
|
46
|
-
const { data, compressed } = yield service.compress(smallPayload);
|
|
47
|
-
// Assert
|
|
48
|
-
expect(compressed).toBe(false);
|
|
49
|
-
expect(data).toBe(JSON.stringify(smallPayload));
|
|
50
|
-
expect(mockLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Payload NIE skompresowany'), expect.objectContaining({
|
|
51
|
-
originalSize: expect.any(Number),
|
|
52
|
-
threshold: 1024,
|
|
53
|
-
}));
|
|
54
|
-
}));
|
|
55
|
-
it('kompresuje payload większy niż threshold (1KB)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
-
// Arrange
|
|
57
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
58
|
-
// Utwórz duży payload >1KB
|
|
59
|
-
const largePayload = {
|
|
60
|
-
correlationId: 'test-456',
|
|
61
|
-
result: Array.from({ length: 100 }, (_, i) => ({
|
|
62
|
-
id: i,
|
|
63
|
-
name: `Item ${i}`,
|
|
64
|
-
description: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit',
|
|
65
|
-
})),
|
|
66
|
-
error: null,
|
|
67
|
-
};
|
|
68
|
-
// Act
|
|
69
|
-
const { data, compressed } = yield service.compress(largePayload);
|
|
70
|
-
// Assert
|
|
71
|
-
expect(compressed).toBe(true);
|
|
72
|
-
expect(data).not.toBe(JSON.stringify(largePayload)); // Skompresowane
|
|
73
|
-
expect(typeof data).toBe('string'); // Base64 string
|
|
74
|
-
expect(mockLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Payload skompresowany'), expect.objectContaining({
|
|
75
|
-
originalSize: expect.any(Number),
|
|
76
|
-
compressedSize: expect.any(Number),
|
|
77
|
-
compressionRatio: expect.any(String),
|
|
78
|
-
}));
|
|
79
|
-
}));
|
|
80
|
-
it('używa niestandardowego threshold (512 bytes)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
|
-
// Arrange
|
|
82
|
-
service = new payload_compression_service_1.default(512, mockLogger);
|
|
83
|
-
const mediumPayload = {
|
|
84
|
-
correlationId: 'test-789',
|
|
85
|
-
result: Array.from({ length: 30 }, (_, i) => ({
|
|
86
|
-
id: i,
|
|
87
|
-
data: 'test data item with more content to exceed 512 bytes threshold',
|
|
88
|
-
})),
|
|
89
|
-
error: null,
|
|
90
|
-
};
|
|
91
|
-
// Act
|
|
92
|
-
const { compressed } = yield service.compress(mediumPayload);
|
|
93
|
-
// Assert - ten payload jest >512B więc powinien być skompresowany
|
|
94
|
-
expect(compressed).toBe(true);
|
|
95
|
-
}));
|
|
96
|
-
it('zawsze kompresuje gdy threshold=0', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
97
|
-
// Arrange
|
|
98
|
-
service = new payload_compression_service_1.default(0, mockLogger);
|
|
99
|
-
const tinyPayload = { result: 'ok' };
|
|
100
|
-
// Act
|
|
101
|
-
const { compressed } = yield service.compress(tinyPayload);
|
|
102
|
-
// Assert
|
|
103
|
-
expect(compressed).toBe(true);
|
|
104
|
-
}));
|
|
105
|
-
it('oblicza compression ratio poprawnie', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
106
|
-
// Arrange
|
|
107
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
108
|
-
const payload = {
|
|
109
|
-
data: Array.from({ length: 50 }, () => 'repeated text for compression test '),
|
|
110
|
-
};
|
|
111
|
-
// Act
|
|
112
|
-
yield service.compress(payload);
|
|
113
|
-
// Assert
|
|
114
|
-
expect(mockLogger.debug).toHaveBeenCalledWith(expect.stringContaining('Payload skompresowany'), expect.objectContaining({
|
|
115
|
-
compressionRatio: expect.stringMatching(/\d+%/), // Format: "XX%"
|
|
116
|
-
}));
|
|
117
|
-
}));
|
|
118
|
-
});
|
|
119
|
-
describe('decompress()', () => {
|
|
120
|
-
it('dekompresuje payload gdy compressed=true', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
121
|
-
// Arrange
|
|
122
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
123
|
-
const originalPayload = {
|
|
124
|
-
correlationId: 'test-999',
|
|
125
|
-
result: {
|
|
126
|
-
status: 'success',
|
|
127
|
-
data: Array.from({ length: 20 }, (_, i) => ({
|
|
128
|
-
id: i,
|
|
129
|
-
value: `item-${i}`,
|
|
130
|
-
description: 'some longer text to make payload bigger',
|
|
131
|
-
})),
|
|
132
|
-
},
|
|
133
|
-
error: null,
|
|
134
|
-
};
|
|
135
|
-
// Najpierw skompresuj
|
|
136
|
-
const { data: compressedData, compressed } = yield service.compress(originalPayload);
|
|
137
|
-
expect(compressed).toBe(true);
|
|
138
|
-
// Act - dekompresuj
|
|
139
|
-
const decompressed = yield service.decompress(compressedData, true);
|
|
140
|
-
// Assert
|
|
141
|
-
expect(decompressed).toEqual(originalPayload);
|
|
142
|
-
}));
|
|
143
|
-
it('parsuje JSON gdy compressed=false', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
144
|
-
// Arrange
|
|
145
|
-
service = new payload_compression_service_1.default(10000, mockLogger); // Bardzo wysoki threshold
|
|
146
|
-
const originalPayload = {
|
|
147
|
-
correlationId: 'test-111',
|
|
148
|
-
result: 'simple result',
|
|
149
|
-
error: null,
|
|
150
|
-
};
|
|
151
|
-
// Kompresuj (ale nie zostanie skompresowany bo <10KB)
|
|
152
|
-
const { data, compressed } = yield service.compress(originalPayload);
|
|
153
|
-
expect(compressed).toBe(false);
|
|
154
|
-
// Act - dekompresuj
|
|
155
|
-
const decompressed = yield service.decompress(data, false);
|
|
156
|
-
// Assert
|
|
157
|
-
expect(decompressed).toEqual(originalPayload);
|
|
158
|
-
}));
|
|
159
|
-
it('rzuca błąd gdy corrupted gzip data', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
160
|
-
// Arrange
|
|
161
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
162
|
-
const corruptedData = 'invalid-base64-gzip-data!!!';
|
|
163
|
-
// Act & Assert
|
|
164
|
-
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
165
|
-
yield service.decompress(corruptedData, true);
|
|
166
|
-
})).rejects.toThrow('Failed to decompress payload');
|
|
167
|
-
expect(mockLogger.error).toHaveBeenCalledWith(expect.stringContaining('Błąd dekompresji'), expect.any(Object));
|
|
168
|
-
}));
|
|
169
|
-
it('rzuca błąd gdy invalid JSON (compressed=false)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
-
// Arrange
|
|
171
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
172
|
-
const invalidJson = '{invalid json}';
|
|
173
|
-
// Act & Assert
|
|
174
|
-
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
175
|
-
yield service.decompress(invalidJson, false);
|
|
176
|
-
})).rejects.toThrow();
|
|
177
|
-
}));
|
|
178
|
-
});
|
|
179
|
-
describe('edge cases', () => {
|
|
180
|
-
it('obsługuje pusty payload', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
181
|
-
// Arrange
|
|
182
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
183
|
-
const emptyPayload = {};
|
|
184
|
-
// Act
|
|
185
|
-
const { data, compressed } = yield service.compress(emptyPayload);
|
|
186
|
-
const decompressed = yield service.decompress(data, compressed);
|
|
187
|
-
// Assert
|
|
188
|
-
expect(decompressed).toEqual(emptyPayload);
|
|
189
|
-
}));
|
|
190
|
-
it('obsługuje payload z null i undefined', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
191
|
-
// Arrange
|
|
192
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
193
|
-
const payload = { result: null, error: undefined };
|
|
194
|
-
// Act
|
|
195
|
-
const { data, compressed } = yield service.compress(payload);
|
|
196
|
-
const decompressed = yield service.decompress(data, compressed);
|
|
197
|
-
// Assert
|
|
198
|
-
expect(decompressed).toEqual({ result: null, error: undefined });
|
|
199
|
-
}));
|
|
200
|
-
it('obsługuje payload z obiektami zagnieżdżonymi', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
201
|
-
// Arrange
|
|
202
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
203
|
-
const nestedPayload = {
|
|
204
|
-
level1: {
|
|
205
|
-
level2: {
|
|
206
|
-
level3: {
|
|
207
|
-
data: [1, 2, 3],
|
|
208
|
-
},
|
|
209
|
-
},
|
|
210
|
-
},
|
|
211
|
-
};
|
|
212
|
-
// Act
|
|
213
|
-
const { data, compressed } = yield service.compress(nestedPayload);
|
|
214
|
-
const decompressed = yield service.decompress(data, compressed);
|
|
215
|
-
// Assert
|
|
216
|
-
expect(decompressed).toEqual(nestedPayload);
|
|
217
|
-
}));
|
|
218
|
-
it('osiąga compression ratio >50% dla typowego JSON', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
219
|
-
// Arrange
|
|
220
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
221
|
-
const typicalPayload = {
|
|
222
|
-
correlationId: 'abc-123',
|
|
223
|
-
result: Array.from({ length: 50 }, (_, i) => ({
|
|
224
|
-
id: i,
|
|
225
|
-
name: `User ${i}`,
|
|
226
|
-
email: `user${i}@example.com`,
|
|
227
|
-
active: true,
|
|
228
|
-
})),
|
|
229
|
-
error: null,
|
|
230
|
-
};
|
|
231
|
-
// Act
|
|
232
|
-
const { data, compressed } = yield service.compress(typicalPayload);
|
|
233
|
-
// Assert
|
|
234
|
-
expect(compressed).toBe(true);
|
|
235
|
-
const originalSize = Buffer.byteLength(JSON.stringify(typicalPayload), 'utf8');
|
|
236
|
-
const compressedSize = Buffer.byteLength(data, 'utf8');
|
|
237
|
-
const ratio = ((originalSize - compressedSize) / originalSize) * 100;
|
|
238
|
-
expect(ratio).toBeGreaterThan(50); // >50% redukcja
|
|
239
|
-
}));
|
|
240
|
-
});
|
|
241
|
-
describe('compressCommand()', () => {
|
|
242
|
-
it('nie kompresuje małego Command (poniżej threshold)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
243
|
-
// Arrange
|
|
244
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
245
|
-
const command = new TestCommand({ data: 'small data' });
|
|
246
|
-
// Act
|
|
247
|
-
const result = yield service.compressCommand(command);
|
|
248
|
-
// Assert
|
|
249
|
-
expect(result.__compressed).toBe(false);
|
|
250
|
-
expect(result.__compressedData).toBeUndefined();
|
|
251
|
-
expect(result.__payload.data).toBe('small data');
|
|
252
|
-
expect(result.__name).toBe('TestCommand');
|
|
253
|
-
expect(result.__id).toBe(command.__id);
|
|
254
|
-
}));
|
|
255
|
-
it('kompresuje duży Command (powyżej threshold)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
256
|
-
// Arrange
|
|
257
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
258
|
-
const largeItems = Array.from({ length: 50 }, (_, i) => `item-${i}-with-long-description`);
|
|
259
|
-
const command = new TestCommand({ data: 'large data', items: largeItems });
|
|
260
|
-
// Act
|
|
261
|
-
const result = yield service.compressCommand(command);
|
|
262
|
-
// Assert
|
|
263
|
-
expect(result.__compressed).toBe(true);
|
|
264
|
-
expect(result.__compressedData).toBeDefined();
|
|
265
|
-
expect(typeof result.__compressedData).toBe('string');
|
|
266
|
-
// Payload powinien być undefined (skompresowany w __compressedData)
|
|
267
|
-
expect(result.__payload).toBeUndefined();
|
|
268
|
-
// Metadane powinny być zachowane
|
|
269
|
-
expect(result.__name).toBe('TestCommand');
|
|
270
|
-
expect(result.__id).toBe(command.__id);
|
|
271
|
-
expect(result.__time).toBe(command.__time);
|
|
272
|
-
}));
|
|
273
|
-
it('zachowuje wszystkie metadane Command przy kompresji', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
274
|
-
// Arrange
|
|
275
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
276
|
-
const largeItems = Array.from({ length: 50 }, (_, i) => `item-${i}`);
|
|
277
|
-
const command = new TestCommand({ data: 'test', items: largeItems });
|
|
278
|
-
const originalId = command.__id;
|
|
279
|
-
const originalName = command.__name;
|
|
280
|
-
const originalTime = command.__time;
|
|
281
|
-
// Act
|
|
282
|
-
const result = yield service.compressCommand(command);
|
|
283
|
-
// Assert
|
|
284
|
-
expect(result.__id).toBe(originalId);
|
|
285
|
-
expect(result.__name).toBe(originalName);
|
|
286
|
-
expect(result.__time).toBe(originalTime);
|
|
287
|
-
expect(result.__compressed).toBe(true);
|
|
288
|
-
}));
|
|
289
|
-
});
|
|
290
|
-
describe('decompressCommand()', () => {
|
|
291
|
-
it('dekompresuje skompresowany Command poprawnie', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
292
|
-
// Arrange
|
|
293
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
294
|
-
const largeItems = Array.from({ length: 50 }, (_, i) => `item-${i}-long-description-text`);
|
|
295
|
-
const originalCommand = new TestCommand({ data: 'original data', items: largeItems });
|
|
296
|
-
const originalId = originalCommand.__id;
|
|
297
|
-
// Skompresuj
|
|
298
|
-
const compressed = yield service.compressCommand(originalCommand);
|
|
299
|
-
expect(compressed.__compressed).toBe(true);
|
|
300
|
-
// Act - dekompresuj
|
|
301
|
-
const decompressed = yield service.decompressCommand(compressed);
|
|
302
|
-
// Assert
|
|
303
|
-
expect(decompressed.__compressed).toBe(false);
|
|
304
|
-
expect(decompressed.__compressedData).toBeUndefined();
|
|
305
|
-
expect(decompressed.__payload.data).toBe('original data');
|
|
306
|
-
expect(decompressed.__payload.items).toEqual(largeItems);
|
|
307
|
-
expect(decompressed.__id).toBe(originalId);
|
|
308
|
-
expect(decompressed.__name).toBe('TestCommand');
|
|
309
|
-
}));
|
|
310
|
-
it('zwraca command bez zmian gdy nie jest skompresowany', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
311
|
-
// Arrange
|
|
312
|
-
service = new payload_compression_service_1.default(10000, mockLogger); // Wysoki threshold
|
|
313
|
-
const command = new TestCommand({ data: 'not compressed' });
|
|
314
|
-
// Skompresuj (ale nie zostanie skompresowany)
|
|
315
|
-
const notCompressed = yield service.compressCommand(command);
|
|
316
|
-
expect(notCompressed.__compressed).toBe(false);
|
|
317
|
-
// Act - dekompresuj
|
|
318
|
-
const result = yield service.decompressCommand(notCompressed);
|
|
319
|
-
// Assert
|
|
320
|
-
expect(result).toBe(notCompressed); // Ten sam obiekt
|
|
321
|
-
expect(result.__payload.data).toBe('not compressed');
|
|
322
|
-
}));
|
|
323
|
-
it('rzuca błąd gdy brak __compressedData przy __compressed=true', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
324
|
-
// Arrange
|
|
325
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
326
|
-
const invalidCommand = new TestCommand({ data: 'test' });
|
|
327
|
-
invalidCommand.__compressed = true;
|
|
328
|
-
// Brak __compressedData - błąd
|
|
329
|
-
// Act & Assert
|
|
330
|
-
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
331
|
-
yield service.decompressCommand(invalidCommand);
|
|
332
|
-
})).rejects.toThrow('Missing compressed data');
|
|
333
|
-
}));
|
|
334
|
-
it('rzuca błąd gdy corrupted compressed data', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
335
|
-
// Arrange
|
|
336
|
-
service = new payload_compression_service_1.default(1024, mockLogger);
|
|
337
|
-
const corruptedCommand = new TestCommand({ data: 'test' });
|
|
338
|
-
corruptedCommand.__compressed = true;
|
|
339
|
-
corruptedCommand.__compressedData = 'invalid-corrupted-base64-data!!!';
|
|
340
|
-
// Act & Assert
|
|
341
|
-
yield expect(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
342
|
-
yield service.decompressCommand(corruptedCommand);
|
|
343
|
-
})).rejects.toThrow('Failed to decompress payload');
|
|
344
|
-
}));
|
|
345
|
-
});
|
|
346
|
-
describe('compressCommand/decompressCommand - round-trip', () => {
|
|
347
|
-
it('compress → decompress zachowuje dane Command', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
348
|
-
// Arrange
|
|
349
|
-
service = new payload_compression_service_1.default(100, mockLogger);
|
|
350
|
-
const items = Array.from({ length: 100 }, (_, i) => `test-item-${i}-with-description`);
|
|
351
|
-
const original = new TestCommand({ data: 'test data', items });
|
|
352
|
-
// Act
|
|
353
|
-
const compressed = yield service.compressCommand(original);
|
|
354
|
-
const decompressed = yield service.decompressCommand(compressed);
|
|
355
|
-
// Assert
|
|
356
|
-
expect(decompressed.__payload.data).toBe('test data');
|
|
357
|
-
expect(decompressed.__payload.items).toEqual(items);
|
|
358
|
-
expect(decompressed.__id).toBe(original.__id);
|
|
359
|
-
expect(decompressed.__name).toBe(original.__name);
|
|
360
|
-
expect(decompressed.__time).toBe(original.__time);
|
|
361
|
-
}));
|
|
362
|
-
it('działa poprawnie dla małych Command (bez kompresji)', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
363
|
-
// Arrange
|
|
364
|
-
service = new payload_compression_service_1.default(10000, mockLogger);
|
|
365
|
-
const original = new TestCommand({ data: 'small' });
|
|
366
|
-
// Act
|
|
367
|
-
const compressed = yield service.compressCommand(original);
|
|
368
|
-
const decompressed = yield service.decompressCommand(compressed);
|
|
369
|
-
// Assert
|
|
370
|
-
expect(compressed.__compressed).toBe(false);
|
|
371
|
-
expect(decompressed.__payload.data).toBe('small');
|
|
372
|
-
expect(decompressed.__id).toBe(original.__id);
|
|
373
|
-
}));
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
//# sourceMappingURL=payload-compression.service.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"payload-compression.service.spec.js","sourceRoot":"","sources":["../../../src/command-bus/rpc/payload-compression.service.spec.ts"],"names":[],"mappings":"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"}
|