@durable-streams/client-conformance-tests 0.1.1 → 0.1.2

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.
@@ -0,0 +1,472 @@
1
+ //#region src/protocol.d.ts
2
+ /**
3
+ * Protocol types for client conformance testing.
4
+ *
5
+ * This module defines the stdin/stdout protocol used for communication
6
+ * between the test runner and client adapters in any language.
7
+ *
8
+ * Communication is line-based JSON over stdin/stdout:
9
+ * - Test runner writes TestCommand as JSON line to client's stdin
10
+ * - Client writes TestResult as JSON line to stdout
11
+ * - Each command expects exactly one result
12
+ */
13
+ /**
14
+ * Initialize the client adapter with configuration.
15
+ * Must be the first command sent.
16
+ */
17
+ interface InitCommand {
18
+ type: `init`;
19
+ /** Base URL of the reference server */
20
+ serverUrl: string;
21
+ /** Optional timeout in milliseconds for operations */
22
+ timeoutMs?: number;
23
+ }
24
+ /**
25
+ * Create a new stream (PUT request).
26
+ */
27
+ interface CreateCommand {
28
+ type: `create`;
29
+ /** Full URL path for the stream (relative to serverUrl) */
30
+ path: string;
31
+ /** Content type for the stream */
32
+ contentType?: string;
33
+ /** Optional TTL in seconds */
34
+ ttlSeconds?: number;
35
+ /** Optional absolute expiry timestamp (ISO 8601) */
36
+ expiresAt?: string;
37
+ /** Custom headers to include */
38
+ headers?: Record<string, string>;
39
+ }
40
+ /**
41
+ * Connect to an existing stream without creating it.
42
+ */
43
+ interface ConnectCommand {
44
+ type: `connect`;
45
+ path: string;
46
+ headers?: Record<string, string>;
47
+ }
48
+ /**
49
+ * Append data to a stream (POST request).
50
+ */
51
+ interface AppendCommand {
52
+ type: `append`;
53
+ path: string;
54
+ /** Data to append - string for text, base64 for binary */
55
+ data: string;
56
+ /** Whether data is base64 encoded binary */
57
+ binary?: boolean;
58
+ /** Optional sequence number for ordering */
59
+ seq?: number;
60
+ /** Custom headers to include */
61
+ headers?: Record<string, string>;
62
+ }
63
+ /**
64
+ * Read from a stream (GET request).
65
+ */
66
+ interface ReadCommand {
67
+ type: `read`;
68
+ path: string;
69
+ /** Starting offset (opaque string from previous reads) */
70
+ offset?: string;
71
+ /** Live mode: false for catch-up only, "long-poll" or "sse" for live */
72
+ live?: false | `long-poll` | `sse`;
73
+ /** Timeout for long-poll in milliseconds */
74
+ timeoutMs?: number;
75
+ /** Maximum number of chunks to read (for testing) */
76
+ maxChunks?: number;
77
+ /** Whether to wait until up-to-date before returning */
78
+ waitForUpToDate?: boolean;
79
+ /** Custom headers to include */
80
+ headers?: Record<string, string>;
81
+ }
82
+ /**
83
+ * Get stream metadata (HEAD request).
84
+ */
85
+ interface HeadCommand {
86
+ type: `head`;
87
+ path: string;
88
+ headers?: Record<string, string>;
89
+ }
90
+ /**
91
+ * Delete a stream (DELETE request).
92
+ */
93
+ interface DeleteCommand {
94
+ type: `delete`;
95
+ path: string;
96
+ headers?: Record<string, string>;
97
+ }
98
+ /**
99
+ * Shutdown the client adapter gracefully.
100
+ */
101
+ interface ShutdownCommand {
102
+ type: `shutdown`;
103
+ }
104
+ /**
105
+ * Configure a dynamic header that is evaluated per-request.
106
+ * The adapter should store this and apply it to subsequent operations.
107
+ *
108
+ * This tests the client's ability to support header functions for scenarios
109
+ * like OAuth token refresh, request correlation IDs, etc.
110
+ */
111
+ interface SetDynamicHeaderCommand {
112
+ type: `set-dynamic-header`;
113
+ /** Header name to set */
114
+ name: string;
115
+ /** Type of dynamic value */
116
+ valueType: `counter` | `timestamp` | `token`;
117
+ /** Initial value (for token type) */
118
+ initialValue?: string;
119
+ }
120
+ /**
121
+ * Configure a dynamic URL parameter that is evaluated per-request.
122
+ */
123
+ interface SetDynamicParamCommand {
124
+ type: `set-dynamic-param`;
125
+ /** Param name to set */
126
+ name: string;
127
+ /** Type of dynamic value */
128
+ valueType: `counter` | `timestamp`;
129
+ }
130
+ /**
131
+ * Clear all dynamic headers and params.
132
+ */
133
+ interface ClearDynamicCommand {
134
+ type: `clear-dynamic`;
135
+ }
136
+ /**
137
+ * Execute a timed benchmark operation.
138
+ * The adapter times the operation internally using high-resolution timing.
139
+ */
140
+ interface BenchmarkCommand {
141
+ type: `benchmark`;
142
+ /** Unique ID for this benchmark iteration */
143
+ iterationId: string;
144
+ /** The operation to benchmark */
145
+ operation: BenchmarkOperation;
146
+ }
147
+ /**
148
+ * Benchmark operation types - what to measure.
149
+ */
150
+ type BenchmarkOperation = BenchmarkAppendOp | BenchmarkReadOp | BenchmarkRoundtripOp | BenchmarkCreateOp | BenchmarkThroughputAppendOp | BenchmarkThroughputReadOp;
151
+ interface BenchmarkAppendOp {
152
+ op: `append`;
153
+ path: string;
154
+ /** Size in bytes - adapter generates random payload */
155
+ size: number;
156
+ }
157
+ interface BenchmarkReadOp {
158
+ op: `read`;
159
+ path: string;
160
+ offset?: string;
161
+ }
162
+ interface BenchmarkRoundtripOp {
163
+ op: `roundtrip`;
164
+ path: string;
165
+ /** Size in bytes */
166
+ size: number;
167
+ /** Live mode for reading */
168
+ live?: `long-poll` | `sse`;
169
+ /** Content type for SSE compatibility */
170
+ contentType?: string;
171
+ }
172
+ interface BenchmarkCreateOp {
173
+ op: `create`;
174
+ path: string;
175
+ contentType?: string;
176
+ }
177
+ interface BenchmarkThroughputAppendOp {
178
+ op: `throughput_append`;
179
+ path: string;
180
+ /** Number of messages to send */
181
+ count: number;
182
+ /** Size per message in bytes */
183
+ size: number;
184
+ /** Concurrency level */
185
+ concurrency: number;
186
+ }
187
+ interface BenchmarkThroughputReadOp {
188
+ op: `throughput_read`;
189
+ path: string;
190
+ /** Expected number of JSON messages to read and parse */
191
+ expectedCount?: number;
192
+ }
193
+ /**
194
+ * All possible commands from test runner to client.
195
+ */
196
+ type TestCommand = InitCommand | CreateCommand | ConnectCommand | AppendCommand | ReadCommand | HeadCommand | DeleteCommand | ShutdownCommand | SetDynamicHeaderCommand | SetDynamicParamCommand | ClearDynamicCommand | BenchmarkCommand;
197
+ /**
198
+ * Successful initialization result.
199
+ */
200
+ interface InitResult {
201
+ type: `init`;
202
+ success: true;
203
+ /** Client implementation name (e.g., "typescript", "python", "go") */
204
+ clientName: string;
205
+ /** Client implementation version */
206
+ clientVersion: string;
207
+ /** Supported features */
208
+ features?: {
209
+ /** Supports automatic batching */
210
+ batching?: boolean;
211
+ /** Supports SSE mode */
212
+ sse?: boolean;
213
+ /** Supports long-poll mode */
214
+ longPoll?: boolean;
215
+ /** Supports streaming reads */
216
+ streaming?: boolean;
217
+ /** Supports dynamic headers/params (functions evaluated per-request) */
218
+ dynamicHeaders?: boolean;
219
+ };
220
+ }
221
+ /**
222
+ * Successful create result.
223
+ */
224
+ interface CreateResult {
225
+ type: `create`;
226
+ success: true;
227
+ /** HTTP status code received */
228
+ status: number;
229
+ /** Stream offset after creation */
230
+ offset?: string;
231
+ /** Response headers of interest */
232
+ headers?: Record<string, string>;
233
+ }
234
+ /**
235
+ * Successful connect result.
236
+ */
237
+ interface ConnectResult {
238
+ type: `connect`;
239
+ success: true;
240
+ status: number;
241
+ offset?: string;
242
+ headers?: Record<string, string>;
243
+ }
244
+ /**
245
+ * Successful append result.
246
+ */
247
+ interface AppendResult {
248
+ type: `append`;
249
+ success: true;
250
+ status: number;
251
+ /** New offset after append */
252
+ offset?: string;
253
+ /** Response headers */
254
+ headers?: Record<string, string>;
255
+ /** Headers that were sent in the request (for dynamic header testing) */
256
+ headersSent?: Record<string, string>;
257
+ /** Params that were sent in the request (for dynamic param testing) */
258
+ paramsSent?: Record<string, string>;
259
+ }
260
+ /**
261
+ * A chunk of data read from the stream.
262
+ */
263
+ interface ReadChunk {
264
+ /** Data content - string for text, base64 for binary */
265
+ data: string;
266
+ /** Whether data is base64 encoded */
267
+ binary?: boolean;
268
+ /** Offset of this chunk */
269
+ offset?: string;
270
+ }
271
+ /**
272
+ * Successful read result.
273
+ */
274
+ interface ReadResult {
275
+ type: `read`;
276
+ success: true;
277
+ status: number;
278
+ /** Chunks of data read */
279
+ chunks: Array<ReadChunk>;
280
+ /** Final offset after reading */
281
+ offset?: string;
282
+ /** Whether stream is up-to-date (caught up to head) */
283
+ upToDate?: boolean;
284
+ /** Cursor value if provided */
285
+ cursor?: string;
286
+ /** Response headers */
287
+ headers?: Record<string, string>;
288
+ /** Headers that were sent in the request (for dynamic header testing) */
289
+ headersSent?: Record<string, string>;
290
+ /** Params that were sent in the request (for dynamic param testing) */
291
+ paramsSent?: Record<string, string>;
292
+ }
293
+ /**
294
+ * Successful head result.
295
+ */
296
+ interface HeadResult {
297
+ type: `head`;
298
+ success: true;
299
+ status: number;
300
+ /** Current tail offset */
301
+ offset?: string;
302
+ /** Stream content type */
303
+ contentType?: string;
304
+ /** TTL remaining in seconds */
305
+ ttlSeconds?: number;
306
+ /** Absolute expiry (ISO 8601) */
307
+ expiresAt?: string;
308
+ headers?: Record<string, string>;
309
+ }
310
+ /**
311
+ * Successful delete result.
312
+ */
313
+ interface DeleteResult {
314
+ type: `delete`;
315
+ success: true;
316
+ status: number;
317
+ headers?: Record<string, string>;
318
+ }
319
+ /**
320
+ * Successful shutdown result.
321
+ */
322
+ interface ShutdownResult {
323
+ type: `shutdown`;
324
+ success: true;
325
+ }
326
+ /**
327
+ * Successful set-dynamic-header result.
328
+ */
329
+ interface SetDynamicHeaderResult {
330
+ type: `set-dynamic-header`;
331
+ success: true;
332
+ }
333
+ /**
334
+ * Successful set-dynamic-param result.
335
+ */
336
+ interface SetDynamicParamResult {
337
+ type: `set-dynamic-param`;
338
+ success: true;
339
+ }
340
+ /**
341
+ * Successful clear-dynamic result.
342
+ */
343
+ interface ClearDynamicResult {
344
+ type: `clear-dynamic`;
345
+ success: true;
346
+ }
347
+ /**
348
+ * Successful benchmark result with timing.
349
+ */
350
+ interface BenchmarkResult {
351
+ type: `benchmark`;
352
+ success: true;
353
+ iterationId: string;
354
+ /** Timing in nanoseconds (as string since bigint doesn't JSON serialize) */
355
+ durationNs: string;
356
+ /** Optional metrics */
357
+ metrics?: {
358
+ /** Bytes transferred */
359
+ bytesTransferred?: number;
360
+ /** Messages processed */
361
+ messagesProcessed?: number;
362
+ /** Operations per second (for throughput tests) */
363
+ opsPerSecond?: number;
364
+ /** Bytes per second (for throughput tests) */
365
+ bytesPerSecond?: number;
366
+ };
367
+ }
368
+ /**
369
+ * Error result for any failed operation.
370
+ */
371
+ interface ErrorResult {
372
+ type: `error`;
373
+ success: false;
374
+ /** Original command type that failed */
375
+ commandType: TestCommand[`type`];
376
+ /** HTTP status code if available */
377
+ status?: number;
378
+ /** Error code (e.g., "NETWORK_ERROR", "TIMEOUT", "CONFLICT") */
379
+ errorCode: string;
380
+ /** Human-readable error message */
381
+ message: string;
382
+ /** Additional error details */
383
+ details?: Record<string, unknown>;
384
+ }
385
+ /**
386
+ * All possible results from client to test runner.
387
+ */
388
+ type TestResult = InitResult | CreateResult | ConnectResult | AppendResult | ReadResult | HeadResult | DeleteResult | ShutdownResult | SetDynamicHeaderResult | SetDynamicParamResult | ClearDynamicResult | BenchmarkResult | ErrorResult;
389
+ /**
390
+ * Parse a JSON line into a TestCommand.
391
+ */
392
+ declare function parseCommand(line: string): TestCommand;
393
+ /**
394
+ * Serialize a TestResult to a JSON line.
395
+ */
396
+ declare function serializeResult(result: TestResult): string;
397
+ /**
398
+ * Parse a JSON line into a TestResult.
399
+ */
400
+ declare function parseResult(line: string): TestResult;
401
+ /**
402
+ * Serialize a TestCommand to a JSON line.
403
+ */
404
+ declare function serializeCommand(command: TestCommand): string;
405
+ /**
406
+ * Encode binary data to base64 for transmission.
407
+ */
408
+ declare function encodeBase64(data: Uint8Array): string;
409
+ /**
410
+ * Decode base64 string back to binary data.
411
+ */
412
+ declare function decodeBase64(encoded: string): Uint8Array;
413
+ /**
414
+ * Standard error codes for ErrorResult.
415
+ */
416
+ declare const ErrorCodes: {
417
+ /** Network connection failed */
418
+ readonly NETWORK_ERROR: "NETWORK_ERROR";
419
+ /** Operation timed out */
420
+ readonly TIMEOUT: "TIMEOUT";
421
+ /** Stream already exists (409 Conflict) */
422
+ readonly CONFLICT: "CONFLICT";
423
+ /** Stream not found (404) */
424
+ readonly NOT_FOUND: "NOT_FOUND";
425
+ /** Sequence number conflict (409) */
426
+ readonly SEQUENCE_CONFLICT: "SEQUENCE_CONFLICT";
427
+ /** Invalid offset format */
428
+ readonly INVALID_OFFSET: "INVALID_OFFSET";
429
+ /** Server returned unexpected status */
430
+ readonly UNEXPECTED_STATUS: "UNEXPECTED_STATUS";
431
+ /** Failed to parse response */
432
+ readonly PARSE_ERROR: "PARSE_ERROR";
433
+ /** Client internal error */
434
+ readonly INTERNAL_ERROR: "INTERNAL_ERROR";
435
+ /** Operation not supported by this client */
436
+ readonly NOT_SUPPORTED: "NOT_SUPPORTED";
437
+ };
438
+ type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
439
+ /**
440
+ * Statistical summary of benchmark results.
441
+ */
442
+ interface BenchmarkStats {
443
+ /** Minimum value in milliseconds */
444
+ min: number;
445
+ /** Maximum value in milliseconds */
446
+ max: number;
447
+ /** Arithmetic mean in milliseconds */
448
+ mean: number;
449
+ /** Median (p50) in milliseconds */
450
+ median: number;
451
+ /** 75th percentile in milliseconds */
452
+ p75: number;
453
+ /** 95th percentile in milliseconds */
454
+ p95: number;
455
+ /** 99th percentile in milliseconds */
456
+ p99: number;
457
+ /** Standard deviation in milliseconds */
458
+ stdDev: number;
459
+ /** Margin of error (95% confidence) in milliseconds */
460
+ marginOfError: number;
461
+ /** Number of samples */
462
+ sampleCount: number;
463
+ }
464
+ /**
465
+ * Calculate statistics from an array of durations in nanoseconds.
466
+ */
467
+ declare function calculateStats(durationsNs: Array<bigint>): BenchmarkStats;
468
+ /**
469
+ * Format a BenchmarkStats object for display.
470
+ */
471
+ declare function formatStats(stats: BenchmarkStats, unit?: string): Record<string, string>; //#endregion
472
+ export { AppendCommand, AppendResult, BenchmarkAppendOp, BenchmarkCommand, BenchmarkCreateOp, BenchmarkOperation, BenchmarkReadOp, BenchmarkResult, BenchmarkRoundtripOp, BenchmarkStats, BenchmarkThroughputAppendOp, BenchmarkThroughputReadOp, ClearDynamicCommand, ClearDynamicResult, ConnectCommand, ConnectResult, CreateCommand, CreateResult, DeleteCommand, DeleteResult, ErrorCode, ErrorCodes, ErrorResult, HeadCommand, HeadResult, InitCommand, InitResult, ReadChunk, ReadCommand, ReadResult, SetDynamicHeaderCommand, SetDynamicHeaderResult, SetDynamicParamCommand, SetDynamicParamResult, ShutdownCommand, ShutdownResult, TestCommand, TestResult, calculateStats, decodeBase64, encodeBase64, formatStats, parseCommand, parseResult, serializeCommand, serializeResult };
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+
3
+ //#region src/protocol.ts
4
+ /**
5
+ * Parse a JSON line into a TestCommand.
6
+ */
7
+ function parseCommand(line) {
8
+ return JSON.parse(line);
9
+ }
10
+ /**
11
+ * Serialize a TestResult to a JSON line.
12
+ */
13
+ function serializeResult(result) {
14
+ return JSON.stringify(result);
15
+ }
16
+ /**
17
+ * Parse a JSON line into a TestResult.
18
+ */
19
+ function parseResult(line) {
20
+ return JSON.parse(line);
21
+ }
22
+ /**
23
+ * Serialize a TestCommand to a JSON line.
24
+ */
25
+ function serializeCommand(command) {
26
+ return JSON.stringify(command);
27
+ }
28
+ /**
29
+ * Encode binary data to base64 for transmission.
30
+ */
31
+ function encodeBase64(data) {
32
+ return Buffer.from(data).toString(`base64`);
33
+ }
34
+ /**
35
+ * Decode base64 string back to binary data.
36
+ */
37
+ function decodeBase64(encoded) {
38
+ return new Uint8Array(Buffer.from(encoded, `base64`));
39
+ }
40
+ /**
41
+ * Standard error codes for ErrorResult.
42
+ */
43
+ const ErrorCodes = {
44
+ NETWORK_ERROR: `NETWORK_ERROR`,
45
+ TIMEOUT: `TIMEOUT`,
46
+ CONFLICT: `CONFLICT`,
47
+ NOT_FOUND: `NOT_FOUND`,
48
+ SEQUENCE_CONFLICT: `SEQUENCE_CONFLICT`,
49
+ INVALID_OFFSET: `INVALID_OFFSET`,
50
+ UNEXPECTED_STATUS: `UNEXPECTED_STATUS`,
51
+ PARSE_ERROR: `PARSE_ERROR`,
52
+ INTERNAL_ERROR: `INTERNAL_ERROR`,
53
+ NOT_SUPPORTED: `NOT_SUPPORTED`
54
+ };
55
+ /**
56
+ * Calculate statistics from an array of durations in nanoseconds.
57
+ */
58
+ function calculateStats(durationsNs) {
59
+ if (durationsNs.length === 0) return {
60
+ min: 0,
61
+ max: 0,
62
+ mean: 0,
63
+ median: 0,
64
+ p75: 0,
65
+ p95: 0,
66
+ p99: 0,
67
+ stdDev: 0,
68
+ marginOfError: 0,
69
+ sampleCount: 0
70
+ };
71
+ const samplesMs = durationsNs.map((ns) => Number(ns) / 1e6);
72
+ const sorted = [...samplesMs].sort((a, b) => a - b);
73
+ const n = sorted.length;
74
+ const min = sorted[0];
75
+ const max = sorted[n - 1];
76
+ const mean = samplesMs.reduce((a, b) => a + b, 0) / n;
77
+ const percentile = (p) => {
78
+ const idx = Math.floor((n - 1) * p);
79
+ return sorted[idx];
80
+ };
81
+ const median = percentile(.5);
82
+ const p75 = percentile(.75);
83
+ const p95 = percentile(.95);
84
+ const p99 = percentile(.99);
85
+ const squaredDiffs = samplesMs.map((v) => Math.pow(v - mean, 2));
86
+ const variance = squaredDiffs.reduce((a, b) => a + b, 0) / n;
87
+ const stdDev = Math.sqrt(variance);
88
+ const marginOfError = 1.96 * stdDev / Math.sqrt(n);
89
+ return {
90
+ min,
91
+ max,
92
+ mean,
93
+ median,
94
+ p75,
95
+ p95,
96
+ p99,
97
+ stdDev,
98
+ marginOfError,
99
+ sampleCount: n
100
+ };
101
+ }
102
+ /**
103
+ * Format a BenchmarkStats object for display.
104
+ */
105
+ function formatStats(stats, unit = `ms`) {
106
+ const fmt = (v) => `${v.toFixed(2)} ${unit}`;
107
+ return {
108
+ Min: fmt(stats.min),
109
+ Max: fmt(stats.max),
110
+ Mean: fmt(stats.mean),
111
+ Median: fmt(stats.median),
112
+ P75: fmt(stats.p75),
113
+ P95: fmt(stats.p95),
114
+ P99: fmt(stats.p99),
115
+ StdDev: fmt(stats.stdDev),
116
+ "Margin of Error": fmt(stats.marginOfError),
117
+ Samples: stats.sampleCount.toString()
118
+ };
119
+ }
120
+
121
+ //#endregion
122
+ Object.defineProperty(exports, 'ErrorCodes', {
123
+ enumerable: true,
124
+ get: function () {
125
+ return ErrorCodes;
126
+ }
127
+ });
128
+ Object.defineProperty(exports, 'calculateStats', {
129
+ enumerable: true,
130
+ get: function () {
131
+ return calculateStats;
132
+ }
133
+ });
134
+ Object.defineProperty(exports, 'decodeBase64', {
135
+ enumerable: true,
136
+ get: function () {
137
+ return decodeBase64;
138
+ }
139
+ });
140
+ Object.defineProperty(exports, 'encodeBase64', {
141
+ enumerable: true,
142
+ get: function () {
143
+ return encodeBase64;
144
+ }
145
+ });
146
+ Object.defineProperty(exports, 'formatStats', {
147
+ enumerable: true,
148
+ get: function () {
149
+ return formatStats;
150
+ }
151
+ });
152
+ Object.defineProperty(exports, 'parseCommand', {
153
+ enumerable: true,
154
+ get: function () {
155
+ return parseCommand;
156
+ }
157
+ });
158
+ Object.defineProperty(exports, 'parseResult', {
159
+ enumerable: true,
160
+ get: function () {
161
+ return parseResult;
162
+ }
163
+ });
164
+ Object.defineProperty(exports, 'serializeCommand', {
165
+ enumerable: true,
166
+ get: function () {
167
+ return serializeCommand;
168
+ }
169
+ });
170
+ Object.defineProperty(exports, 'serializeResult', {
171
+ enumerable: true,
172
+ get: function () {
173
+ return serializeResult;
174
+ }
175
+ });
@@ -0,0 +1,11 @@
1
+ const require_protocol = require('./protocol-XeAOKBD-.cjs');
2
+
3
+ exports.ErrorCodes = require_protocol.ErrorCodes
4
+ exports.calculateStats = require_protocol.calculateStats
5
+ exports.decodeBase64 = require_protocol.decodeBase64
6
+ exports.encodeBase64 = require_protocol.encodeBase64
7
+ exports.formatStats = require_protocol.formatStats
8
+ exports.parseCommand = require_protocol.parseCommand
9
+ exports.parseResult = require_protocol.parseResult
10
+ exports.serializeCommand = require_protocol.serializeCommand
11
+ exports.serializeResult = require_protocol.serializeResult
@@ -0,0 +1,2 @@
1
+ import { AppendCommand, AppendResult, BenchmarkAppendOp, BenchmarkCommand, BenchmarkCreateOp, BenchmarkOperation, BenchmarkReadOp, BenchmarkResult, BenchmarkRoundtripOp, BenchmarkStats, BenchmarkThroughputAppendOp, BenchmarkThroughputReadOp, ClearDynamicCommand, ClearDynamicResult, ConnectCommand, ConnectResult, CreateCommand, CreateResult, DeleteCommand, DeleteResult, ErrorCode, ErrorCodes, ErrorResult, HeadCommand, HeadResult, InitCommand, InitResult, ReadChunk, ReadCommand, ReadResult, SetDynamicHeaderCommand, SetDynamicHeaderResult, SetDynamicParamCommand, SetDynamicParamResult, ShutdownCommand, ShutdownResult, TestCommand, TestResult, calculateStats, decodeBase64, encodeBase64, formatStats, parseCommand, parseResult, serializeCommand, serializeResult } from "./protocol-3cf94Xyb.cjs";
2
+ export { AppendCommand, AppendResult, BenchmarkAppendOp, BenchmarkCommand, BenchmarkCreateOp, BenchmarkOperation, BenchmarkReadOp, BenchmarkResult, BenchmarkRoundtripOp, BenchmarkStats, BenchmarkThroughputAppendOp, BenchmarkThroughputReadOp, ClearDynamicCommand, ClearDynamicResult, ConnectCommand, ConnectResult, CreateCommand, CreateResult, DeleteCommand, DeleteResult, ErrorCode, ErrorCodes, ErrorResult, HeadCommand, HeadResult, InitCommand, InitResult, ReadChunk, ReadCommand, ReadResult, SetDynamicHeaderCommand, SetDynamicHeaderResult, SetDynamicParamCommand, SetDynamicParamResult, ShutdownCommand, ShutdownResult, TestCommand, TestResult, calculateStats, decodeBase64, encodeBase64, formatStats, parseCommand, parseResult, serializeCommand, serializeResult };