@apibara/indexer 2.1.0-beta.3 → 2.1.0-beta.31

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 (66) hide show
  1. package/dist/index.cjs +71 -26
  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 +61 -16
  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 +4 -4
  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 +2 -2
  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.fedcd831.d.cts → indexer.27b29a67.d.cts} +3 -4
  34. package/dist/shared/{indexer.fedcd831.d.mts → indexer.27b29a67.d.mts} +3 -4
  35. package/dist/shared/{indexer.fedcd831.d.ts → indexer.27b29a67.d.ts} +3 -4
  36. package/dist/shared/{indexer.077335f3.cjs → indexer.479ae593.cjs} +6 -0
  37. package/dist/shared/indexer.479ae593.cjs.map +1 -0
  38. package/dist/shared/{indexer.a55ad619.mjs → indexer.75773ef1.mjs} +6 -1
  39. package/dist/shared/indexer.75773ef1.mjs.map +1 -0
  40. package/dist/shared/{indexer.ff25c953.mjs → indexer.98a921a7.mjs} +2 -2
  41. package/dist/shared/indexer.98a921a7.mjs.map +1 -0
  42. package/dist/shared/{indexer.2416906c.cjs → indexer.a09fa402.cjs} +4 -4
  43. package/dist/shared/indexer.a09fa402.cjs.map +1 -0
  44. package/dist/testing/index.cjs +10 -5
  45. package/dist/testing/index.cjs.map +1 -0
  46. package/dist/testing/index.d.cts +4 -3
  47. package/dist/testing/index.d.mts +4 -3
  48. package/dist/testing/index.d.ts +4 -3
  49. package/dist/testing/index.mjs +10 -5
  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 +49 -15
  60. package/src/internal/testing.ts +34 -11
  61. package/src/otel.ts +29 -2
  62. package/src/testing/index.ts +11 -0
  63. package/dist/shared/indexer.601ceab0.cjs +0 -7
  64. package/dist/shared/indexer.9b21ddd2.mjs +0 -5
  65. package/src/compose.test.ts +0 -76
  66. package/src/indexer.test.ts +0 -430
@@ -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.a09fa402.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 { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.27b29a67.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 { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.27b29a67.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 { a as Indexer, b as IndexerPlugin, c as IndexerConfig } from '../shared/indexer.27b29a67.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.98a921a7.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.a09fa402.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 { b as IndexerPlugin } from '../shared/indexer.27b29a67.cjs';
2
+ export { d as defineIndexerPlugin } from '../shared/indexer.27b29a67.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 { b as IndexerPlugin } from '../shared/indexer.27b29a67.mjs';
2
+ export { d as defineIndexerPlugin } from '../shared/indexer.27b29a67.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 { b as IndexerPlugin } from '../shared/indexer.27b29a67.js';
2
+ export { d as defineIndexerPlugin } from '../shared/indexer.27b29a67.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.98a921a7.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,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, CreateClientOptions, StreamConfig, Client } from '@apibara/protocol';
2
2
  import { NestedHooks, Hookable } from 'hookable';
3
3
 
4
4
  interface IndexerContext extends Record<string, any> {
@@ -38,9 +38,7 @@ interface IndexerHooks<TFilter, TBlock> {
38
38
  "message:finalize": ({ message }: {
39
39
  message: Finalize;
40
40
  }) => void;
41
- "message:heartbeat": ({ message }: {
42
- message: Heartbeat;
43
- }) => void;
41
+ "message:heartbeat": () => void;
44
42
  "message:systemMessage": ({ message }: {
45
43
  message: SystemMessage;
46
44
  }) => void;
@@ -59,6 +57,7 @@ type IndexerConfig<TFilter, TBlock> = {
59
57
  streamUrl: string;
60
58
  filter: TFilter;
61
59
  finality?: DataFinality;
60
+ clientOptions?: CreateClientOptions;
62
61
  factory?: ({ block, context, }: {
63
62
  block: TBlock;
64
63
  context: IndexerContext;
@@ -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, CreateClientOptions, StreamConfig, Client } from '@apibara/protocol';
2
2
  import { NestedHooks, Hookable } from 'hookable';
3
3
 
4
4
  interface IndexerContext extends Record<string, any> {
@@ -38,9 +38,7 @@ interface IndexerHooks<TFilter, TBlock> {
38
38
  "message:finalize": ({ message }: {
39
39
  message: Finalize;
40
40
  }) => void;
41
- "message:heartbeat": ({ message }: {
42
- message: Heartbeat;
43
- }) => void;
41
+ "message:heartbeat": () => void;
44
42
  "message:systemMessage": ({ message }: {
45
43
  message: SystemMessage;
46
44
  }) => void;
@@ -59,6 +57,7 @@ type IndexerConfig<TFilter, TBlock> = {
59
57
  streamUrl: string;
60
58
  filter: TFilter;
61
59
  finality?: DataFinality;
60
+ clientOptions?: CreateClientOptions;
62
61
  factory?: ({ block, context, }: {
63
62
  block: TBlock;
64
63
  context: IndexerContext;
@@ -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, CreateClientOptions, StreamConfig, Client } from '@apibara/protocol';
2
2
  import { NestedHooks, Hookable } from 'hookable';
3
3
 
4
4
  interface IndexerContext extends Record<string, any> {
@@ -38,9 +38,7 @@ interface IndexerHooks<TFilter, TBlock> {
38
38
  "message:finalize": ({ message }: {
39
39
  message: Finalize;
40
40
  }) => void;
41
- "message:heartbeat": ({ message }: {
42
- message: Heartbeat;
43
- }) => void;
41
+ "message:heartbeat": () => void;
44
42
  "message:systemMessage": ({ message }: {
45
43
  message: SystemMessage;
46
44
  }) => void;
@@ -59,6 +57,7 @@ type IndexerConfig<TFilter, TBlock> = {
59
57
  streamUrl: string;
60
58
  filter: TFilter;
61
59
  finality?: DataFinality;
60
+ clientOptions?: CreateClientOptions;
62
61
  factory?: ({ block, context, }: {
63
62
  block: TBlock;
64
63
  context: IndexerContext;
@@ -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,6 +1,5 @@
1
1
  import { consola } from 'consola';
2
- import { u as useIndexerContext } from './indexer.a55ad619.mjs';
3
- import { d as defineIndexerPlugin } from './indexer.9b21ddd2.mjs';
2
+ import { d as defineIndexerPlugin, u as useIndexerContext } from './indexer.75773ef1.mjs';
4
3
 
5
4
  function logger({
6
5
  logger: logger2
@@ -24,3 +23,4 @@ function useLogger() {
24
23
  }
25
24
 
26
25
  export { logger as l, useLogger as u };
26
+ //# sourceMappingURL=indexer.98a921a7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.98a921a7.mjs","sources":["../../src/plugins/logger.ts"],"sourcesContent":["import { type ConsolaInstance, type ConsolaReporter, consola } 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(\"run:before\", () => {\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 });\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":";;;AAMO,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,YAAA,EAAc,MAAM;AACrC,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;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;;;;"}
@@ -1,15 +1,14 @@
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
10
  indexer.hooks.hook("run:before", () => {
12
- const ctx = context.useIndexerContext();
11
+ const ctx = config.useIndexerContext();
13
12
  if (logger2) {
14
13
  ctx.logger = consola.consola.create({ reporters: [logger2] });
15
14
  } else {
@@ -19,7 +18,7 @@ function logger({
19
18
  });
20
19
  }
21
20
  function useLogger() {
22
- const ctx = context.useIndexerContext();
21
+ const ctx = config.useIndexerContext();
23
22
  if (!ctx?.logger)
24
23
  throw new Error("Logger plugin is not available in context");
25
24
  return ctx.logger;
@@ -27,3 +26,4 @@ function useLogger() {
27
26
 
28
27
  exports.logger = logger;
29
28
  exports.useLogger = useLogger;
29
+ //# sourceMappingURL=indexer.a09fa402.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.a09fa402.cjs","sources":["../../src/plugins/logger.ts"],"sourcesContent":["import { type ConsolaInstance, type ConsolaReporter, consola } 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(\"run:before\", () => {\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 });\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"],"mappings":";;;;;AAMO,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,YAAA,EAAc,MAAM;AACrC,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;AAAA,KACD,CAAA,CAAA;AAAA,GACF,CAAA,CAAA;AACH,CAAA;AAEO,SAAS,SAA6B,GAAA;AAC3C,EAAA,MAAM,MAAMD,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;;;;;"}
@@ -2,18 +2,17 @@
2
2
 
3
3
  const protocol = require('@apibara/protocol');
4
4
  const ci = require('ci-info');
5
+ const config = require('../shared/indexer.479ae593.cjs');
5
6
  const index = require('../index.cjs');
6
7
  const internal_plugins = require('../internal/plugins.cjs');
7
- const logger = require('../shared/indexer.2416906c.cjs');
8
+ const logger = require('../shared/indexer.a09fa402.cjs');
8
9
  const vcr_index = require('../vcr/index.cjs');
10
+ require('node:async_hooks');
11
+ require('unctx');
9
12
  require('consola');
10
13
  require('hookable');
11
14
  require('node:assert');
12
- require('../shared/indexer.077335f3.cjs');
13
- require('node:async_hooks');
14
- require('unctx');
15
15
  require('@opentelemetry/api');
16
- require('../shared/indexer.601ceab0.cjs');
17
16
  require('node:fs/promises');
18
17
  require('node:path');
19
18
  require('node:fs');
@@ -24,6 +23,7 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
24
23
  const ci__default = /*#__PURE__*/_interopDefaultCompat(ci);
25
24
 
26
25
  function createVcr() {
26
+ let result;
27
27
  return {
28
28
  async run(cassetteName, indexerConfig, range) {
29
29
  const vcrConfig = {
@@ -47,6 +47,9 @@ function createVcr() {
47
47
  ...indexerConfig.plugins ?? []
48
48
  ];
49
49
  const indexer = index.createIndexer(indexerConfig);
50
+ indexer.hooks.hook("run:after", () => {
51
+ result = config.useIndexerContext();
52
+ });
50
53
  if (!vcr_index.isCassetteAvailable(vcrConfig, cassetteName)) {
51
54
  if (ci__default.isCI) {
52
55
  throw new Error("Cannot record cassette in CI");
@@ -59,8 +62,10 @@ function createVcr() {
59
62
  } else {
60
63
  await vcr_index.replay(vcrConfig, indexer, cassetteName);
61
64
  }
65
+ return result;
62
66
  }
63
67
  };
64
68
  }
65
69
 
66
70
  exports.createVcr = createVcr;
71
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/testing/index.ts"],"sourcesContent":["import { createClient } from \"@apibara/protocol\";\nimport ci from \"ci-info\";\nimport { useIndexerContext } from \"../context\";\nimport { type IndexerWithStreamConfig, createIndexer } from \"../indexer\";\nimport { type InternalContext, internalContext } from \"../plugins/context\";\nimport { logger } from \"../plugins/logger\";\nimport type { CassetteOptions, VcrConfig } from \"../vcr/config\";\nimport { isCassetteAvailable } from \"../vcr/helper\";\nimport { record } from \"../vcr/record\";\nimport { replay } from \"../vcr/replay\";\n\nexport type VcrResult = Record<string, unknown>;\n\nexport function createVcr() {\n let result: VcrResult;\n\n return {\n async run<TFilter, TBlock>(\n cassetteName: string,\n indexerConfig: IndexerWithStreamConfig<TFilter, TBlock>,\n range: { fromBlock: bigint; toBlock: bigint },\n ) {\n const vcrConfig: VcrConfig = {\n cassetteDir: \"cassettes\",\n };\n\n const cassetteOptions: CassetteOptions = {\n name: cassetteName,\n startingCursor: {\n orderKey: range.fromBlock,\n },\n endingCursor: {\n orderKey: range.toBlock,\n },\n };\n\n indexerConfig.plugins = [\n internalContext({\n indexerName: cassetteName,\n availableIndexers: [cassetteName],\n } as InternalContext),\n logger(),\n ...(indexerConfig.plugins ?? []),\n ];\n\n const indexer = createIndexer(indexerConfig);\n\n indexer.hooks.hook(\"run:after\", () => {\n result = useIndexerContext();\n });\n\n if (!isCassetteAvailable(vcrConfig, cassetteName)) {\n if (ci.isCI) {\n throw new Error(\"Cannot record cassette in CI\");\n }\n\n const client = createClient(\n indexer.streamConfig,\n indexer.options.streamUrl,\n );\n await record(vcrConfig, client, indexer, cassetteOptions);\n } else {\n await replay(vcrConfig, indexer, cassetteName);\n }\n\n return result;\n },\n };\n}\n"],"names":["internalContext","logger","createIndexer","useIndexerContext","isCassetteAvailable","ci","createClient","record","replay"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,SAAY,GAAA;AAC1B,EAAI,IAAA,MAAA,CAAA;AAEJ,EAAO,OAAA;AAAA,IACL,MAAM,GAAA,CACJ,YACA,EAAA,aAAA,EACA,KACA,EAAA;AACA,MAAA,MAAM,SAAuB,GAAA;AAAA,QAC3B,WAAa,EAAA,WAAA;AAAA,OACf,CAAA;AAEA,MAAA,MAAM,eAAmC,GAAA;AAAA,QACvC,IAAM,EAAA,YAAA;AAAA,QACN,cAAgB,EAAA;AAAA,UACd,UAAU,KAAM,CAAA,SAAA;AAAA,SAClB;AAAA,QACA,YAAc,EAAA;AAAA,UACZ,UAAU,KAAM,CAAA,OAAA;AAAA,SAClB;AAAA,OACF,CAAA;AAEA,MAAA,aAAA,CAAc,OAAU,GAAA;AAAA,QACtBA,gCAAgB,CAAA;AAAA,UACd,WAAa,EAAA,YAAA;AAAA,UACb,iBAAA,EAAmB,CAAC,YAAY,CAAA;AAAA,SACd,CAAA;AAAA,QACpBC,aAAO,EAAA;AAAA,QACP,GAAI,aAAc,CAAA,OAAA,IAAW,EAAC;AAAA,OAChC,CAAA;AAEA,MAAM,MAAA,OAAA,GAAUC,oBAAc,aAAa,CAAA,CAAA;AAE3C,MAAQ,OAAA,CAAA,KAAA,CAAM,IAAK,CAAA,WAAA,EAAa,MAAM;AACpC,QAAA,MAAA,GAASC,wBAAkB,EAAA,CAAA;AAAA,OAC5B,CAAA,CAAA;AAED,MAAA,IAAI,CAACC,6BAAA,CAAoB,SAAW,EAAA,YAAY,CAAG,EAAA;AACjD,QAAA,IAAIC,YAAG,IAAM,EAAA;AACX,UAAM,MAAA,IAAI,MAAM,8BAA8B,CAAA,CAAA;AAAA,SAChD;AAEA,QAAA,MAAM,MAAS,GAAAC,qBAAA;AAAA,UACb,OAAQ,CAAA,YAAA;AAAA,UACR,QAAQ,OAAQ,CAAA,SAAA;AAAA,SAClB,CAAA;AACA,QAAA,MAAMC,gBAAO,CAAA,SAAA,EAAW,MAAQ,EAAA,OAAA,EAAS,eAAe,CAAA,CAAA;AAAA,OACnD,MAAA;AACL,QAAM,MAAAC,gBAAA,CAAO,SAAW,EAAA,OAAA,EAAS,YAAY,CAAA,CAAA;AAAA,OAC/C;AAEA,MAAO,OAAA,MAAA,CAAA;AAAA,KACT;AAAA,GACF,CAAA;AACF;;;;"}