@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.
- package/dist/index.cjs +81 -27
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +71 -17
- package/dist/index.mjs.map +1 -0
- package/dist/internal/index.cjs +1 -0
- package/dist/internal/index.cjs.map +1 -0
- package/dist/internal/index.mjs +1 -0
- package/dist/internal/index.mjs.map +1 -0
- package/dist/internal/plugins.cjs +5 -5
- package/dist/internal/plugins.cjs.map +1 -0
- package/dist/internal/plugins.d.cts +1 -1
- package/dist/internal/plugins.d.mts +1 -1
- package/dist/internal/plugins.d.ts +1 -1
- package/dist/internal/plugins.mjs +3 -3
- package/dist/internal/plugins.mjs.map +1 -0
- package/dist/internal/testing.cjs +25 -10
- package/dist/internal/testing.cjs.map +1 -0
- package/dist/internal/testing.d.cts +5 -3
- package/dist/internal/testing.d.mts +5 -3
- package/dist/internal/testing.d.ts +5 -3
- package/dist/internal/testing.mjs +23 -8
- package/dist/internal/testing.mjs.map +1 -0
- package/dist/plugins/index.cjs +4 -4
- package/dist/plugins/index.cjs.map +1 -0
- package/dist/plugins/index.d.cts +2 -2
- package/dist/plugins/index.d.mts +2 -2
- package/dist/plugins/index.d.ts +2 -2
- package/dist/plugins/index.mjs +4 -4
- package/dist/plugins/index.mjs.map +1 -0
- package/dist/shared/{indexer.2416906c.cjs → indexer.03c9f151.cjs} +8 -5
- package/dist/shared/indexer.03c9f151.cjs.map +1 -0
- package/dist/shared/{indexer.ff25c953.mjs → indexer.2673dcb1.mjs} +7 -4
- package/dist/shared/indexer.2673dcb1.mjs.map +1 -0
- package/dist/shared/{indexer.077335f3.cjs → indexer.479ae593.cjs} +6 -0
- package/dist/shared/indexer.479ae593.cjs.map +1 -0
- package/dist/shared/{indexer.a55ad619.mjs → indexer.75773ef1.mjs} +6 -1
- package/dist/shared/indexer.75773ef1.mjs.map +1 -0
- package/dist/shared/{indexer.fedcd831.d.cts → indexer.806c605c.d.cts} +15 -16
- package/dist/shared/{indexer.fedcd831.d.mts → indexer.806c605c.d.mts} +15 -16
- package/dist/shared/{indexer.fedcd831.d.ts → indexer.806c605c.d.ts} +15 -16
- package/dist/testing/index.cjs +19 -10
- package/dist/testing/index.cjs.map +1 -0
- package/dist/testing/index.d.cts +11 -7
- package/dist/testing/index.d.mts +11 -7
- package/dist/testing/index.d.ts +11 -7
- package/dist/testing/index.mjs +20 -11
- package/dist/testing/index.mjs.map +1 -0
- package/dist/vcr/index.cjs +3 -1
- package/dist/vcr/index.cjs.map +1 -0
- package/dist/vcr/index.d.cts +1 -1
- package/dist/vcr/index.d.mts +1 -1
- package/dist/vcr/index.d.ts +1 -1
- package/dist/vcr/index.mjs +3 -1
- package/dist/vcr/index.mjs.map +1 -0
- package/package.json +3 -3
- package/src/indexer.ts +78 -28
- package/src/internal/testing.ts +34 -11
- package/src/otel.ts +29 -2
- package/src/plugins/context.ts +1 -1
- package/src/plugins/logger.ts +11 -2
- package/src/testing/index.ts +30 -6
- package/dist/shared/indexer.601ceab0.cjs +0 -7
- package/dist/shared/indexer.9b21ddd2.mjs +0 -5
- package/src/compose.test.ts +0 -76
- package/src/indexer.test.ts +0 -430
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { u as useIndexerContext } from '../shared/indexer.
|
|
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("
|
|
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
|
|
5
|
+
const config = require('../shared/indexer.479ae593.cjs');
|
|
6
6
|
const index = require('../index.cjs');
|
|
7
|
-
const
|
|
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:
|
|
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:
|
|
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:
|
|
50
|
+
cursor: { orderKey: currentBlockNumber - 1n },
|
|
44
51
|
finality: "accepted",
|
|
45
|
-
data: [{ data: `${
|
|
46
|
-
endCursor: {
|
|
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
|
|
112
|
-
return { output: context
|
|
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 {
|
|
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
|
-
|
|
25
|
+
filter?: string | undefined;
|
|
24
26
|
}, {
|
|
25
|
-
|
|
27
|
+
data?: string | undefined;
|
|
26
28
|
}>;
|
|
27
29
|
type MockRet = {
|
|
28
30
|
data: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
25
|
+
filter?: string | undefined;
|
|
24
26
|
}, {
|
|
25
|
-
|
|
27
|
+
data?: string | undefined;
|
|
26
28
|
}>;
|
|
27
29
|
type MockRet = {
|
|
28
30
|
data: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
25
|
+
filter?: string | undefined;
|
|
24
26
|
}, {
|
|
25
|
-
|
|
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.
|
|
3
|
+
import { d as defineIndexerPlugin, u as useIndexerContext } from '../shared/indexer.75773ef1.mjs';
|
|
4
4
|
import { createIndexer, defineIndexer } from '../index.mjs';
|
|
5
|
-
import {
|
|
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:
|
|
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:
|
|
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:
|
|
48
|
+
cursor: { orderKey: currentBlockNumber - 1n },
|
|
42
49
|
finality: "accepted",
|
|
43
|
-
data: [{ data: `${
|
|
44
|
-
endCursor: {
|
|
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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"}
|
package/dist/plugins/index.cjs
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const config = require('../shared/indexer.
|
|
4
|
-
const logger = require('../shared/indexer.
|
|
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;;;;;;;"}
|
package/dist/plugins/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
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';
|
package/dist/plugins/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
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';
|
package/dist/plugins/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export {
|
|
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';
|
package/dist/plugins/index.mjs
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { d as defineIndexerPlugin } from '../shared/indexer.
|
|
2
|
-
export { l as logger, u as useLogger } from '../shared/indexer.
|
|
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
|
|
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("
|
|
12
|
-
const ctx =
|
|
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 =
|
|
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.
|
|
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("
|
|
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
|
-
|
|
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,
|
|
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": (
|
|
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
|
-
|
|
63
|
-
|
|
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
|
|
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 };
|