@apibara/indexer 2.1.0-beta.5 → 2.1.0-beta.50

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.
Files changed (70) hide show
  1. package/dist/index.cjs +134 -41
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +8 -1
  4. package/dist/index.d.mts +8 -1
  5. package/dist/index.d.ts +8 -1
  6. package/dist/index.mjs +125 -34
  7. package/dist/index.mjs.map +1 -0
  8. package/dist/internal/index.cjs +1 -0
  9. package/dist/internal/index.cjs.map +1 -0
  10. package/dist/internal/index.mjs +1 -0
  11. package/dist/internal/index.mjs.map +1 -0
  12. package/dist/internal/plugins.cjs +5 -5
  13. package/dist/internal/plugins.cjs.map +1 -0
  14. package/dist/internal/plugins.d.cts +1 -1
  15. package/dist/internal/plugins.d.mts +1 -1
  16. package/dist/internal/plugins.d.ts +1 -1
  17. package/dist/internal/plugins.mjs +3 -3
  18. package/dist/internal/plugins.mjs.map +1 -0
  19. package/dist/internal/testing.cjs +35 -14
  20. package/dist/internal/testing.cjs.map +1 -0
  21. package/dist/internal/testing.d.cts +16 -12
  22. package/dist/internal/testing.d.mts +16 -12
  23. package/dist/internal/testing.d.ts +16 -12
  24. package/dist/internal/testing.mjs +33 -12
  25. package/dist/internal/testing.mjs.map +1 -0
  26. package/dist/plugins/index.cjs +4 -4
  27. package/dist/plugins/index.cjs.map +1 -0
  28. package/dist/plugins/index.d.cts +2 -2
  29. package/dist/plugins/index.d.mts +2 -2
  30. package/dist/plugins/index.d.ts +2 -2
  31. package/dist/plugins/index.mjs +4 -4
  32. package/dist/plugins/index.mjs.map +1 -0
  33. package/dist/shared/{indexer.2416906c.cjs → indexer.03c9f151.cjs} +8 -5
  34. package/dist/shared/indexer.03c9f151.cjs.map +1 -0
  35. package/dist/shared/{indexer.ff25c953.mjs → indexer.2673dcb1.mjs} +7 -4
  36. package/dist/shared/indexer.2673dcb1.mjs.map +1 -0
  37. package/dist/shared/{indexer.077335f3.cjs → indexer.479ae593.cjs} +6 -0
  38. package/dist/shared/indexer.479ae593.cjs.map +1 -0
  39. package/dist/shared/{indexer.fedcd831.d.cts → indexer.4ef52548.d.cts} +40 -23
  40. package/dist/shared/{indexer.fedcd831.d.mts → indexer.4ef52548.d.mts} +40 -23
  41. package/dist/shared/{indexer.fedcd831.d.ts → indexer.4ef52548.d.ts} +40 -23
  42. package/dist/shared/{indexer.a55ad619.mjs → indexer.75773ef1.mjs} +6 -1
  43. package/dist/shared/indexer.75773ef1.mjs.map +1 -0
  44. package/dist/testing/index.cjs +19 -10
  45. package/dist/testing/index.cjs.map +1 -0
  46. package/dist/testing/index.d.cts +11 -7
  47. package/dist/testing/index.d.mts +11 -7
  48. package/dist/testing/index.d.ts +11 -7
  49. package/dist/testing/index.mjs +20 -11
  50. package/dist/testing/index.mjs.map +1 -0
  51. package/dist/vcr/index.cjs +3 -1
  52. package/dist/vcr/index.cjs.map +1 -0
  53. package/dist/vcr/index.d.cts +1 -1
  54. package/dist/vcr/index.d.mts +1 -1
  55. package/dist/vcr/index.d.ts +1 -1
  56. package/dist/vcr/index.mjs +3 -1
  57. package/dist/vcr/index.mjs.map +1 -0
  58. package/package.json +3 -3
  59. package/src/index.ts +1 -0
  60. package/src/indexer.ts +151 -50
  61. package/src/internal/testing.ts +67 -23
  62. package/src/otel.ts +29 -2
  63. package/src/plugins/context.ts +1 -1
  64. package/src/plugins/logger.ts +11 -2
  65. package/src/testing/index.ts +30 -6
  66. package/src/utils/index.ts +21 -0
  67. package/dist/shared/indexer.601ceab0.cjs +0 -7
  68. package/dist/shared/indexer.9b21ddd2.mjs +0 -5
  69. package/src/compose.test.ts +0 -76
  70. package/src/indexer.test.ts +0 -430
@@ -1,18 +1,22 @@
1
- import { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.fedcd831.cjs';
1
+ import { e as Indexer, i as IndexerPlugin, b as IndexerConfig } from '../shared/indexer.4ef52548.cjs';
2
2
  import { MockStreamResponse, MockFilter, MockBlock } from '@apibara/protocol/testing';
3
3
  import { InternalContext } from './plugins.cjs';
4
4
  import '@apibara/protocol';
5
5
  import 'hookable';
6
6
 
7
+ type InvalidateConfig = {
8
+ invalidateFromIndex: number;
9
+ invalidateTriggerIndex: number;
10
+ };
11
+ type FinalizeConfig = {
12
+ finalizeToIndex: number;
13
+ finalizeTriggerIndex: number;
14
+ };
7
15
  type MockMessagesOptions = {
8
- invalidate?: {
9
- invalidateFromIndex: number;
10
- invalidateTriggerIndex: number;
11
- };
12
- finalize?: {
13
- finalizeToIndex: number;
14
- finalizeTriggerIndex: number;
15
- };
16
+ invalidate?: InvalidateConfig | InvalidateConfig[];
17
+ finalize?: FinalizeConfig | FinalizeConfig[];
18
+ uniqueKey?: boolean;
19
+ baseBlockNumber?: bigint;
16
20
  };
17
21
  declare function generateMockMessages(count?: number, options?: MockMessagesOptions): MockStreamResponse[];
18
22
  type MockIndexerParams = {
@@ -20,9 +24,9 @@ type MockIndexerParams = {
20
24
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
21
25
  };
22
26
  declare function getMockIndexer(params?: MockIndexerParams): Indexer<{
23
- readonly filter?: string | undefined;
27
+ filter?: string | undefined;
24
28
  }, {
25
- readonly data?: string | undefined;
29
+ data?: string | undefined;
26
30
  }>;
27
31
  type MockRet = {
28
32
  data: string;
@@ -39,4 +43,4 @@ declare function useMockSink(): {
39
43
  output: unknown[];
40
44
  };
41
45
 
42
- export { type MockMessagesOptions, type MockRet, generateMockMessages, getMockIndexer, mockSink, useMockSink };
46
+ export { type FinalizeConfig, type InvalidateConfig, type MockMessagesOptions, type MockRet, generateMockMessages, getMockIndexer, mockSink, useMockSink };
@@ -1,18 +1,22 @@
1
- import { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.fedcd831.mjs';
1
+ import { e as Indexer, i as IndexerPlugin, b as IndexerConfig } from '../shared/indexer.4ef52548.mjs';
2
2
  import { MockStreamResponse, MockFilter, MockBlock } from '@apibara/protocol/testing';
3
3
  import { InternalContext } from './plugins.mjs';
4
4
  import '@apibara/protocol';
5
5
  import 'hookable';
6
6
 
7
+ type InvalidateConfig = {
8
+ invalidateFromIndex: number;
9
+ invalidateTriggerIndex: number;
10
+ };
11
+ type FinalizeConfig = {
12
+ finalizeToIndex: number;
13
+ finalizeTriggerIndex: number;
14
+ };
7
15
  type MockMessagesOptions = {
8
- invalidate?: {
9
- invalidateFromIndex: number;
10
- invalidateTriggerIndex: number;
11
- };
12
- finalize?: {
13
- finalizeToIndex: number;
14
- finalizeTriggerIndex: number;
15
- };
16
+ invalidate?: InvalidateConfig | InvalidateConfig[];
17
+ finalize?: FinalizeConfig | FinalizeConfig[];
18
+ uniqueKey?: boolean;
19
+ baseBlockNumber?: bigint;
16
20
  };
17
21
  declare function generateMockMessages(count?: number, options?: MockMessagesOptions): MockStreamResponse[];
18
22
  type MockIndexerParams = {
@@ -20,9 +24,9 @@ type MockIndexerParams = {
20
24
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
21
25
  };
22
26
  declare function getMockIndexer(params?: MockIndexerParams): Indexer<{
23
- readonly filter?: string | undefined;
27
+ filter?: string | undefined;
24
28
  }, {
25
- readonly data?: string | undefined;
29
+ data?: string | undefined;
26
30
  }>;
27
31
  type MockRet = {
28
32
  data: string;
@@ -39,4 +43,4 @@ declare function useMockSink(): {
39
43
  output: unknown[];
40
44
  };
41
45
 
42
- export { type MockMessagesOptions, type MockRet, generateMockMessages, getMockIndexer, mockSink, useMockSink };
46
+ export { type FinalizeConfig, type InvalidateConfig, type MockMessagesOptions, type MockRet, generateMockMessages, getMockIndexer, mockSink, useMockSink };
@@ -1,18 +1,22 @@
1
- import { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.fedcd831.js';
1
+ import { e as Indexer, i as IndexerPlugin, b as IndexerConfig } from '../shared/indexer.4ef52548.js';
2
2
  import { MockStreamResponse, MockFilter, MockBlock } from '@apibara/protocol/testing';
3
3
  import { InternalContext } from './plugins.js';
4
4
  import '@apibara/protocol';
5
5
  import 'hookable';
6
6
 
7
+ type InvalidateConfig = {
8
+ invalidateFromIndex: number;
9
+ invalidateTriggerIndex: number;
10
+ };
11
+ type FinalizeConfig = {
12
+ finalizeToIndex: number;
13
+ finalizeTriggerIndex: number;
14
+ };
7
15
  type MockMessagesOptions = {
8
- invalidate?: {
9
- invalidateFromIndex: number;
10
- invalidateTriggerIndex: number;
11
- };
12
- finalize?: {
13
- finalizeToIndex: number;
14
- finalizeTriggerIndex: number;
15
- };
16
+ invalidate?: InvalidateConfig | InvalidateConfig[];
17
+ finalize?: FinalizeConfig | FinalizeConfig[];
18
+ uniqueKey?: boolean;
19
+ baseBlockNumber?: bigint;
16
20
  };
17
21
  declare function generateMockMessages(count?: number, options?: MockMessagesOptions): MockStreamResponse[];
18
22
  type MockIndexerParams = {
@@ -20,9 +24,9 @@ type MockIndexerParams = {
20
24
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
21
25
  };
22
26
  declare function getMockIndexer(params?: MockIndexerParams): Indexer<{
23
- readonly filter?: string | undefined;
27
+ filter?: string | undefined;
24
28
  }, {
25
- readonly data?: string | undefined;
29
+ data?: string | undefined;
26
30
  }>;
27
31
  type MockRet = {
28
32
  data: string;
@@ -39,4 +43,4 @@ declare function useMockSink(): {
39
43
  output: unknown[];
40
44
  };
41
45
 
42
- export { type MockMessagesOptions, type MockRet, generateMockMessages, getMockIndexer, mockSink, useMockSink };
46
+ export { type FinalizeConfig, type InvalidateConfig, type MockMessagesOptions, type MockRet, generateMockMessages, getMockIndexer, mockSink, useMockSink };
@@ -1,36 +1,49 @@
1
1
  import { isCursor } from '@apibara/protocol';
2
2
  import { MockStream } from '@apibara/protocol/testing';
3
- import { u as useIndexerContext } from '../shared/indexer.a55ad619.mjs';
3
+ import { d as defineIndexerPlugin, u as useIndexerContext } from '../shared/indexer.75773ef1.mjs';
4
4
  import { createIndexer, defineIndexer } from '../index.mjs';
5
- import { d as defineIndexerPlugin } from '../shared/indexer.9b21ddd2.mjs';
6
- import 'consola';
5
+ import { l as logger } from '../shared/indexer.2673dcb1.mjs';
7
6
  import { internalContext } from './plugins.mjs';
8
7
  import 'node:async_hooks';
9
8
  import 'unctx';
9
+ import 'consola';
10
10
  import 'hookable';
11
11
  import 'node:assert';
12
12
  import '@opentelemetry/api';
13
13
 
14
14
  function generateMockMessages(count = 10, options) {
15
- const invalidateAt = options?.invalidate;
16
- const finalizeAt = options?.finalize;
17
15
  const messages = [];
16
+ const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5e6);
17
+ const invalidateConfigs = options?.invalidate ? Array.isArray(options.invalidate) ? options.invalidate : [options.invalidate] : [];
18
+ const finalizeConfigs = options?.finalize ? Array.isArray(options.finalize) ? options.finalize : [options.finalize] : [];
18
19
  for (let i = 0; i < count; i++) {
19
- if (invalidateAt && i === invalidateAt.invalidateTriggerIndex) {
20
+ const currentBlockNumber = baseBlockNumber + BigInt(i);
21
+ const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);
22
+ const invalidateConfig = invalidateConfigs.find(
23
+ (cfg) => cfg.invalidateTriggerIndex === i
24
+ );
25
+ const finalizeConfig = finalizeConfigs.find(
26
+ (cfg) => cfg.finalizeTriggerIndex === i
27
+ );
28
+ if (invalidateConfig) {
29
+ const invalidateToBlock = baseBlockNumber + BigInt(invalidateConfig.invalidateFromIndex);
20
30
  messages.push({
21
31
  _tag: "invalidate",
22
32
  invalidate: {
23
33
  cursor: {
24
- orderKey: BigInt(5e6 + invalidateAt.invalidateFromIndex)
34
+ orderKey: invalidateToBlock,
35
+ uniqueKey: options?.uniqueKey ? uniqueKeyFromOrderKey(invalidateToBlock) : void 0
25
36
  }
26
37
  }
27
38
  });
28
- } else if (finalizeAt && i === finalizeAt.finalizeTriggerIndex) {
39
+ } else if (finalizeConfig) {
40
+ const finalizedToBlock = baseBlockNumber + BigInt(finalizeConfig.finalizeToIndex);
29
41
  messages.push({
30
42
  _tag: "finalize",
31
43
  finalize: {
32
44
  cursor: {
33
- orderKey: BigInt(5e6 + finalizeAt.finalizeToIndex)
45
+ orderKey: finalizedToBlock,
46
+ uniqueKey: options?.uniqueKey ? uniqueKeyFromOrderKey(finalizedToBlock) : void 0
34
47
  }
35
48
  }
36
49
  });
@@ -38,10 +51,13 @@ function generateMockMessages(count = 10, options) {
38
51
  messages.push({
39
52
  _tag: "data",
40
53
  data: {
41
- cursor: { orderKey: BigInt(5e6 + i - 1) },
54
+ cursor: { orderKey: currentBlockNumber - 1n },
42
55
  finality: "accepted",
43
- data: [{ data: `${5e6 + i}` }],
44
- endCursor: { orderKey: BigInt(5e6 + i) },
56
+ data: [{ data: `${baseBlockNumber + BigInt(i)}` }],
57
+ endCursor: {
58
+ orderKey: currentBlockNumber,
59
+ uniqueKey: options?.uniqueKey ? uniqueKey : void 0
60
+ },
45
61
  production: "backfill"
46
62
  }
47
63
  });
@@ -49,6 +65,9 @@ function generateMockMessages(count = 10, options) {
49
65
  }
50
66
  return messages;
51
67
  }
68
+ function uniqueKeyFromOrderKey(orderKey) {
69
+ return `0xff00${orderKey.toString()}`;
70
+ }
52
71
  function getMockIndexer(params) {
53
72
  const { internalContext: contextParams, override } = params ?? {};
54
73
  const { plugins, ...rest } = override ?? {};
@@ -60,6 +79,7 @@ function getMockIndexer(params) {
60
79
  async transform() {
61
80
  },
62
81
  plugins: [
82
+ logger(),
63
83
  internalContext(
64
84
  contextParams ?? {
65
85
  availableIndexers: ["testing"],
@@ -111,3 +131,4 @@ function useMockSink() {
111
131
  }
112
132
 
113
133
  export { generateMockMessages, getMockIndexer, mockSink, useMockSink };
134
+ //# sourceMappingURL=testing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.mjs","sources":["../../src/internal/testing.ts"],"sourcesContent":["import { type Finalize, type Invalidate, isCursor } from \"@apibara/protocol\";\nimport {\n type MockBlock,\n type MockFilter,\n MockStream,\n type MockStreamResponse,\n} from \"@apibara/protocol/testing\";\nimport { useIndexerContext } from \"../context\";\nimport { type IndexerConfig, createIndexer, defineIndexer } from \"../indexer\";\nimport { defineIndexerPlugin, logger } from \"../plugins\";\nimport { type InternalContext, internalContext } from \"./plugins\";\n\nexport type InvalidateConfig = {\n invalidateFromIndex: number;\n invalidateTriggerIndex: number;\n};\n\nexport type FinalizeConfig = {\n finalizeToIndex: number;\n finalizeTriggerIndex: number;\n};\n\nexport type MockMessagesOptions = {\n invalidate?: InvalidateConfig | InvalidateConfig[];\n finalize?: FinalizeConfig | FinalizeConfig[];\n uniqueKey?: boolean;\n baseBlockNumber?: bigint;\n};\n\nexport function generateMockMessages(\n count = 10,\n options?: MockMessagesOptions,\n): MockStreamResponse[] {\n const messages: MockStreamResponse[] = [];\n const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5_000_000);\n\n const invalidateConfigs = options?.invalidate\n ? Array.isArray(options.invalidate)\n ? options.invalidate\n : [options.invalidate]\n : [];\n\n const finalizeConfigs = options?.finalize\n ? Array.isArray(options.finalize)\n ? options.finalize\n : [options.finalize]\n : [];\n\n for (let i = 0; i < count; i++) {\n const currentBlockNumber = baseBlockNumber + BigInt(i);\n const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);\n\n const invalidateConfig = invalidateConfigs.find(\n (cfg) => cfg.invalidateTriggerIndex === i,\n );\n const finalizeConfig = finalizeConfigs.find(\n (cfg) => cfg.finalizeTriggerIndex === i,\n );\n\n if (invalidateConfig) {\n const invalidateToBlock =\n baseBlockNumber + BigInt(invalidateConfig.invalidateFromIndex);\n messages.push({\n _tag: \"invalidate\",\n invalidate: {\n cursor: {\n orderKey: invalidateToBlock,\n uniqueKey: options?.uniqueKey\n ? uniqueKeyFromOrderKey(invalidateToBlock)\n : undefined,\n },\n } as Invalidate,\n });\n } else if (finalizeConfig) {\n const finalizedToBlock =\n baseBlockNumber + BigInt(finalizeConfig.finalizeToIndex);\n messages.push({\n _tag: \"finalize\",\n finalize: {\n cursor: {\n orderKey: finalizedToBlock,\n uniqueKey: options?.uniqueKey\n ? uniqueKeyFromOrderKey(finalizedToBlock)\n : undefined,\n },\n } as Finalize,\n });\n } else {\n messages.push({\n _tag: \"data\",\n data: {\n cursor: { orderKey: currentBlockNumber - 1n },\n finality: \"accepted\",\n data: [{ data: `${baseBlockNumber + BigInt(i)}` }],\n endCursor: {\n orderKey: currentBlockNumber,\n uniqueKey: options?.uniqueKey ? uniqueKey : undefined,\n },\n production: \"backfill\",\n },\n });\n }\n }\n\n return messages;\n}\n\nfunction uniqueKeyFromOrderKey(orderKey: bigint): `0x${string}` {\n return `0xff00${orderKey.toString()}`;\n}\n\ntype MockIndexerParams = {\n internalContext?: InternalContext;\n override?: Partial<IndexerConfig<MockFilter, MockBlock>>;\n};\n\nexport function getMockIndexer(params?: MockIndexerParams) {\n const { internalContext: contextParams, override } = params ?? {};\n const { plugins, ...rest } = override ?? {};\n\n return createIndexer(\n defineIndexer(MockStream)({\n streamUrl: \"https://sepolia.ethereum.a5a.ch\",\n finality: \"accepted\",\n filter: {},\n async transform() {},\n plugins: [\n logger(),\n internalContext(\n contextParams ??\n ({\n availableIndexers: [\"testing\"],\n indexerName: \"testing\",\n } as InternalContext),\n ),\n ...(plugins ?? []),\n ],\n ...(rest ?? {}),\n }),\n );\n}\n\nexport type MockRet = {\n data: string;\n};\n\n/**\n * A mock sink used for testing. The indexer function can write to the output array.\n * The indexer context is optionally written to the metadata object.\n */\nexport function mockSink<TFilter, TBlock>({\n output,\n metadata,\n}: { output: unknown[]; metadata?: Record<string, unknown> }) {\n return defineIndexerPlugin<TFilter, TBlock>((indexer) => {\n indexer.hooks.hook(\"connect:before\", ({ request }) => {\n if (metadata?.lastCursor && isCursor(metadata.lastCursor)) {\n request.startingCursor = metadata.lastCursor;\n }\n\n if (metadata?.lastFilter) {\n request.filter[1] = metadata.lastFilter as TFilter;\n }\n });\n\n indexer.hooks.hook(\"connect:factory\", ({ request, endCursor }) => {\n if (request.filter[1]) {\n if (metadata) {\n metadata.lastCursor = endCursor;\n metadata.lastFilter = request.filter[1];\n }\n }\n });\n\n indexer.hooks.hook(\"handler:middleware\", ({ use }) => {\n use(async (context, next) => {\n context.output = output;\n await next();\n context.output = null;\n\n if (metadata) {\n metadata.lastCursor = context.endCursor;\n }\n });\n });\n });\n}\n\nexport function useMockSink(): { output: unknown[] } {\n const context = useIndexerContext();\n return { output: context.output };\n}\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  'use strict';
2
2
 
3
- const config = require('../shared/indexer.601ceab0.cjs');
4
- const logger = require('../shared/indexer.2416906c.cjs');
3
+ const config = require('../shared/indexer.479ae593.cjs');
4
+ const logger = require('../shared/indexer.03c9f151.cjs');
5
5
  const protocol = require('@apibara/protocol');
6
- require('consola');
7
- require('../shared/indexer.077335f3.cjs');
8
6
  require('node:async_hooks');
9
7
  require('unctx');
8
+ require('consola');
10
9
 
11
10
  function inMemoryPersistence() {
12
11
  return config.defineIndexerPlugin((indexer) => {
@@ -41,3 +40,4 @@ exports.defineIndexerPlugin = config.defineIndexerPlugin;
41
40
  exports.logger = logger.logger;
42
41
  exports.useLogger = logger.useLogger;
43
42
  exports.inMemoryPersistence = inMemoryPersistence;
43
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/plugins/persistence.ts"],"sourcesContent":["import { type Cursor, isCursor } from \"@apibara/protocol\";\n\nimport { defineIndexerPlugin } from \"./config\";\n\n/**\n * A plugin that persists the last cursor and filter to memory.\n */\nexport function inMemoryPersistence<TFilter, TBlock>() {\n return defineIndexerPlugin<TFilter, TBlock>((indexer) => {\n let lastCursor: Cursor | undefined;\n let lastFilter: TFilter | undefined;\n\n indexer.hooks.hook(\"connect:before\", ({ request }) => {\n if (lastCursor) {\n request.startingCursor = lastCursor;\n }\n\n if (lastFilter) {\n request.filter[1] = lastFilter;\n }\n });\n\n indexer.hooks.hook(\"connect:factory\", ({ request, endCursor }) => {\n if (request.filter[1]) {\n lastCursor = endCursor;\n lastFilter = request.filter[1];\n }\n });\n\n indexer.hooks.hook(\"handler:middleware\", ({ use }) => {\n use(async (context, next) => {\n await next();\n if (context.endCursor && isCursor(context.endCursor)) {\n lastCursor = context.endCursor;\n }\n });\n });\n });\n}\n"],"names":["defineIndexerPlugin","isCursor"],"mappings":";;;;;;;;;AAOO,SAAS,mBAAuC,GAAA;AACrD,EAAO,OAAAA,0BAAA,CAAqC,CAAC,OAAY,KAAA;AACvD,IAAI,IAAA,UAAA,CAAA;AACJ,IAAI,IAAA,UAAA,CAAA;AAEJ,IAAA,OAAA,CAAQ,MAAM,IAAK,CAAA,gBAAA,EAAkB,CAAC,EAAE,SAAc,KAAA;AACpD,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,OAAA,CAAQ,cAAiB,GAAA,UAAA,CAAA;AAAA,OAC3B;AAEA,MAAA,IAAI,UAAY,EAAA;AACd,QAAQ,OAAA,CAAA,MAAA,CAAO,CAAC,CAAI,GAAA,UAAA,CAAA;AAAA,OACtB;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAA,CAAQ,MAAM,IAAK,CAAA,iBAAA,EAAmB,CAAC,EAAE,OAAA,EAAS,WAAgB,KAAA;AAChE,MAAI,IAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,CAAG,EAAA;AACrB,QAAa,UAAA,GAAA,SAAA,CAAA;AACb,QAAa,UAAA,GAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAA;AAAA,OAC/B;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAA,CAAQ,MAAM,IAAK,CAAA,oBAAA,EAAsB,CAAC,EAAE,KAAU,KAAA;AACpD,MAAI,GAAA,CAAA,OAAO,SAAS,IAAS,KAAA;AAC3B,QAAA,MAAM,IAAK,EAAA,CAAA;AACX,QAAA,IAAI,OAAQ,CAAA,SAAA,IAAaC,iBAAS,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACpD,UAAA,UAAA,GAAa,OAAQ,CAAA,SAAA,CAAA;AAAA,SACvB;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH;;;;;;;"}
@@ -1,5 +1,5 @@
1
- import { b as IndexerPlugin } from '../shared/indexer.fedcd831.cjs';
2
- export { d as defineIndexerPlugin } from '../shared/indexer.fedcd831.cjs';
1
+ import { i as IndexerPlugin } from '../shared/indexer.4ef52548.cjs';
2
+ export { j as defineIndexerPlugin } from '../shared/indexer.4ef52548.cjs';
3
3
  import { ConsolaReporter, ConsolaInstance } from 'consola';
4
4
  export { ConsolaInstance, ConsolaReporter } from 'consola';
5
5
  import '@apibara/protocol';
@@ -1,5 +1,5 @@
1
- import { b as IndexerPlugin } from '../shared/indexer.fedcd831.mjs';
2
- export { d as defineIndexerPlugin } from '../shared/indexer.fedcd831.mjs';
1
+ import { i as IndexerPlugin } from '../shared/indexer.4ef52548.mjs';
2
+ export { j as defineIndexerPlugin } from '../shared/indexer.4ef52548.mjs';
3
3
  import { ConsolaReporter, ConsolaInstance } from 'consola';
4
4
  export { ConsolaInstance, ConsolaReporter } from 'consola';
5
5
  import '@apibara/protocol';
@@ -1,5 +1,5 @@
1
- import { b as IndexerPlugin } from '../shared/indexer.fedcd831.js';
2
- export { d as defineIndexerPlugin } from '../shared/indexer.fedcd831.js';
1
+ import { i as IndexerPlugin } from '../shared/indexer.4ef52548.js';
2
+ export { j as defineIndexerPlugin } from '../shared/indexer.4ef52548.js';
3
3
  import { ConsolaReporter, ConsolaInstance } from 'consola';
4
4
  export { ConsolaInstance, ConsolaReporter } from 'consola';
5
5
  import '@apibara/protocol';
@@ -1,10 +1,9 @@
1
- import { d as defineIndexerPlugin } from '../shared/indexer.9b21ddd2.mjs';
2
- export { l as logger, u as useLogger } from '../shared/indexer.ff25c953.mjs';
1
+ import { d as defineIndexerPlugin } from '../shared/indexer.75773ef1.mjs';
2
+ export { l as logger, u as useLogger } from '../shared/indexer.2673dcb1.mjs';
3
3
  import { isCursor } from '@apibara/protocol';
4
- import 'consola';
5
- import '../shared/indexer.a55ad619.mjs';
6
4
  import 'node:async_hooks';
7
5
  import 'unctx';
6
+ import 'consola';
8
7
 
9
8
  function inMemoryPersistence() {
10
9
  return defineIndexerPlugin((indexer) => {
@@ -36,3 +35,4 @@ function inMemoryPersistence() {
36
35
  }
37
36
 
38
37
  export { defineIndexerPlugin, inMemoryPersistence };
38
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/plugins/persistence.ts"],"sourcesContent":["import { type Cursor, isCursor } from \"@apibara/protocol\";\n\nimport { defineIndexerPlugin } from \"./config\";\n\n/**\n * A plugin that persists the last cursor and filter to memory.\n */\nexport function inMemoryPersistence<TFilter, TBlock>() {\n return defineIndexerPlugin<TFilter, TBlock>((indexer) => {\n let lastCursor: Cursor | undefined;\n let lastFilter: TFilter | undefined;\n\n indexer.hooks.hook(\"connect:before\", ({ request }) => {\n if (lastCursor) {\n request.startingCursor = lastCursor;\n }\n\n if (lastFilter) {\n request.filter[1] = lastFilter;\n }\n });\n\n indexer.hooks.hook(\"connect:factory\", ({ request, endCursor }) => {\n if (request.filter[1]) {\n lastCursor = endCursor;\n lastFilter = request.filter[1];\n }\n });\n\n indexer.hooks.hook(\"handler:middleware\", ({ use }) => {\n use(async (context, next) => {\n await next();\n if (context.endCursor && isCursor(context.endCursor)) {\n lastCursor = context.endCursor;\n }\n });\n });\n });\n}\n"],"names":[],"mappings":";;;;;;;AAOO,SAAS,mBAAuC,GAAA;AACrD,EAAO,OAAA,mBAAA,CAAqC,CAAC,OAAY,KAAA;AACvD,IAAI,IAAA,UAAA,CAAA;AACJ,IAAI,IAAA,UAAA,CAAA;AAEJ,IAAA,OAAA,CAAQ,MAAM,IAAK,CAAA,gBAAA,EAAkB,CAAC,EAAE,SAAc,KAAA;AACpD,MAAA,IAAI,UAAY,EAAA;AACd,QAAA,OAAA,CAAQ,cAAiB,GAAA,UAAA,CAAA;AAAA,OAC3B;AAEA,MAAA,IAAI,UAAY,EAAA;AACd,QAAQ,OAAA,CAAA,MAAA,CAAO,CAAC,CAAI,GAAA,UAAA,CAAA;AAAA,OACtB;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAA,CAAQ,MAAM,IAAK,CAAA,iBAAA,EAAmB,CAAC,EAAE,OAAA,EAAS,WAAgB,KAAA;AAChE,MAAI,IAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,CAAG,EAAA;AACrB,QAAa,UAAA,GAAA,SAAA,CAAA;AACb,QAAa,UAAA,GAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAA;AAAA,OAC/B;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAA,CAAQ,MAAM,IAAK,CAAA,oBAAA,EAAsB,CAAC,EAAE,KAAU,KAAA;AACpD,MAAI,GAAA,CAAA,OAAO,SAAS,IAAS,KAAA;AAC3B,QAAA,MAAM,IAAK,EAAA,CAAA;AACX,QAAA,IAAI,OAAQ,CAAA,SAAA,IAAa,QAAS,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACpD,UAAA,UAAA,GAAa,OAAQ,CAAA,SAAA,CAAA;AAAA,SACvB;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH;;;;"}
@@ -1,25 +1,27 @@
1
1
  'use strict';
2
2
 
3
3
  const consola = require('consola');
4
- const context = require('./indexer.077335f3.cjs');
5
- const config = require('./indexer.601ceab0.cjs');
4
+ const config = require('./indexer.479ae593.cjs');
6
5
 
7
6
  function logger({
8
7
  logger: logger2
9
8
  } = {}) {
10
9
  return config.defineIndexerPlugin((indexer) => {
11
- indexer.hooks.hook("run:before", () => {
12
- const ctx = context.useIndexerContext();
10
+ indexer.hooks.hook("plugins:init", () => {
11
+ const ctx = config.useIndexerContext();
13
12
  if (logger2) {
14
13
  ctx.logger = consola.consola.create({ reporters: [logger2] });
15
14
  } else {
16
15
  ctx.logger = consola.consola.create({});
17
16
  }
17
+ if (ctx.debug) {
18
+ ctx.logger.level = consola.LogLevels.debug;
19
+ }
18
20
  });
19
21
  });
20
22
  }
21
23
  function useLogger() {
22
- const ctx = context.useIndexerContext();
24
+ const ctx = config.useIndexerContext();
23
25
  if (!ctx?.logger)
24
26
  throw new Error("Logger plugin is not available in context");
25
27
  return ctx.logger;
@@ -27,3 +29,4 @@ function useLogger() {
27
29
 
28
30
  exports.logger = logger;
29
31
  exports.useLogger = useLogger;
32
+ //# sourceMappingURL=indexer.03c9f151.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.03c9f151.cjs","sources":["../../src/plugins/logger.ts"],"sourcesContent":["import {\n type ConsolaInstance,\n type ConsolaReporter,\n LogLevels,\n consola,\n} from \"consola\";\nimport { useIndexerContext } from \"../context\";\nimport { defineIndexerPlugin } from \"./config\";\n\nexport type { ConsolaReporter, ConsolaInstance } from \"consola\";\n\nexport function logger<TFilter, TBlock, TTxnParams>({\n logger,\n}: { logger?: ConsolaReporter } = {}) {\n return defineIndexerPlugin<TFilter, TBlock>((indexer) => {\n indexer.hooks.hook(\"plugins:init\", () => {\n const ctx = useIndexerContext();\n\n if (logger) {\n ctx.logger = consola.create({ reporters: [logger] });\n } else {\n ctx.logger = consola.create({});\n }\n\n if (ctx.debug) {\n ctx.logger.level = LogLevels.debug;\n }\n });\n });\n}\n\nexport function useLogger(): ConsolaInstance {\n const ctx = useIndexerContext();\n\n if (!ctx?.logger)\n throw new Error(\"Logger plugin is not available in context\");\n\n return ctx.logger;\n}\n"],"names":["logger","defineIndexerPlugin","useIndexerContext","consola","LogLevels"],"mappings":";;;;;AAWO,SAAS,MAAoC,CAAA;AAAA,EAClD,MAAAA,EAAAA,OAAAA;AACF,CAAA,GAAkC,EAAI,EAAA;AACpC,EAAO,OAAAC,0BAAA,CAAqC,CAAC,OAAY,KAAA;AACvD,IAAQ,OAAA,CAAA,KAAA,CAAM,IAAK,CAAA,cAAA,EAAgB,MAAM;AACvC,MAAA,MAAM,MAAMC,wBAAkB,EAAA,CAAA;AAE9B,MAAA,IAAIF,OAAQ,EAAA;AACV,QAAI,GAAA,CAAA,MAAA,GAASG,gBAAQ,MAAO,CAAA,EAAE,WAAW,CAACH,OAAM,GAAG,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAA,GAAA,CAAI,MAAS,GAAAG,eAAA,CAAQ,MAAO,CAAA,EAAE,CAAA,CAAA;AAAA,OAChC;AAEA,MAAA,IAAI,IAAI,KAAO,EAAA;AACb,QAAI,GAAA,CAAA,MAAA,CAAO,QAAQC,iBAAU,CAAA,KAAA,CAAA;AAAA,OAC/B;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,SAA6B,GAAA;AAC3C,EAAA,MAAM,MAAMF,wBAAkB,EAAA,CAAA;AAE9B,EAAA,IAAI,CAAC,GAAK,EAAA,MAAA;AACR,IAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA,CAAA;AAE7D,EAAA,OAAO,GAAI,CAAA,MAAA,CAAA;AACb;;;;;"}
@@ -1,18 +1,20 @@
1
- import { consola } from 'consola';
2
- import { u as useIndexerContext } from './indexer.a55ad619.mjs';
3
- import { d as defineIndexerPlugin } from './indexer.9b21ddd2.mjs';
1
+ import { consola, LogLevels } from 'consola';
2
+ import { d as defineIndexerPlugin, u as useIndexerContext } from './indexer.75773ef1.mjs';
4
3
 
5
4
  function logger({
6
5
  logger: logger2
7
6
  } = {}) {
8
7
  return defineIndexerPlugin((indexer) => {
9
- indexer.hooks.hook("run:before", () => {
8
+ indexer.hooks.hook("plugins:init", () => {
10
9
  const ctx = useIndexerContext();
11
10
  if (logger2) {
12
11
  ctx.logger = consola.create({ reporters: [logger2] });
13
12
  } else {
14
13
  ctx.logger = consola.create({});
15
14
  }
15
+ if (ctx.debug) {
16
+ ctx.logger.level = LogLevels.debug;
17
+ }
16
18
  });
17
19
  });
18
20
  }
@@ -24,3 +26,4 @@ function useLogger() {
24
26
  }
25
27
 
26
28
  export { logger as l, useLogger as u };
29
+ //# sourceMappingURL=indexer.2673dcb1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.2673dcb1.mjs","sources":["../../src/plugins/logger.ts"],"sourcesContent":["import {\n type ConsolaInstance,\n type ConsolaReporter,\n LogLevels,\n consola,\n} from \"consola\";\nimport { useIndexerContext } from \"../context\";\nimport { defineIndexerPlugin } from \"./config\";\n\nexport type { ConsolaReporter, ConsolaInstance } from \"consola\";\n\nexport function logger<TFilter, TBlock, TTxnParams>({\n logger,\n}: { logger?: ConsolaReporter } = {}) {\n return defineIndexerPlugin<TFilter, TBlock>((indexer) => {\n indexer.hooks.hook(\"plugins:init\", () => {\n const ctx = useIndexerContext();\n\n if (logger) {\n ctx.logger = consola.create({ reporters: [logger] });\n } else {\n ctx.logger = consola.create({});\n }\n\n if (ctx.debug) {\n ctx.logger.level = LogLevels.debug;\n }\n });\n });\n}\n\nexport function useLogger(): ConsolaInstance {\n const ctx = useIndexerContext();\n\n if (!ctx?.logger)\n throw new Error(\"Logger plugin is not available in context\");\n\n return ctx.logger;\n}\n"],"names":["logger"],"mappings":";;;AAWO,SAAS,MAAoC,CAAA;AAAA,EAClD,MAAAA,EAAAA,OAAAA;AACF,CAAA,GAAkC,EAAI,EAAA;AACpC,EAAO,OAAA,mBAAA,CAAqC,CAAC,OAAY,KAAA;AACvD,IAAQ,OAAA,CAAA,KAAA,CAAM,IAAK,CAAA,cAAA,EAAgB,MAAM;AACvC,MAAA,MAAM,MAAM,iBAAkB,EAAA,CAAA;AAE9B,MAAA,IAAIA,OAAQ,EAAA;AACV,QAAI,GAAA,CAAA,MAAA,GAAS,QAAQ,MAAO,CAAA,EAAE,WAAW,CAACA,OAAM,GAAG,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAA,GAAA,CAAI,MAAS,GAAA,OAAA,CAAQ,MAAO,CAAA,EAAE,CAAA,CAAA;AAAA,OAChC;AAEA,MAAA,IAAI,IAAI,KAAO,EAAA;AACb,QAAI,GAAA,CAAA,MAAA,CAAO,QAAQ,SAAU,CAAA,KAAA,CAAA;AAAA,OAC/B;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,SAA6B,GAAA;AAC3C,EAAA,MAAM,MAAM,iBAAkB,EAAA,CAAA;AAE9B,EAAA,IAAI,CAAC,GAAK,EAAA,MAAA;AACR,IAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA,CAAA;AAE7D,EAAA,OAAO,GAAI,CAAA,MAAA,CAAA;AACb;;;;"}
@@ -11,5 +11,11 @@ function useIndexerContext() {
11
11
  return indexerAsyncContext.use();
12
12
  }
13
13
 
14
+ function defineIndexerPlugin(def) {
15
+ return def;
16
+ }
17
+
18
+ exports.defineIndexerPlugin = defineIndexerPlugin;
14
19
  exports.indexerAsyncContext = indexerAsyncContext;
15
20
  exports.useIndexerContext = useIndexerContext;
21
+ //# sourceMappingURL=indexer.479ae593.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.479ae593.cjs","sources":["../../src/context.ts","../../src/plugins/config.ts"],"sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { Cursor, DataFinality } from \"@apibara/protocol\";\nimport { getContext } from \"unctx\";\n\n// biome-ignore lint/suspicious/noExplicitAny: context type\nexport interface IndexerContext extends Record<string, any> {}\n\nexport const indexerAsyncContext = getContext<IndexerContext>(\"indexer\", {\n asyncContext: true,\n AsyncLocalStorage,\n});\n\nexport function useIndexerContext() {\n return indexerAsyncContext.use() as IndexerContext;\n}\n\nexport interface MessageMetadataContext extends IndexerContext {\n cursor?: Cursor;\n endCursor?: Cursor;\n finality?: DataFinality;\n}\n\nexport function useMessageMetadataContext(): MessageMetadataContext {\n return useIndexerContext() as MessageMetadataContext;\n}\n","import type { Indexer } from \"../indexer\";\n\nexport type IndexerPlugin<TFilter, TBlock> = (\n indexer: Indexer<TFilter, TBlock>,\n) => void;\n\nexport function defineIndexerPlugin<TFilter, TBlock>(\n def: IndexerPlugin<TFilter, TBlock>,\n) {\n return def;\n}\n"],"names":["getContext","AsyncLocalStorage"],"mappings":";;;;;AAOa,MAAA,mBAAA,GAAsBA,iBAA2B,SAAW,EAAA;AAAA,EACvE,YAAc,EAAA,IAAA;AAAA,qBACdC,kCAAA;AACF,CAAC,EAAA;AAEM,SAAS,iBAAoB,GAAA;AAClC,EAAA,OAAO,oBAAoB,GAAI,EAAA,CAAA;AACjC;;ACRO,SAAS,oBACd,GACA,EAAA;AACA,EAAO,OAAA,GAAA,CAAA;AACT;;;;;;"}
@@ -1,4 +1,4 @@
1
- import { StreamDataRequest, StreamDataOptions, Cursor, StreamDataResponse, Invalidate, Finalize, Heartbeat, SystemMessage, DataFinality, StreamConfig, Client } from '@apibara/protocol';
1
+ import { StreamDataRequest, StreamDataOptions, Cursor, StreamDataResponse, Invalidate, Finalize, SystemMessage, DataFinality, DataProduction, CreateClientOptions, StreamConfig, Client } from '@apibara/protocol';
2
2
  import { NestedHooks, Hookable } from 'hookable';
3
3
 
4
4
  interface IndexerContext extends Record<string, any> {
@@ -13,36 +13,51 @@ declare function defineIndexerPlugin<TFilter, TBlock>(def: IndexerPlugin<TFilter
13
13
 
14
14
  type UseMiddlewareFunction = (fn: MiddlewareFunction<IndexerContext>) => void;
15
15
  interface IndexerHooks<TFilter, TBlock> {
16
- "run:before": () => void;
17
- "run:after": () => void;
16
+ "plugins:init": ({ abortSignal }: {
17
+ abortSignal?: AbortSignal;
18
+ }) => void;
19
+ "run:before": ({ abortSignal }: {
20
+ abortSignal?: AbortSignal;
21
+ }) => void;
22
+ "run:after": ({ abortSignal }: {
23
+ abortSignal?: AbortSignal;
24
+ }) => void;
18
25
  "connect:before": ({ request, options, }: {
19
26
  request: StreamDataRequest<TFilter>;
20
27
  options: StreamDataOptions;
28
+ abortSignal?: AbortSignal;
21
29
  }) => void;
22
30
  "connect:after": ({ request, }: {
23
31
  request: StreamDataRequest<TFilter>;
32
+ abortSignal?: AbortSignal;
24
33
  }) => void;
25
- "connect:factory": ({ request, endCursor, }: {
34
+ "connect:factory": ({ request, endCursor, abortSignal, }: {
26
35
  request: StreamDataRequest<TFilter>;
27
36
  endCursor?: Cursor;
37
+ abortSignal?: AbortSignal;
28
38
  }) => void;
29
- "handler:middleware": ({ use }: {
39
+ "handler:middleware": ({ use, abortSignal, }: {
30
40
  use: UseMiddlewareFunction;
41
+ abortSignal?: AbortSignal;
31
42
  }) => void;
32
- message: ({ message }: {
43
+ message: ({ message, abortSignal, }: {
33
44
  message: StreamDataResponse<TBlock>;
45
+ abortSignal?: AbortSignal;
34
46
  }) => void;
35
- "message:invalidate": ({ message }: {
47
+ "message:invalidate": ({ message, abortSignal, }: {
36
48
  message: Invalidate;
49
+ abortSignal?: AbortSignal;
37
50
  }) => void;
38
- "message:finalize": ({ message }: {
51
+ "message:finalize": ({ message, abortSignal, }: {
39
52
  message: Finalize;
53
+ abortSignal?: AbortSignal;
40
54
  }) => void;
41
- "message:heartbeat": ({ message }: {
42
- message: Heartbeat;
55
+ "message:heartbeat": ({ abortSignal }: {
56
+ abortSignal?: AbortSignal;
43
57
  }) => void;
44
- "message:systemMessage": ({ message }: {
58
+ "message:systemMessage": ({ message, abortSignal, }: {
45
59
  message: SystemMessage;
60
+ abortSignal?: AbortSignal;
46
61
  }) => void;
47
62
  }
48
63
  type IndexerStartingCursor = {
@@ -55,23 +70,24 @@ type IndexerStartingCursor = {
55
70
  startingCursor?: never;
56
71
  startingBlock?: never;
57
72
  };
73
+ type HandlerArgs<TBlock> = {
74
+ block: TBlock;
75
+ cursor?: Cursor | undefined;
76
+ endCursor?: Cursor | undefined;
77
+ finality: DataFinality;
78
+ production: DataProduction;
79
+ context: IndexerContext;
80
+ abortSignal?: AbortSignal;
81
+ };
58
82
  type IndexerConfig<TFilter, TBlock> = {
59
83
  streamUrl: string;
60
84
  filter: TFilter;
61
85
  finality?: DataFinality;
62
- factory?: ({ block, context, }: {
63
- block: TBlock;
64
- context: IndexerContext;
65
- }) => Promise<{
86
+ clientOptions?: CreateClientOptions;
87
+ factory?: (args: HandlerArgs<TBlock>) => Promise<{
66
88
  filter?: TFilter;
67
89
  }>;
68
- transform: (args: {
69
- block: TBlock;
70
- cursor?: Cursor | undefined;
71
- endCursor?: Cursor | undefined;
72
- finality: DataFinality;
73
- context: IndexerContext;
74
- }) => Promise<void>;
90
+ transform: (args: HandlerArgs<TBlock>) => Promise<void>;
75
91
  hooks?: NestedHooks<IndexerHooks<TFilter, TBlock>>;
76
92
  plugins?: ReadonlyArray<IndexerPlugin<TFilter, TBlock>>;
77
93
  debug?: boolean;
@@ -94,7 +110,8 @@ interface ReconnectOptions {
94
110
  declare function runWithReconnect<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, options?: ReconnectOptions): Promise<void>;
95
111
  interface RunOptions {
96
112
  onConnect?: () => void | Promise<void>;
113
+ abortSignal?: AbortSignal;
97
114
  }
98
115
  declare function run<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, runOptions?: RunOptions): Promise<void>;
99
116
 
100
- export { type IndexerWithStreamConfig as I, type ReconnectOptions as R, type UseMiddlewareFunction as U, type Indexer as a, type IndexerPlugin as b, type IndexerConfig as c, defineIndexerPlugin as d, type IndexerHooks as e, type IndexerStartingCursor as f, defineIndexer as g, createIndexer as h, type RunOptions as i, run as j, runWithReconnect as r, useIndexerContext as u };
117
+ export { type HandlerArgs as H, type IndexerHooks as I, type ReconnectOptions as R, type UseMiddlewareFunction as U, type IndexerStartingCursor as a, type IndexerConfig as b, type IndexerWithStreamConfig as c, defineIndexer as d, type Indexer as e, createIndexer as f, type RunOptions as g, run as h, type IndexerPlugin as i, defineIndexerPlugin as j, runWithReconnect as r, useIndexerContext as u };