@apibara/indexer 2.1.0-beta.4 → 2.1.0-beta.40

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 (68) hide show
  1. package/dist/index.cjs +81 -27
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +1 -1
  4. package/dist/index.d.mts +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.mjs +71 -17
  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 +25 -10
  20. package/dist/internal/testing.cjs.map +1 -0
  21. package/dist/internal/testing.d.cts +5 -3
  22. package/dist/internal/testing.d.mts +5 -3
  23. package/dist/internal/testing.d.ts +5 -3
  24. package/dist/internal/testing.mjs +23 -8
  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.a55ad619.mjs → indexer.75773ef1.mjs} +6 -1
  40. package/dist/shared/indexer.75773ef1.mjs.map +1 -0
  41. package/dist/shared/{indexer.fedcd831.d.cts → indexer.806c605c.d.cts} +15 -16
  42. package/dist/shared/{indexer.fedcd831.d.mts → indexer.806c605c.d.mts} +15 -16
  43. package/dist/shared/{indexer.fedcd831.d.ts → indexer.806c605c.d.ts} +15 -16
  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/indexer.ts +78 -28
  60. package/src/internal/testing.ts +34 -11
  61. package/src/otel.ts +29 -2
  62. package/src/plugins/context.ts +1 -1
  63. package/src/plugins/logger.ts +11 -2
  64. package/src/testing/index.ts +30 -6
  65. package/dist/shared/indexer.601ceab0.cjs +0 -7
  66. package/dist/shared/indexer.9b21ddd2.mjs +0 -5
  67. package/src/compose.test.ts +0 -76
  68. package/src/indexer.test.ts +0 -430
@@ -1,4 +1,4 @@
1
- import { b as IndexerPlugin } from '../shared/indexer.fedcd831.mjs';
1
+ import { c as IndexerPlugin } from '../shared/indexer.806c605c.mjs';
2
2
  import '@apibara/protocol';
3
3
  import 'hookable';
4
4
 
@@ -1,4 +1,4 @@
1
- import { b as IndexerPlugin } from '../shared/indexer.fedcd831.js';
1
+ import { c as IndexerPlugin } from '../shared/indexer.806c605c.js';
2
2
  import '@apibara/protocol';
3
3
  import 'hookable';
4
4
 
@@ -1,12 +1,11 @@
1
- import { u as useIndexerContext } from '../shared/indexer.a55ad619.mjs';
2
- import { d as defineIndexerPlugin } from '../shared/indexer.9b21ddd2.mjs';
1
+ import { d as defineIndexerPlugin, u as useIndexerContext } from '../shared/indexer.75773ef1.mjs';
3
2
  import 'node:async_hooks';
4
3
  import 'unctx';
5
4
 
6
5
  const INTERNAL_CONTEXT_PROPERTY = "_internal";
7
6
  function internalContext(values) {
8
7
  return defineIndexerPlugin((indexer) => {
9
- indexer.hooks.hook("run:before", () => {
8
+ indexer.hooks.hook("plugins:init", () => {
10
9
  try {
11
10
  const ctx = useIndexerContext();
12
11
  ctx[INTERNAL_CONTEXT_PROPERTY] = {
@@ -32,3 +31,4 @@ function useInternalContext() {
32
31
  }
33
32
 
34
33
  export { INTERNAL_CONTEXT_PROPERTY, internalContext, useInternalContext };
34
+ //# sourceMappingURL=plugins.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.mjs","sources":["../../src/plugins/context.ts"],"sourcesContent":["import { useIndexerContext } from \"../context\";\nimport { defineIndexerPlugin } from \"./config\";\n\nexport const INTERNAL_CONTEXT_PROPERTY = \"_internal\";\n\nexport function internalContext<TFilter, TBlock, TTxnParams>(\n values: Record<string, unknown>,\n) {\n return defineIndexerPlugin<TFilter, TBlock>((indexer) => {\n indexer.hooks.hook(\"plugins:init\", () => {\n try {\n const ctx = useIndexerContext();\n ctx[INTERNAL_CONTEXT_PROPERTY] = {\n ...(ctx[INTERNAL_CONTEXT_PROPERTY] || {}),\n ...values,\n };\n } catch (error) {\n throw new Error(\"Failed to set internal context\", {\n cause: error,\n });\n }\n });\n });\n}\n\nexport type InternalContext = {\n indexerName: string;\n availableIndexers: string[];\n};\n\nexport function useInternalContext(): InternalContext {\n const ctx = useIndexerContext();\n\n if (ctx[INTERNAL_CONTEXT_PROPERTY] === undefined) {\n throw new Error(\n \"Internal context is not available, possibly 'internalContext' plugin is missing!\",\n );\n }\n return ctx[INTERNAL_CONTEXT_PROPERTY];\n}\n"],"names":[],"mappings":";;;;AAGO,MAAM,yBAA4B,GAAA,YAAA;AAElC,SAAS,gBACd,MACA,EAAA;AACA,EAAO,OAAA,mBAAA,CAAqC,CAAC,OAAY,KAAA;AACvD,IAAQ,OAAA,CAAA,KAAA,CAAM,IAAK,CAAA,cAAA,EAAgB,MAAM;AACvC,MAAI,IAAA;AACF,QAAA,MAAM,MAAM,iBAAkB,EAAA,CAAA;AAC9B,QAAA,GAAA,CAAI,yBAAyB,CAAI,GAAA;AAAA,UAC/B,GAAI,GAAA,CAAI,yBAAyB,CAAA,IAAK,EAAC;AAAA,UACvC,GAAG,MAAA;AAAA,SACL,CAAA;AAAA,eACO,KAAO,EAAA;AACd,QAAM,MAAA,IAAI,MAAM,gCAAkC,EAAA;AAAA,UAChD,KAAO,EAAA,KAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH,CAAA;AAOO,SAAS,kBAAsC,GAAA;AACpD,EAAA,MAAM,MAAM,iBAAkB,EAAA,CAAA;AAE9B,EAAI,IAAA,GAAA,CAAI,yBAAyB,CAAA,KAAM,KAAW,CAAA,EAAA;AAChD,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,kFAAA;AAAA,KACF,CAAA;AAAA,GACF;AACA,EAAA,OAAO,IAAI,yBAAyB,CAAA,CAAA;AACtC;;;;"}
@@ -2,13 +2,13 @@
2
2
 
3
3
  const protocol = require('@apibara/protocol');
4
4
  const testing = require('@apibara/protocol/testing');
5
- const context = require('../shared/indexer.077335f3.cjs');
5
+ const config = require('../shared/indexer.479ae593.cjs');
6
6
  const index = require('../index.cjs');
7
- const config = require('../shared/indexer.601ceab0.cjs');
8
- require('consola');
7
+ const logger = require('../shared/indexer.03c9f151.cjs');
9
8
  const internal_plugins = require('./plugins.cjs');
10
9
  require('node:async_hooks');
11
10
  require('unctx');
11
+ require('consola');
12
12
  require('hookable');
13
13
  require('node:assert');
14
14
  require('@opentelemetry/api');
@@ -17,22 +17,29 @@ function generateMockMessages(count = 10, options) {
17
17
  const invalidateAt = options?.invalidate;
18
18
  const finalizeAt = options?.finalize;
19
19
  const messages = [];
20
+ const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5e6);
20
21
  for (let i = 0; i < count; i++) {
22
+ const currentBlockNumber = baseBlockNumber + BigInt(i);
23
+ const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);
21
24
  if (invalidateAt && i === invalidateAt.invalidateTriggerIndex) {
25
+ const invalidateToBlock = baseBlockNumber + BigInt(invalidateAt.invalidateFromIndex);
22
26
  messages.push({
23
27
  _tag: "invalidate",
24
28
  invalidate: {
25
29
  cursor: {
26
- orderKey: BigInt(5e6 + invalidateAt.invalidateFromIndex)
30
+ orderKey: invalidateToBlock,
31
+ uniqueKey: options?.uniqueKey ? uniqueKeyFromOrderKey(invalidateToBlock) : void 0
27
32
  }
28
33
  }
29
34
  });
30
35
  } else if (finalizeAt && i === finalizeAt.finalizeTriggerIndex) {
36
+ const fianlizedToBlock = baseBlockNumber + BigInt(finalizeAt.finalizeToIndex);
31
37
  messages.push({
32
38
  _tag: "finalize",
33
39
  finalize: {
34
40
  cursor: {
35
- orderKey: BigInt(5e6 + finalizeAt.finalizeToIndex)
41
+ orderKey: fianlizedToBlock,
42
+ uniqueKey: options?.uniqueKey ? uniqueKeyFromOrderKey(fianlizedToBlock) : void 0
36
43
  }
37
44
  }
38
45
  });
@@ -40,10 +47,13 @@ function generateMockMessages(count = 10, options) {
40
47
  messages.push({
41
48
  _tag: "data",
42
49
  data: {
43
- cursor: { orderKey: BigInt(5e6 + i - 1) },
50
+ cursor: { orderKey: currentBlockNumber - 1n },
44
51
  finality: "accepted",
45
- data: [{ data: `${5e6 + i}` }],
46
- endCursor: { orderKey: BigInt(5e6 + i) },
52
+ data: [{ data: `${baseBlockNumber + BigInt(i)}` }],
53
+ endCursor: {
54
+ orderKey: currentBlockNumber,
55
+ uniqueKey: options?.uniqueKey ? uniqueKey : void 0
56
+ },
47
57
  production: "backfill"
48
58
  }
49
59
  });
@@ -51,6 +61,9 @@ function generateMockMessages(count = 10, options) {
51
61
  }
52
62
  return messages;
53
63
  }
64
+ function uniqueKeyFromOrderKey(orderKey) {
65
+ return `0xff00${orderKey.toString()}`;
66
+ }
54
67
  function getMockIndexer(params) {
55
68
  const { internalContext: contextParams, override } = params ?? {};
56
69
  const { plugins, ...rest } = override ?? {};
@@ -62,6 +75,7 @@ function getMockIndexer(params) {
62
75
  async transform() {
63
76
  },
64
77
  plugins: [
78
+ logger.logger(),
65
79
  internal_plugins.internalContext(
66
80
  contextParams ?? {
67
81
  availableIndexers: ["testing"],
@@ -108,11 +122,12 @@ function mockSink({
108
122
  });
109
123
  }
110
124
  function useMockSink() {
111
- const context$1 = context.useIndexerContext();
112
- return { output: context$1.output };
125
+ const context = config.useIndexerContext();
126
+ return { output: context.output };
113
127
  }
114
128
 
115
129
  exports.generateMockMessages = generateMockMessages;
116
130
  exports.getMockIndexer = getMockIndexer;
117
131
  exports.mockSink = mockSink;
118
132
  exports.useMockSink = useMockSink;
133
+ //# sourceMappingURL=testing.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.cjs","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 MockMessagesOptions = {\n invalidate?: {\n invalidateFromIndex: number;\n invalidateTriggerIndex: number;\n };\n finalize?: {\n finalizeToIndex: number;\n finalizeTriggerIndex: number;\n };\n uniqueKey?: boolean;\n baseBlockNumber?: bigint;\n};\n\nexport function generateMockMessages(\n count = 10,\n options?: MockMessagesOptions,\n): MockStreamResponse[] {\n const invalidateAt = options?.invalidate;\n const finalizeAt = options?.finalize;\n const messages: MockStreamResponse[] = [];\n\n const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5_000_000);\n\n for (let i = 0; i < count; i++) {\n const currentBlockNumber = baseBlockNumber + BigInt(i);\n const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);\n if (invalidateAt && i === invalidateAt.invalidateTriggerIndex) {\n const invalidateToBlock =\n baseBlockNumber + BigInt(invalidateAt.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 (finalizeAt && i === finalizeAt.finalizeTriggerIndex) {\n const fianlizedToBlock =\n baseBlockNumber + BigInt(finalizeAt.finalizeToIndex);\n messages.push({\n _tag: \"finalize\",\n finalize: {\n cursor: {\n orderKey: fianlizedToBlock,\n uniqueKey: options?.uniqueKey\n ? uniqueKeyFromOrderKey(fianlizedToBlock)\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":["createIndexer","defineIndexer","MockStream","logger","internalContext","defineIndexerPlugin","isCursor","useIndexerContext"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.fedcd831.cjs';
1
+ import { b as Indexer, c as IndexerPlugin, d as IndexerConfig } from '../shared/indexer.806c605c.cjs';
2
2
  import { MockStreamResponse, MockFilter, MockBlock } from '@apibara/protocol/testing';
3
3
  import { InternalContext } from './plugins.cjs';
4
4
  import '@apibara/protocol';
@@ -13,6 +13,8 @@ type MockMessagesOptions = {
13
13
  finalizeToIndex: number;
14
14
  finalizeTriggerIndex: number;
15
15
  };
16
+ uniqueKey?: boolean;
17
+ baseBlockNumber?: bigint;
16
18
  };
17
19
  declare function generateMockMessages(count?: number, options?: MockMessagesOptions): MockStreamResponse[];
18
20
  type MockIndexerParams = {
@@ -20,9 +22,9 @@ type MockIndexerParams = {
20
22
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
21
23
  };
22
24
  declare function getMockIndexer(params?: MockIndexerParams): Indexer<{
23
- readonly filter?: string | undefined;
25
+ filter?: string | undefined;
24
26
  }, {
25
- readonly data?: string | undefined;
27
+ data?: string | undefined;
26
28
  }>;
27
29
  type MockRet = {
28
30
  data: string;
@@ -1,4 +1,4 @@
1
- import { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.fedcd831.mjs';
1
+ import { b as Indexer, c as IndexerPlugin, d as IndexerConfig } from '../shared/indexer.806c605c.mjs';
2
2
  import { MockStreamResponse, MockFilter, MockBlock } from '@apibara/protocol/testing';
3
3
  import { InternalContext } from './plugins.mjs';
4
4
  import '@apibara/protocol';
@@ -13,6 +13,8 @@ type MockMessagesOptions = {
13
13
  finalizeToIndex: number;
14
14
  finalizeTriggerIndex: number;
15
15
  };
16
+ uniqueKey?: boolean;
17
+ baseBlockNumber?: bigint;
16
18
  };
17
19
  declare function generateMockMessages(count?: number, options?: MockMessagesOptions): MockStreamResponse[];
18
20
  type MockIndexerParams = {
@@ -20,9 +22,9 @@ type MockIndexerParams = {
20
22
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
21
23
  };
22
24
  declare function getMockIndexer(params?: MockIndexerParams): Indexer<{
23
- readonly filter?: string | undefined;
25
+ filter?: string | undefined;
24
26
  }, {
25
- readonly data?: string | undefined;
27
+ data?: string | undefined;
26
28
  }>;
27
29
  type MockRet = {
28
30
  data: string;
@@ -1,4 +1,4 @@
1
- import { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.fedcd831.js';
1
+ import { b as Indexer, c as IndexerPlugin, d as IndexerConfig } from '../shared/indexer.806c605c.js';
2
2
  import { MockStreamResponse, MockFilter, MockBlock } from '@apibara/protocol/testing';
3
3
  import { InternalContext } from './plugins.js';
4
4
  import '@apibara/protocol';
@@ -13,6 +13,8 @@ type MockMessagesOptions = {
13
13
  finalizeToIndex: number;
14
14
  finalizeTriggerIndex: number;
15
15
  };
16
+ uniqueKey?: boolean;
17
+ baseBlockNumber?: bigint;
16
18
  };
17
19
  declare function generateMockMessages(count?: number, options?: MockMessagesOptions): MockStreamResponse[];
18
20
  type MockIndexerParams = {
@@ -20,9 +22,9 @@ type MockIndexerParams = {
20
22
  override?: Partial<IndexerConfig<MockFilter, MockBlock>>;
21
23
  };
22
24
  declare function getMockIndexer(params?: MockIndexerParams): Indexer<{
23
- readonly filter?: string | undefined;
25
+ filter?: string | undefined;
24
26
  }, {
25
- readonly data?: string | undefined;
27
+ data?: string | undefined;
26
28
  }>;
27
29
  type MockRet = {
28
30
  data: string;
@@ -1,12 +1,12 @@
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';
@@ -15,22 +15,29 @@ function generateMockMessages(count = 10, options) {
15
15
  const invalidateAt = options?.invalidate;
16
16
  const finalizeAt = options?.finalize;
17
17
  const messages = [];
18
+ const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5e6);
18
19
  for (let i = 0; i < count; i++) {
20
+ const currentBlockNumber = baseBlockNumber + BigInt(i);
21
+ const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);
19
22
  if (invalidateAt && i === invalidateAt.invalidateTriggerIndex) {
23
+ const invalidateToBlock = baseBlockNumber + BigInt(invalidateAt.invalidateFromIndex);
20
24
  messages.push({
21
25
  _tag: "invalidate",
22
26
  invalidate: {
23
27
  cursor: {
24
- orderKey: BigInt(5e6 + invalidateAt.invalidateFromIndex)
28
+ orderKey: invalidateToBlock,
29
+ uniqueKey: options?.uniqueKey ? uniqueKeyFromOrderKey(invalidateToBlock) : void 0
25
30
  }
26
31
  }
27
32
  });
28
33
  } else if (finalizeAt && i === finalizeAt.finalizeTriggerIndex) {
34
+ const fianlizedToBlock = baseBlockNumber + BigInt(finalizeAt.finalizeToIndex);
29
35
  messages.push({
30
36
  _tag: "finalize",
31
37
  finalize: {
32
38
  cursor: {
33
- orderKey: BigInt(5e6 + finalizeAt.finalizeToIndex)
39
+ orderKey: fianlizedToBlock,
40
+ uniqueKey: options?.uniqueKey ? uniqueKeyFromOrderKey(fianlizedToBlock) : void 0
34
41
  }
35
42
  }
36
43
  });
@@ -38,10 +45,13 @@ function generateMockMessages(count = 10, options) {
38
45
  messages.push({
39
46
  _tag: "data",
40
47
  data: {
41
- cursor: { orderKey: BigInt(5e6 + i - 1) },
48
+ cursor: { orderKey: currentBlockNumber - 1n },
42
49
  finality: "accepted",
43
- data: [{ data: `${5e6 + i}` }],
44
- endCursor: { orderKey: BigInt(5e6 + i) },
50
+ data: [{ data: `${baseBlockNumber + BigInt(i)}` }],
51
+ endCursor: {
52
+ orderKey: currentBlockNumber,
53
+ uniqueKey: options?.uniqueKey ? uniqueKey : void 0
54
+ },
45
55
  production: "backfill"
46
56
  }
47
57
  });
@@ -49,6 +59,9 @@ function generateMockMessages(count = 10, options) {
49
59
  }
50
60
  return messages;
51
61
  }
62
+ function uniqueKeyFromOrderKey(orderKey) {
63
+ return `0xff00${orderKey.toString()}`;
64
+ }
52
65
  function getMockIndexer(params) {
53
66
  const { internalContext: contextParams, override } = params ?? {};
54
67
  const { plugins, ...rest } = override ?? {};
@@ -60,6 +73,7 @@ function getMockIndexer(params) {
60
73
  async transform() {
61
74
  },
62
75
  plugins: [
76
+ logger(),
63
77
  internalContext(
64
78
  contextParams ?? {
65
79
  availableIndexers: ["testing"],
@@ -111,3 +125,4 @@ function useMockSink() {
111
125
  }
112
126
 
113
127
  export { generateMockMessages, getMockIndexer, mockSink, useMockSink };
128
+ //# 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 MockMessagesOptions = {\n invalidate?: {\n invalidateFromIndex: number;\n invalidateTriggerIndex: number;\n };\n finalize?: {\n finalizeToIndex: number;\n finalizeTriggerIndex: number;\n };\n uniqueKey?: boolean;\n baseBlockNumber?: bigint;\n};\n\nexport function generateMockMessages(\n count = 10,\n options?: MockMessagesOptions,\n): MockStreamResponse[] {\n const invalidateAt = options?.invalidate;\n const finalizeAt = options?.finalize;\n const messages: MockStreamResponse[] = [];\n\n const baseBlockNumber = options?.baseBlockNumber ?? BigInt(5_000_000);\n\n for (let i = 0; i < count; i++) {\n const currentBlockNumber = baseBlockNumber + BigInt(i);\n const uniqueKey = uniqueKeyFromOrderKey(currentBlockNumber);\n if (invalidateAt && i === invalidateAt.invalidateTriggerIndex) {\n const invalidateToBlock =\n baseBlockNumber + BigInt(invalidateAt.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 (finalizeAt && i === finalizeAt.finalizeTriggerIndex) {\n const fianlizedToBlock =\n baseBlockNumber + BigInt(finalizeAt.finalizeToIndex);\n messages.push({\n _tag: \"finalize\",\n finalize: {\n cursor: {\n orderKey: fianlizedToBlock,\n uniqueKey: options?.uniqueKey\n ? uniqueKeyFromOrderKey(fianlizedToBlock)\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 { c as IndexerPlugin } from '../shared/indexer.806c605c.cjs';
2
+ export { e as defineIndexerPlugin } from '../shared/indexer.806c605c.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 { c as IndexerPlugin } from '../shared/indexer.806c605c.mjs';
2
+ export { e as defineIndexerPlugin } from '../shared/indexer.806c605c.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 { c as IndexerPlugin } from '../shared/indexer.806c605c.js';
2
+ export { e as defineIndexerPlugin } from '../shared/indexer.806c605c.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;;;;;;"}
@@ -9,4 +9,9 @@ function useIndexerContext() {
9
9
  return indexerAsyncContext.use();
10
10
  }
11
11
 
12
- export { indexerAsyncContext as i, useIndexerContext as u };
12
+ function defineIndexerPlugin(def) {
13
+ return def;
14
+ }
15
+
16
+ export { defineIndexerPlugin as d, indexerAsyncContext as i, useIndexerContext as u };
17
+ //# sourceMappingURL=indexer.75773ef1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.75773ef1.mjs","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":[],"mappings":";;;AAOa,MAAA,mBAAA,GAAsB,WAA2B,SAAW,EAAA;AAAA,EACvE,YAAc,EAAA,IAAA;AAAA,EACd,iBAAA;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,6 +13,7 @@ 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
+ "plugins:init": () => void;
16
17
  "run:before": () => void;
17
18
  "run:after": () => void;
18
19
  "connect:before": ({ request, options, }: {
@@ -38,9 +39,7 @@ interface IndexerHooks<TFilter, TBlock> {
38
39
  "message:finalize": ({ message }: {
39
40
  message: Finalize;
40
41
  }) => void;
41
- "message:heartbeat": ({ message }: {
42
- message: Heartbeat;
43
- }) => void;
42
+ "message:heartbeat": () => void;
44
43
  "message:systemMessage": ({ message }: {
45
44
  message: SystemMessage;
46
45
  }) => void;
@@ -55,23 +54,23 @@ type IndexerStartingCursor = {
55
54
  startingCursor?: never;
56
55
  startingBlock?: never;
57
56
  };
57
+ type HandlerArgs<TBlock> = {
58
+ block: TBlock;
59
+ cursor?: Cursor | undefined;
60
+ endCursor?: Cursor | undefined;
61
+ finality: DataFinality;
62
+ production: DataProduction;
63
+ context: IndexerContext;
64
+ };
58
65
  type IndexerConfig<TFilter, TBlock> = {
59
66
  streamUrl: string;
60
67
  filter: TFilter;
61
68
  finality?: DataFinality;
62
- factory?: ({ block, context, }: {
63
- block: TBlock;
64
- context: IndexerContext;
65
- }) => Promise<{
69
+ clientOptions?: CreateClientOptions;
70
+ factory?: (args: HandlerArgs<TBlock>) => Promise<{
66
71
  filter?: TFilter;
67
72
  }>;
68
- transform: (args: {
69
- block: TBlock;
70
- cursor?: Cursor | undefined;
71
- endCursor?: Cursor | undefined;
72
- finality: DataFinality;
73
- context: IndexerContext;
74
- }) => Promise<void>;
73
+ transform: (args: HandlerArgs<TBlock>) => Promise<void>;
75
74
  hooks?: NestedHooks<IndexerHooks<TFilter, TBlock>>;
76
75
  plugins?: ReadonlyArray<IndexerPlugin<TFilter, TBlock>>;
77
76
  debug?: boolean;
@@ -97,4 +96,4 @@ interface RunOptions {
97
96
  }
98
97
  declare function run<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, runOptions?: RunOptions): Promise<void>;
99
98
 
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 };
99
+ export { type HandlerArgs as H, type IndexerWithStreamConfig as I, type ReconnectOptions as R, type UseMiddlewareFunction as U, type IndexerHooks as a, type Indexer as b, type IndexerPlugin as c, type IndexerConfig as d, defineIndexerPlugin 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 };