@haathie/pgmb 0.2.4 → 0.2.6

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 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, } = await (0, retry_handler_ts_1.normaliseRetryEventsInReadEventMap)(rows, this.client);
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/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export type * from './types.ts';
3
3
  export type * from './query-types.ts';
4
4
  export * from './utils.ts';
5
5
  export * from './sse.ts';
6
+ export * from './queries.ts';
package/lib/index.js CHANGED
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./client.js"), exports);
18
18
  __exportStar(require("./utils.js"), exports);
19
19
  __exportStar(require("./sse.js"), exports);
20
+ __exportStar(require("./queries.js"), exports);
@@ -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
  };
@@ -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 queries_ts_1.findEvents.run({ ids: idsToLoad }, client);
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>[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haathie/pgmb",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "description": "PG message broker, with a type-safe typescript client with built-in webhook & SSE support.",
5
5
  "main": "lib/index.js",
6
6
  "publishConfig": {