@haathie/pgmb 0.2.4 → 0.2.5
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/lib/client.d.ts +3 -2
- package/lib/client.js +4 -2
- package/lib/retry-handler.d.ts +2 -2
- package/lib/retry-handler.js +3 -2
- package/lib/types.d.ts +6 -1
- package/package.json +1 -1
package/lib/client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Logger } from 'pino';
|
|
2
2
|
import { PGMBEventBatcher } from './batcher.ts';
|
|
3
3
|
import type { PgClientLike } from './query-types.ts';
|
|
4
|
-
import type { GetWebhookInfoFn, IEphemeralListener, IEventData, IEventHandler, IReadEvent, IReadNextEventsFn, ISplitFn, Pgmb2ClientOpts, registerReliableHandlerParams, RegisterSubscriptionParams } from './types.ts';
|
|
4
|
+
import type { GetWebhookInfoFn, IEphemeralListener, IEventData, IEventHandler, IFindEventsFn, IReadEvent, IReadNextEventsFn, ISplitFn, Pgmb2ClientOpts, registerReliableHandlerParams, RegisterSubscriptionParams } from './types.ts';
|
|
5
5
|
type IReliableListener<T extends IEventData> = {
|
|
6
6
|
type: 'reliable';
|
|
7
7
|
handler: IEventHandler<T>;
|
|
@@ -39,12 +39,13 @@ export declare class PgmbClient<T extends IEventData = IEventData> extends PGMBE
|
|
|
39
39
|
readonly tableMaintenanceMs: number;
|
|
40
40
|
readonly maxActiveCheckpoints: number;
|
|
41
41
|
readonly readNextEvents: IReadNextEventsFn;
|
|
42
|
+
readonly findEvents?: IFindEventsFn;
|
|
42
43
|
readonly getWebhookInfo: GetWebhookInfoFn;
|
|
43
44
|
readonly webhookHandler: IEventHandler<T>;
|
|
44
45
|
readonly listeners: {
|
|
45
46
|
[subId: string]: IListenerStore<T>;
|
|
46
47
|
};
|
|
47
|
-
constructor({ client, groupId, logger, sleepDurationMs, readChunkSize, maxActiveCheckpoints, poll, subscriptionMaintenanceMs, webhookHandlerOpts: { splitBy: whSplitBy, ...whHandlerOpts }, getWebhookInfo, tableMaintainanceMs, readNextEvents, ...batcherOpts }: Pgmb2ClientOpts<T>);
|
|
48
|
+
constructor({ client, groupId, logger, sleepDurationMs, readChunkSize, maxActiveCheckpoints, poll, subscriptionMaintenanceMs, webhookHandlerOpts: { splitBy: whSplitBy, ...whHandlerOpts }, getWebhookInfo, tableMaintainanceMs, readNextEvents, findEvents, ...batcherOpts }: Pgmb2ClientOpts<T>);
|
|
48
49
|
init(): Promise<void>;
|
|
49
50
|
end(): Promise<void>;
|
|
50
51
|
publish(events: T[], client?: PgClientLike): Promise<import("./queries.ts").IWriteEventsResult[]>;
|
package/lib/client.js
CHANGED
|
@@ -22,6 +22,7 @@ class PgmbClient extends batcher_ts_1.PGMBEventBatcher {
|
|
|
22
22
|
tableMaintenanceMs;
|
|
23
23
|
maxActiveCheckpoints;
|
|
24
24
|
readNextEvents;
|
|
25
|
+
findEvents;
|
|
25
26
|
getWebhookInfo;
|
|
26
27
|
webhookHandler;
|
|
27
28
|
listeners = {};
|
|
@@ -35,7 +36,7 @@ class PgmbClient extends batcher_ts_1.PGMBEventBatcher {
|
|
|
35
36
|
#tableMaintainTask;
|
|
36
37
|
#inMemoryCursor = null;
|
|
37
38
|
#activeCheckpoints = [];
|
|
38
|
-
constructor({ client, groupId, logger = (0, pino_1.pino)(), sleepDurationMs = 750, readChunkSize = 1000, maxActiveCheckpoints = 10, poll, subscriptionMaintenanceMs = 60 * 1000, webhookHandlerOpts: { splitBy: whSplitBy, ...whHandlerOpts } = {}, getWebhookInfo = () => ({}), tableMaintainanceMs = 5 * 60 * 1000, readNextEvents = queries_ts_1.readNextEvents.run.bind(queries_ts_1.readNextEvents), ...batcherOpts }) {
|
|
39
|
+
constructor({ client, groupId, logger = (0, pino_1.pino)(), sleepDurationMs = 750, readChunkSize = 1000, maxActiveCheckpoints = 10, poll, subscriptionMaintenanceMs = 60 * 1000, webhookHandlerOpts: { splitBy: whSplitBy, ...whHandlerOpts } = {}, getWebhookInfo = () => ({}), tableMaintainanceMs = 5 * 60 * 1000, readNextEvents = queries_ts_1.readNextEvents.run.bind(queries_ts_1.readNextEvents), findEvents, ...batcherOpts }) {
|
|
39
40
|
super({
|
|
40
41
|
...batcherOpts,
|
|
41
42
|
logger,
|
|
@@ -54,6 +55,7 @@ class PgmbClient extends batcher_ts_1.PGMBEventBatcher {
|
|
|
54
55
|
this.getWebhookInfo = getWebhookInfo;
|
|
55
56
|
this.tableMaintenanceMs = tableMaintainanceMs;
|
|
56
57
|
this.readNextEvents = readNextEvents;
|
|
58
|
+
this.findEvents = findEvents;
|
|
57
59
|
}
|
|
58
60
|
async init() {
|
|
59
61
|
this.#endAc = new AbortController();
|
|
@@ -230,7 +232,7 @@ class PgmbClient extends batcher_ts_1.PGMBEventBatcher {
|
|
|
230
232
|
webhookCount++;
|
|
231
233
|
}
|
|
232
234
|
}
|
|
233
|
-
const { map: subToEventMap, retryEvents, retryItemCount
|
|
235
|
+
const { map: subToEventMap, retryEvents, retryItemCount } = await (0, retry_handler_ts_1.normaliseRetryEventsInReadEventMap)(rows, this.client, this.findEvents);
|
|
234
236
|
const subs = Object.entries(subToEventMap);
|
|
235
237
|
const checkpoint = {
|
|
236
238
|
activeTasks: 0,
|
package/lib/retry-handler.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { IReadNextEventsResult } from './queries.ts';
|
|
2
2
|
import type { PgClientLike } from './query-types.ts';
|
|
3
|
-
import type { IEventData, IEventHandler, IReadEvent, IRetryHandlerOpts } from './types.ts';
|
|
3
|
+
import type { IEventData, IEventHandler, IFindEventsFn, IReadEvent, IRetryHandlerOpts } from './types.ts';
|
|
4
4
|
export declare function createRetryHandler<T extends IEventData>({ retriesS }: IRetryHandlerOpts, handler: IEventHandler<T>): IEventHandler<T>;
|
|
5
|
-
export declare function normaliseRetryEventsInReadEventMap<T extends IEventData>(rows: IReadNextEventsResult[], client: PgClientLike): Promise<{
|
|
5
|
+
export declare function normaliseRetryEventsInReadEventMap<T extends IEventData>(rows: IReadNextEventsResult[], client: PgClientLike, findEvents?: IFindEventsFn): Promise<{
|
|
6
6
|
map: {
|
|
7
7
|
[sid: string]: IReadEvent<T>[];
|
|
8
8
|
};
|
package/lib/retry-handler.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.createRetryHandler = createRetryHandler;
|
|
|
4
4
|
exports.normaliseRetryEventsInReadEventMap = normaliseRetryEventsInReadEventMap;
|
|
5
5
|
const consts_ts_1 = require("./consts.js");
|
|
6
6
|
const queries_ts_1 = require("./queries.js");
|
|
7
|
+
const defaultFindEvents = queries_ts_1.findEvents.run.bind(queries_ts_1.findEvents);
|
|
7
8
|
function createRetryHandler({ retriesS }, handler) {
|
|
8
9
|
return async (ev, ctx) => {
|
|
9
10
|
const { name, client, subscriptionId, logger } = ctx;
|
|
@@ -27,7 +28,7 @@ function createRetryHandler({ retriesS }, handler) {
|
|
|
27
28
|
}
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
|
-
async function normaliseRetryEventsInReadEventMap(rows, client) {
|
|
31
|
+
async function normaliseRetryEventsInReadEventMap(rows, client, findEvents = defaultFindEvents) {
|
|
31
32
|
const map = {};
|
|
32
33
|
const evsToPopulate = [];
|
|
33
34
|
const idsToLoad = [];
|
|
@@ -67,7 +68,7 @@ async function normaliseRetryEventsInReadEventMap(rows, client) {
|
|
|
67
68
|
if (!idsToLoad.length) {
|
|
68
69
|
return { map, retryEvents: 0, retryItemCount: 0 };
|
|
69
70
|
}
|
|
70
|
-
const fetchedEvents = await
|
|
71
|
+
const fetchedEvents = await findEvents({ ids: idsToLoad }, client);
|
|
71
72
|
const fetchedEventMap = fetchedEvents.reduce((map, ev) => {
|
|
72
73
|
map[ev.id] = ev;
|
|
73
74
|
return map;
|
package/lib/types.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { IncomingMessage } from 'node:http';
|
|
|
3
3
|
import type { Logger } from 'pino';
|
|
4
4
|
import type { HeaderRecord } from 'undici-types/header.js';
|
|
5
5
|
import type { AbortableAsyncIterator } from './abortable-async-iterator.ts';
|
|
6
|
-
import type { IAssertSubscriptionParams, IReadNextEventsParams, IReadNextEventsResult } from './queries.ts';
|
|
6
|
+
import type { IAssertSubscriptionParams, IFindEventsParams, IFindEventsResult, IReadNextEventsParams, IReadNextEventsResult } from './queries.ts';
|
|
7
7
|
import type { PgClientLike } from './query-types.ts';
|
|
8
8
|
export type ISplitFn<T extends IEventData> = (event: IReadEvent<T>) => IReadEvent<T>[];
|
|
9
9
|
export type SerialisedEvent = {
|
|
@@ -68,6 +68,7 @@ export type PGMBEventBatcherOpts<T extends IEventData> = {
|
|
|
68
68
|
maxBatchSize?: number;
|
|
69
69
|
};
|
|
70
70
|
export type IReadNextEventsFn = (parmas: IReadNextEventsParams, db: IDatabaseConnection) => Promise<IReadNextEventsResult[]>;
|
|
71
|
+
export type IFindEventsFn = (parmas: IFindEventsParams, db: IDatabaseConnection) => Promise<IFindEventsResult[]>;
|
|
71
72
|
export type Pgmb2ClientOpts<T extends IEventData> = {
|
|
72
73
|
client: PgClientLike;
|
|
73
74
|
/**
|
|
@@ -110,6 +111,10 @@ export type Pgmb2ClientOpts<T extends IEventData> = {
|
|
|
110
111
|
* Override the default readNextEvents implementation
|
|
111
112
|
*/
|
|
112
113
|
readNextEvents?: IReadNextEventsFn;
|
|
114
|
+
/**
|
|
115
|
+
* Override the default findEvents implementation
|
|
116
|
+
*/
|
|
117
|
+
findEvents?: IFindEventsFn;
|
|
113
118
|
} & Pick<PGMBEventBatcherOpts<IEventData>, 'flushIntervalMs' | 'maxBatchSize' | 'shouldLog'>;
|
|
114
119
|
export type IReadEvent<T extends IEventData = IEventData> = {
|
|
115
120
|
items: IEvent<T>[];
|