@laserdata/laser-sdk 0.3.2 → 0.4.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 +38 -24
- package/dist/agent/reliable-consumer.d.ts.map +1 -1
- package/dist/agent/reliable-consumer.js +0 -1
- package/dist/agent/reliable-consumer.js.map +1 -1
- package/dist/agent/router.d.ts.map +1 -1
- package/dist/agent/router.js +0 -1
- package/dist/agent/router.js.map +1 -1
- package/dist/bridges/a2a.d.ts +1 -1
- package/dist/bridges/a2a.js +1 -1
- package/dist/client/laser.d.ts +11 -0
- package/dist/client/laser.d.ts.map +1 -1
- package/dist/client/laser.js +25 -3
- package/dist/client/laser.js.map +1 -1
- package/dist/client/publish-options.d.ts +8 -0
- package/dist/client/publish-options.d.ts.map +1 -0
- package/dist/client/publish-options.js +43 -0
- package/dist/client/publish-options.js.map +1 -0
- package/dist/context-scope.d.ts +8 -2
- package/dist/context-scope.d.ts.map +1 -1
- package/dist/context-scope.js +12 -1
- package/dist/context-scope.js.map +1 -1
- package/dist/context.d.ts +29 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +85 -3
- package/dist/context.js.map +1 -1
- package/dist/conversation-state.d.ts +7 -1
- package/dist/conversation-state.d.ts.map +1 -1
- package/dist/conversation-state.js +6 -0
- package/dist/conversation-state.js.map +1 -1
- package/dist/iggy/apache-iggy.d.ts +18 -4
- package/dist/iggy/apache-iggy.d.ts.map +1 -1
- package/dist/iggy/apache-iggy.js +150 -43
- package/dist/iggy/apache-iggy.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts +102 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +161 -0
- package/dist/session.js.map +1 -0
- package/dist/stream/cursor.d.ts +3 -0
- package/dist/stream/cursor.d.ts.map +1 -1
- package/dist/stream/cursor.js +37 -4
- package/dist/stream/cursor.js.map +1 -1
- package/dist/stream/producer.d.ts +1 -0
- package/dist/stream/producer.d.ts.map +1 -1
- package/dist/stream/producer.js +10 -0
- package/dist/stream/producer.js.map +1 -1
- package/dist/stream/topic.d.ts +5 -0
- package/dist/stream/topic.d.ts.map +1 -1
- package/dist/stream/topic.js +15 -0
- package/dist/stream/topic.js.map +1 -1
- package/package.json +9 -9
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAKxD,MAAM,UAAU,GAAG,KAAK,CAAA;AAExB,gFAAgF;AAChF,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,gBAAgB;AAChB,MAAM,mBAAmB,GAAG,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
import type { Laser } from "./client/laser.js";
|
|
2
|
-
import { type ContextMessage } from "./context.js";
|
|
2
|
+
import { type Checkpoint, type ContextMessage } from "./context.js";
|
|
3
3
|
import type { SnapshotStore } from "./snapshot.js";
|
|
4
4
|
import type { ConversationId } from "./types/ids.js";
|
|
5
5
|
import { type FoldSnapshot } from "./wire/snapshot.js";
|
|
6
6
|
export type ReplayBound = {
|
|
7
7
|
readonly kind: "from-offsets";
|
|
8
8
|
readonly offsets: ReadonlyMap<number, bigint>;
|
|
9
|
+
} | {
|
|
10
|
+
readonly kind: "from-checkpoint";
|
|
11
|
+
readonly checkpoint: Checkpoint;
|
|
12
|
+
} | {
|
|
13
|
+
readonly kind: "at";
|
|
14
|
+
readonly checkpoint: Checkpoint;
|
|
9
15
|
} | {
|
|
10
16
|
readonly kind: "last";
|
|
11
17
|
readonly count: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-state.d.ts","sourceRoot":"","sources":["../src/conversation-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"conversation-state.d.ts","sourceRoot":"","sources":["../src/conversation-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAA2B,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEhF,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GACrE;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7B,eAAO,MAAM,WAAW,EAAE,WAA8B,CAAA;AAExD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAOjF;AAED,iBAAe,IAAI,CAAC,KAAK,EACvB,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,KAAK,EACd,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,KAAK,KAAK,GACrD,OAAO,CAAC,KAAK,CAAC,CAehB;AAED,iBAAe,QAAQ,CAAC,KAAK,EAC3B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,OAAO,EAAE,KAAK,EACd,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,EACzC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,KAAK,KAAK,GACrD,OAAO,CAAC,KAAK,CAAC,CAYhB;AAED,eAAO,MAAM,iBAAiB;;;CAA8B,CAAA"}
|
|
@@ -16,6 +16,12 @@ async function load(laser, conversation, topics, bound, initial, fold) {
|
|
|
16
16
|
if (bound.kind === "from-offsets") {
|
|
17
17
|
builder.policy(new LastN(Number.MAX_SAFE_INTEGER)).fromOffsets(bound.offsets);
|
|
18
18
|
}
|
|
19
|
+
if (bound.kind === "from-checkpoint") {
|
|
20
|
+
builder.policy(new LastN(Number.MAX_SAFE_INTEGER)).fromCheckpoint(bound.checkpoint);
|
|
21
|
+
}
|
|
22
|
+
if (bound.kind === "at") {
|
|
23
|
+
builder.policy(new LastN(Number.MAX_SAFE_INTEGER)).toCheckpoint(bound.checkpoint);
|
|
24
|
+
}
|
|
19
25
|
const history = await builder.build().assemble(laser);
|
|
20
26
|
return history.reduce(fold, initial);
|
|
21
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-state.js","sourceRoot":"","sources":["../src/conversation-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"conversation-state.js","sourceRoot":"","sources":["../src/conversation-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAwC,MAAM,cAAc,CAAA;AAG5F,OAAO,EAAE,wBAAwB,EAAqB,MAAM,oBAAoB,CAAA;AAShF,MAAM,CAAC,MAAM,WAAW,GAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AAExD,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,OAAO,IAAI,GAAG,CACZ,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;QAC3C,SAAS;QACT,wBAAwB,CAAC,QAAQ,EAAE,SAAS,CAAC;KAC9C,CAAC,CACH,CAAA;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,KAAY,EACZ,YAA4B,EAC5B,MAAyB,EACzB,KAAkB,EAClB,OAAc,EACd,IAAsD;IAEtD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACrE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACjE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC7E,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC/E,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACtC,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,KAAY,EACZ,KAAoB,EACpB,YAA4B,EAC5B,MAAyB,EACzB,OAAc,EACd,WAAyC,EACzC,IAAsD;IAEtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IACjD,OAAO,IAAI,CACT,KAAK,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,EAC9D,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC9D,IAAI,CACL,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type PublishOptions } from "../client/publish-options.js";
|
|
1
2
|
import { SimpleClient } from "apache-iggy";
|
|
2
3
|
import type { ClientCredentials, SendMessagesConfirmation, SendMessagesResponse } from "apache-iggy";
|
|
3
4
|
import type { PollingStrategy } from "../stream/polling-strategy.js";
|
|
@@ -80,6 +81,7 @@ export type ConsumerOffsetTarget = {
|
|
|
80
81
|
readonly name: string;
|
|
81
82
|
};
|
|
82
83
|
export interface LaserTransport {
|
|
84
|
+
readonly publishRetriesManaged?: boolean;
|
|
83
85
|
readonly kind: "apache-iggy";
|
|
84
86
|
readonly iggyClient: SimpleClient;
|
|
85
87
|
sendManaged(code: number, payload: Uint8Array, options?: {
|
|
@@ -101,7 +103,7 @@ export interface LaserTransport {
|
|
|
101
103
|
sendMessages(streamId: string, topicId: string, payloads: readonly Uint8Array[], routing: Routing): Promise<SendMessagesResponse>;
|
|
102
104
|
/** Sends one message with exact headers and optional key or partition routing. */
|
|
103
105
|
sendMessageWithHeaders(streamId: string, topicId: string, payload: Uint8Array, headers: ReadonlyMap<string, IggyHeaderValue>, partitionKey?: string | Uint8Array, partitionId?: number): Promise<SendMessagesResponse>;
|
|
104
|
-
sendMessagesWithHeaders(streamId: string, topicId: string, messages: readonly MessageWithHeaders[], partitionKey?: string | Uint8Array, partitionId?: number): Promise<SendMessagesResponse>;
|
|
106
|
+
sendMessagesWithHeaders(streamId: string, topicId: string, messages: readonly MessageWithHeaders[], partitionKey?: string | Uint8Array, partitionId?: number, options?: Partial<PublishOptions>): Promise<SendMessagesResponse>;
|
|
105
107
|
pollMessages(streamId: string, topicId: string, target: ConsumerTarget, strategy: PollingStrategy, count: number, autoCommit: boolean): Promise<readonly PolledMessage[]>;
|
|
106
108
|
storeOffset(streamId: string, topicId: string, target: ConsumerTarget, partitionId: number, offset: bigint): Promise<void>;
|
|
107
109
|
getConsumerOffset?(streamId: string, topicId: string, target: ConsumerOffsetTarget, partitionId: number): Promise<{
|
|
@@ -125,12 +127,23 @@ interface ParsedConnectionString {
|
|
|
125
127
|
};
|
|
126
128
|
}
|
|
127
129
|
export declare function parseConnectionString(connectionString: string, env?: Readonly<Record<string, string | undefined>>): ParsedConnectionString;
|
|
130
|
+
export interface ClientConnectionEvents {
|
|
131
|
+
readonly redirecting: boolean;
|
|
132
|
+
on(event: "error", listener: (cause?: unknown) => void): void;
|
|
133
|
+
on(event: "disconnected", listener: (hadError: boolean) => void): void;
|
|
134
|
+
once(event: "error", listener: (cause?: unknown) => void): void;
|
|
135
|
+
off(event: "error", listener: (cause?: unknown) => void): void;
|
|
136
|
+
}
|
|
137
|
+
export declare function watchConnectionLoss(connection: ClientConnectionEvents, onLost: () => void): void;
|
|
128
138
|
export declare class ApacheIggyTransport implements LaserTransport {
|
|
129
139
|
private client;
|
|
130
140
|
private readonly connection;
|
|
131
141
|
private readonly ownership;
|
|
142
|
+
private readonly publishConfig;
|
|
132
143
|
readonly kind: "apache-iggy";
|
|
144
|
+
readonly publishRetriesManaged = true;
|
|
133
145
|
private readonly reconnectLock;
|
|
146
|
+
private readonly publishLane;
|
|
134
147
|
private readonly disconnected;
|
|
135
148
|
private readonly consumerGroups;
|
|
136
149
|
private readonly partitionCounts;
|
|
@@ -138,8 +151,8 @@ export declare class ApacheIggyTransport implements LaserTransport {
|
|
|
138
151
|
private closed;
|
|
139
152
|
private constructor();
|
|
140
153
|
get iggyClient(): SimpleClient;
|
|
141
|
-
static connect(connectionString: string): Promise<ApacheIggyTransport>;
|
|
142
|
-
static fromClient(client: SimpleClient, ownership?: ClientOwnership): Promise<ApacheIggyTransport>;
|
|
154
|
+
static connect(connectionString: string, options?: Partial<PublishOptions>): Promise<ApacheIggyTransport>;
|
|
155
|
+
static fromClient(client: SimpleClient, ownership?: ClientOwnership, options?: Partial<PublishOptions>): Promise<ApacheIggyTransport>;
|
|
143
156
|
private execute;
|
|
144
157
|
private reconnect;
|
|
145
158
|
private watch;
|
|
@@ -159,9 +172,10 @@ export declare class ApacheIggyTransport implements LaserTransport {
|
|
|
159
172
|
readonly stream: string;
|
|
160
173
|
readonly topic: string;
|
|
161
174
|
} | undefined>;
|
|
175
|
+
private publish;
|
|
162
176
|
sendMessages(streamId: string, topicId: string, payloads: readonly Uint8Array[], routing: Routing): Promise<SendMessagesResponse>;
|
|
163
177
|
sendMessageWithHeaders(streamId: string, topicId: string, payload: Uint8Array, headers: ReadonlyMap<string, IggyHeaderValue>, partitionKey?: string | Uint8Array, partitionId?: number): Promise<SendMessagesResponse>;
|
|
164
|
-
sendMessagesWithHeaders(streamId: string, topicId: string, messages: readonly MessageWithHeaders[], partitionKey?: string | Uint8Array, partitionId?: number): Promise<SendMessagesResponse>;
|
|
178
|
+
sendMessagesWithHeaders(streamId: string, topicId: string, messages: readonly MessageWithHeaders[], partitionKey?: string | Uint8Array, partitionId?: number, options?: Partial<PublishOptions>): Promise<SendMessagesResponse>;
|
|
165
179
|
pollMessages(streamId: string, topicId: string, target: ConsumerTarget, strategy: PollingStrategy, count: number, autoCommit: boolean): Promise<readonly PolledMessage[]>;
|
|
166
180
|
storeOffset(streamId: string, topicId: string, target: ConsumerTarget, partitionId: number, offset: bigint): Promise<void>;
|
|
167
181
|
getConsumerOffset(streamId: string, topicId: string, target: ConsumerOffsetTarget, partitionId: number): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apache-iggy.d.ts","sourceRoot":"","sources":["../../src/iggy/apache-iggy.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"apache-iggy.d.ts","sourceRoot":"","sources":["../../src/iggy/apache-iggy.ts"],"names":[],"mappings":"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"}
|
package/dist/iggy/apache-iggy.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { publishOptions, publishWithin } from "../client/publish-options.js";
|
|
2
|
+
import { Consumer, DeserializeError, HeaderKeyFactory, HeaderValue as IggyHeaderValueFactory, Partitioning, PollingStrategy as IggyPollingStrategy, SimpleClient, getRawClient } from "apache-iggy";
|
|
2
3
|
import { readFileSync } from "node:fs";
|
|
3
4
|
import { isIP } from "node:net";
|
|
4
|
-
import { AmbiguousMutationError, ConfigError, TransportError } from "../client/errors.js";
|
|
5
|
+
import { AmbiguousMutationError, ConfigError, TimeoutError, TransportError } from "../client/errors.js";
|
|
5
6
|
import { LASERDATA_ROOT_CA } from "../client/laserdata-ca.js";
|
|
6
7
|
import { Mutex } from "../runtime/mutex.js";
|
|
7
8
|
import { mintUlidValue } from "../runtime/ulid.js";
|
|
@@ -10,6 +11,8 @@ import { isIdempotentManagedRequest } from "../wire/codes.js";
|
|
|
10
11
|
import { MANAGED_REQUEST_VERSION, encodeManagedRequestEnvelope } from "../wire/mutation.js";
|
|
11
12
|
const DEFAULT_RECONNECT_INTERVAL_MS = 1_000;
|
|
12
13
|
const VSR_HEARTBEAT_INTERVAL_MS = 5_000;
|
|
14
|
+
const TRANSIENT_NOT_COMMITTED = 57;
|
|
15
|
+
const TRANSIENT_NOT_ACCEPTED = 58;
|
|
13
16
|
export function toNodeBuffer(bytes) {
|
|
14
17
|
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
15
18
|
}
|
|
@@ -279,7 +282,17 @@ export function parseConnectionString(connectionString, env = process.env) {
|
|
|
279
282
|
reconnection
|
|
280
283
|
};
|
|
281
284
|
}
|
|
282
|
-
|
|
285
|
+
// The client swaps sockets on its own when it follows a leader move or walks
|
|
286
|
+
// the roster. That drop is deliberate and nothing was lost, so retiring the
|
|
287
|
+
// client on it would abort the very send it is relocating.
|
|
288
|
+
export function watchConnectionLoss(connection, onLost) {
|
|
289
|
+
connection.on("disconnected", () => {
|
|
290
|
+
if (connection.redirecting)
|
|
291
|
+
return;
|
|
292
|
+
onLost();
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
async function connectSimpleClient(parsed, timeoutMs) {
|
|
283
296
|
const config = parsed.tls
|
|
284
297
|
? {
|
|
285
298
|
heartbeatInterval: VSR_HEARTBEAT_INTERVAL_MS,
|
|
@@ -310,7 +323,7 @@ async function connectSimpleClient(parsed) {
|
|
|
310
323
|
try {
|
|
311
324
|
const connection = raw.connection;
|
|
312
325
|
const client = new SimpleClient(raw);
|
|
313
|
-
|
|
326
|
+
const ready = new Promise((resolve, reject) => {
|
|
314
327
|
const failed = (cause) => {
|
|
315
328
|
reject(cause instanceof Error ? cause : new Error(String(cause)));
|
|
316
329
|
};
|
|
@@ -320,6 +333,7 @@ async function connectSimpleClient(parsed) {
|
|
|
320
333
|
resolve();
|
|
321
334
|
}, reject);
|
|
322
335
|
});
|
|
336
|
+
await (timeoutMs === undefined ? ready : publishWithin(ready, timeoutMs));
|
|
323
337
|
connection.on("error", () => undefined);
|
|
324
338
|
return { client, raw };
|
|
325
339
|
}
|
|
@@ -376,31 +390,37 @@ export class ApacheIggyTransport {
|
|
|
376
390
|
client;
|
|
377
391
|
connection;
|
|
378
392
|
ownership;
|
|
393
|
+
publishConfig;
|
|
379
394
|
kind = "apache-iggy";
|
|
395
|
+
publishRetriesManaged = true;
|
|
380
396
|
reconnectLock = new Mutex();
|
|
397
|
+
publishLane = new Mutex();
|
|
381
398
|
disconnected = new WeakSet();
|
|
382
399
|
consumerGroups = new Map();
|
|
383
400
|
partitionCounts = new Map();
|
|
384
401
|
balancedCursors = new Map();
|
|
385
402
|
closed = false;
|
|
386
|
-
constructor(client, connection, ownership) {
|
|
403
|
+
constructor(client, connection, ownership, publishConfig) {
|
|
387
404
|
this.client = client;
|
|
388
405
|
this.connection = connection;
|
|
389
406
|
this.ownership = ownership;
|
|
407
|
+
this.publishConfig = publishConfig;
|
|
390
408
|
}
|
|
391
409
|
get iggyClient() {
|
|
392
410
|
return this.client;
|
|
393
411
|
}
|
|
394
|
-
static async connect(connectionString) {
|
|
412
|
+
static async connect(connectionString, options) {
|
|
413
|
+
const config = publishOptions(options);
|
|
395
414
|
const parsed = parseConnectionString(connectionString);
|
|
396
415
|
const connected = await connectWithRetry(parsed);
|
|
397
|
-
const transport = new ApacheIggyTransport(connected.client, parsed, "owned");
|
|
416
|
+
const transport = new ApacheIggyTransport(connected.client, parsed, "owned", config);
|
|
398
417
|
transport.watch(connected);
|
|
399
418
|
return transport;
|
|
400
419
|
}
|
|
401
|
-
static async fromClient(client, ownership = "borrowed") {
|
|
420
|
+
static async fromClient(client, ownership = "borrowed", options) {
|
|
421
|
+
const config = publishOptions(options);
|
|
402
422
|
await client.clientProvider();
|
|
403
|
-
return new ApacheIggyTransport(client, undefined, ownership);
|
|
423
|
+
return new ApacheIggyTransport(client, undefined, ownership, config);
|
|
404
424
|
}
|
|
405
425
|
async execute(operation, message, retryAfterReconnect = true) {
|
|
406
426
|
const stale = this.client;
|
|
@@ -438,8 +458,10 @@ export class ApacheIggyTransport {
|
|
|
438
458
|
}
|
|
439
459
|
}
|
|
440
460
|
}
|
|
441
|
-
reconnect(stale) {
|
|
461
|
+
reconnect(stale, deadline) {
|
|
442
462
|
return this.reconnectLock.runExclusive(async () => {
|
|
463
|
+
if (deadline !== undefined && Date.now() >= deadline)
|
|
464
|
+
throw new TimeoutError("Iggy publish reconnect");
|
|
443
465
|
if (this.closed)
|
|
444
466
|
throw new TransportError("transport is closed", false);
|
|
445
467
|
if (this.client !== stale)
|
|
@@ -453,10 +475,16 @@ export class ApacheIggyTransport {
|
|
|
453
475
|
while (this.connection.reconnection.maxRetries === undefined ||
|
|
454
476
|
retries <= this.connection.reconnection.maxRetries) {
|
|
455
477
|
try {
|
|
456
|
-
const
|
|
478
|
+
const remaining = deadline === undefined ? undefined : deadline - Date.now();
|
|
479
|
+
if (remaining !== undefined && remaining <= 0)
|
|
480
|
+
throw new TimeoutError("Iggy publish reconnect");
|
|
481
|
+
const connected = await connectSimpleClient(this.connection, remaining);
|
|
457
482
|
try {
|
|
458
483
|
for (const group of this.consumerGroups.values()) {
|
|
459
|
-
|
|
484
|
+
const join = connected.client.group.ensureAndJoin(group.streamId, group.topicId, group.name);
|
|
485
|
+
await (deadline === undefined
|
|
486
|
+
? join
|
|
487
|
+
: publishWithin(join, Math.max(1, deadline - Date.now())));
|
|
460
488
|
}
|
|
461
489
|
}
|
|
462
490
|
catch (cause) {
|
|
@@ -469,6 +497,8 @@ export class ApacheIggyTransport {
|
|
|
469
497
|
}
|
|
470
498
|
catch (error) {
|
|
471
499
|
lastError = error;
|
|
500
|
+
if (deadline !== undefined && Date.now() >= deadline)
|
|
501
|
+
throw new TimeoutError("Iggy publish reconnect", { cause: error });
|
|
472
502
|
if (serverResponseError(error) !== undefined) {
|
|
473
503
|
break;
|
|
474
504
|
}
|
|
@@ -477,7 +507,7 @@ export class ApacheIggyTransport {
|
|
|
477
507
|
break;
|
|
478
508
|
}
|
|
479
509
|
retries += 1;
|
|
480
|
-
await new Promise((resolve) => setTimeout(resolve, this.connection?.reconnection.intervalMs ?? 0));
|
|
510
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(this.connection?.reconnection.intervalMs ?? 0, deadline === undefined ? Infinity : Math.max(0, deadline - Date.now()))));
|
|
481
511
|
}
|
|
482
512
|
}
|
|
483
513
|
const responseError = serverResponseError(lastError);
|
|
@@ -488,13 +518,9 @@ export class ApacheIggyTransport {
|
|
|
488
518
|
});
|
|
489
519
|
}
|
|
490
520
|
watch(connected) {
|
|
491
|
-
|
|
521
|
+
watchConnectionLoss(connected.raw.connection, () => {
|
|
492
522
|
this.disconnected.add(connected.client);
|
|
493
|
-
};
|
|
494
|
-
const stream = connected.raw.getReadStream();
|
|
495
|
-
stream.once("error", markDisconnected);
|
|
496
|
-
stream.once("end", markDisconnected);
|
|
497
|
-
stream.once("close", markDisconnected);
|
|
523
|
+
});
|
|
498
524
|
}
|
|
499
525
|
async sendManaged(code, payload, options) {
|
|
500
526
|
const request = isIdempotentManagedRequest(code)
|
|
@@ -561,20 +587,87 @@ export class ApacheIggyTransport {
|
|
|
561
587
|
const topic = await this.execute((client) => client.topic.get({ streamId, topicId }), `failed to resolve topic ${String(topicId)}`);
|
|
562
588
|
return topic === null ? undefined : { stream: stream.name, topic: topic.name };
|
|
563
589
|
}
|
|
590
|
+
async publish(operation, options) {
|
|
591
|
+
const config = { ...this.publishConfig, ...options };
|
|
592
|
+
for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {
|
|
593
|
+
let used = this.client;
|
|
594
|
+
try {
|
|
595
|
+
// One attempt holds the connection at a time. The Apache Iggy client
|
|
596
|
+
// follows a leader move by re-issuing every queued command, and two
|
|
597
|
+
// queued sends make it authenticate twice per hop, with the second
|
|
598
|
+
// login settling back on the metadata leader. A lone command walks the
|
|
599
|
+
// roster cleanly and stays on the partition primary that admits it.
|
|
600
|
+
return await this.publishLane.runExclusive(async () => {
|
|
601
|
+
const deadline = Date.now() + config.timeoutMs;
|
|
602
|
+
used = this.client;
|
|
603
|
+
if (this.closed)
|
|
604
|
+
throw new TransportError("transport is closed", false);
|
|
605
|
+
if (this.disconnected.has(used)) {
|
|
606
|
+
// Half the attempt budget goes to recovery so the send that follows
|
|
607
|
+
// always gets a real window. Spending it all here would leave a
|
|
608
|
+
// one-millisecond send that times out on a healthy connection and
|
|
609
|
+
// retires it, and the next attempt would repeat that forever.
|
|
610
|
+
const recovery = Math.max(1, Math.floor(config.timeoutMs / 2));
|
|
611
|
+
await publishWithin(this.reconnect(used, Date.now() + recovery), recovery);
|
|
612
|
+
used = this.client;
|
|
613
|
+
}
|
|
614
|
+
return await publishWithin(operation(used), Math.max(1, deadline - Date.now()));
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
catch (cause) {
|
|
618
|
+
const response = serverResponseError(cause);
|
|
619
|
+
const code = response !== undefined && "errorCode" in response ? response.errorCode : undefined;
|
|
620
|
+
const transient = code === TRANSIENT_NOT_COMMITTED || code === TRANSIENT_NOT_ACCEPTED;
|
|
621
|
+
const retryable = transient ||
|
|
622
|
+
(response === undefined &&
|
|
623
|
+
!(cause instanceof DeserializeError) &&
|
|
624
|
+
!(cause instanceof ConfigError) &&
|
|
625
|
+
!(cause instanceof TransportError && !cause.retryable));
|
|
626
|
+
// Retire the connection this attempt ran on, and only while it is still
|
|
627
|
+
// the current one. A concurrent publish may already have replaced it,
|
|
628
|
+
// and destroying that fresh connection would starve every publisher for
|
|
629
|
+
// as long as failures keep arriving.
|
|
630
|
+
if (response === undefined && retryable && this.client === used) {
|
|
631
|
+
this.disconnected.add(used);
|
|
632
|
+
// Destroy before retry so a timed-out queued write cannot run on the old socket.
|
|
633
|
+
await used.destroy().catch(() => undefined);
|
|
634
|
+
}
|
|
635
|
+
if (!retryable ||
|
|
636
|
+
attempt === config.maxRetries ||
|
|
637
|
+
(this.connection === undefined && !transient)) {
|
|
638
|
+
if (cause instanceof TimeoutError)
|
|
639
|
+
throw cause;
|
|
640
|
+
throw new TransportError("Iggy publish failed", retryable, { cause });
|
|
641
|
+
}
|
|
642
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(config.retryBackoffMs * 2 ** Math.min(attempt, 16), 30_000)));
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
throw new TransportError("publish attempts exhausted", true);
|
|
646
|
+
}
|
|
564
647
|
async sendMessages(streamId, topicId, payloads, routing) {
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
648
|
+
let partitionId;
|
|
649
|
+
const messages = payloads.map((payload) => ({
|
|
650
|
+
id: mintUlidValue(),
|
|
651
|
+
payload: toNodeBuffer(payload)
|
|
652
|
+
}));
|
|
653
|
+
return this.publish(async (client) => {
|
|
654
|
+
partitionId ??= await this.resolvePartition(streamId, topicId, routing, client);
|
|
655
|
+
if (this.disconnected.has(client))
|
|
656
|
+
throw new TransportError("publish connection was retired", true);
|
|
657
|
+
return client.message.send({
|
|
658
|
+
streamId,
|
|
659
|
+
topicId,
|
|
660
|
+
messages,
|
|
661
|
+
partition: Partitioning.PartitionId(partitionId)
|
|
662
|
+
});
|
|
663
|
+
});
|
|
572
664
|
}
|
|
573
665
|
async sendMessageWithHeaders(streamId, topicId, payload, headers, partitionKey, partitionId) {
|
|
574
666
|
return this.sendMessagesWithHeaders(streamId, topicId, [{ payload, headers }], partitionKey, partitionId);
|
|
575
667
|
}
|
|
576
|
-
async sendMessagesWithHeaders(streamId, topicId, messages, partitionKey, partitionId) {
|
|
577
|
-
|
|
668
|
+
async sendMessagesWithHeaders(streamId, topicId, messages, partitionKey, partitionId, options) {
|
|
669
|
+
let resolvedPartition;
|
|
670
|
+
const routing = partitionId !== undefined
|
|
578
671
|
? { kind: "partition", partition: partitionId }
|
|
579
672
|
: partitionKey !== undefined
|
|
580
673
|
? {
|
|
@@ -583,19 +676,26 @@ export class ApacheIggyTransport {
|
|
|
583
676
|
? new TextEncoder().encode(partitionKey)
|
|
584
677
|
: partitionKey
|
|
585
678
|
}
|
|
586
|
-
: { kind: "balanced" }
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
679
|
+
: { kind: "balanced" };
|
|
680
|
+
const prepared = messages.map(({ payload, headers }) => ({
|
|
681
|
+
id: mintUlidValue(),
|
|
682
|
+
payload: toNodeBuffer(payload),
|
|
683
|
+
headers: [...headers].map(([key, value]) => ({
|
|
684
|
+
key: HeaderKeyFactory.String(key),
|
|
685
|
+
value: toIggyHeaderValue(value)
|
|
686
|
+
}))
|
|
687
|
+
}));
|
|
688
|
+
return this.publish(async (client) => {
|
|
689
|
+
resolvedPartition ??= await this.resolvePartition(streamId, topicId, routing, client);
|
|
690
|
+
if (this.disconnected.has(client))
|
|
691
|
+
throw new TransportError("publish connection was retired", true);
|
|
692
|
+
return client.message.send({
|
|
693
|
+
streamId,
|
|
694
|
+
topicId,
|
|
695
|
+
messages: prepared,
|
|
696
|
+
partition: Partitioning.PartitionId(resolvedPartition)
|
|
697
|
+
});
|
|
698
|
+
}, options);
|
|
599
699
|
}
|
|
600
700
|
async pollMessages(streamId, topicId, target, strategy, count, autoCommit) {
|
|
601
701
|
const reply = await this.execute((client) => client.message.poll({
|
|
@@ -652,11 +752,18 @@ export class ApacheIggyTransport {
|
|
|
652
752
|
topicKey(streamId, topicId) {
|
|
653
753
|
return `${streamId}\0${topicId}`;
|
|
654
754
|
}
|
|
655
|
-
async resolvePartition(streamId, topicId, routing) {
|
|
755
|
+
async resolvePartition(streamId, topicId, routing, client) {
|
|
656
756
|
if (routing.kind === "partition")
|
|
657
757
|
return routing.partition;
|
|
658
758
|
const key = this.topicKey(streamId, topicId);
|
|
659
|
-
|
|
759
|
+
let partitionCount = this.partitionCounts.get(key);
|
|
760
|
+
if (partitionCount === undefined) {
|
|
761
|
+
const topic = await client.topic.get({ streamId, topicId });
|
|
762
|
+
if (topic === null)
|
|
763
|
+
throw new TransportError(`topic ${topicId} does not exist`, false);
|
|
764
|
+
partitionCount = topic.partitionsCount;
|
|
765
|
+
this.partitionCounts.set(key, partitionCount);
|
|
766
|
+
}
|
|
660
767
|
if (partitionCount <= 0) {
|
|
661
768
|
throw new TransportError(`topic \`${topicId}\` on stream \`${streamId}\` has no partitions`, false);
|
|
662
769
|
}
|