@apibara/indexer 2.0.0-beta.9 → 2.1.0-beta.2

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 (127) hide show
  1. package/dist/index.cjs +271 -39
  2. package/dist/index.d.cts +1 -16
  3. package/dist/index.d.mts +1 -16
  4. package/dist/index.d.ts +1 -16
  5. package/dist/index.mjs +262 -25
  6. package/dist/internal/index.cjs +10 -0
  7. package/dist/internal/index.d.cts +3 -0
  8. package/dist/internal/index.d.mts +3 -0
  9. package/dist/internal/index.d.ts +3 -0
  10. package/dist/internal/index.mjs +8 -0
  11. package/dist/internal/plugins.cjs +38 -0
  12. package/dist/internal/plugins.d.cts +13 -0
  13. package/dist/internal/plugins.d.mts +13 -0
  14. package/dist/internal/plugins.d.ts +13 -0
  15. package/dist/internal/plugins.mjs +34 -0
  16. package/dist/internal/testing.cjs +118 -0
  17. package/dist/internal/testing.d.cts +42 -0
  18. package/dist/internal/testing.d.mts +42 -0
  19. package/dist/internal/testing.d.ts +42 -0
  20. package/dist/internal/testing.mjs +113 -0
  21. package/dist/plugins/index.cjs +39 -3
  22. package/dist/plugins/index.d.cts +16 -2
  23. package/dist/plugins/index.d.mts +16 -2
  24. package/dist/plugins/index.d.ts +16 -2
  25. package/dist/plugins/index.mjs +36 -3
  26. package/dist/shared/indexer.077335f3.cjs +15 -0
  27. package/dist/shared/indexer.2416906c.cjs +29 -0
  28. package/dist/shared/indexer.601ceab0.cjs +7 -0
  29. package/dist/shared/indexer.9b21ddd2.mjs +5 -0
  30. package/dist/shared/indexer.a55ad619.mjs +12 -0
  31. package/dist/shared/indexer.fedcd831.d.cts +100 -0
  32. package/dist/shared/indexer.fedcd831.d.mts +100 -0
  33. package/dist/shared/indexer.fedcd831.d.ts +100 -0
  34. package/dist/shared/indexer.ff25c953.mjs +26 -0
  35. package/dist/testing/index.cjs +52 -50
  36. package/dist/testing/index.d.cts +8 -36
  37. package/dist/testing/index.d.mts +8 -36
  38. package/dist/testing/index.d.ts +8 -36
  39. package/dist/testing/index.mjs +47 -47
  40. package/dist/vcr/index.cjs +84 -17
  41. package/dist/vcr/index.d.cts +16 -7
  42. package/dist/vcr/index.d.mts +16 -7
  43. package/dist/vcr/index.d.ts +16 -7
  44. package/dist/vcr/index.mjs +75 -11
  45. package/package.json +22 -42
  46. package/src/compose.test.ts +76 -0
  47. package/src/compose.ts +71 -0
  48. package/src/context.ts +14 -8
  49. package/src/index.ts +0 -5
  50. package/src/indexer.test.ts +125 -186
  51. package/src/indexer.ts +278 -151
  52. package/src/internal/index.ts +6 -0
  53. package/src/internal/plugins.ts +1 -0
  54. package/src/internal/testing.ts +148 -0
  55. package/src/plugins/config.ts +4 -4
  56. package/src/plugins/context.ts +40 -0
  57. package/src/plugins/index.ts +8 -1
  58. package/src/plugins/logger.ts +30 -0
  59. package/src/plugins/persistence.ts +24 -187
  60. package/src/testing/index.ts +58 -3
  61. package/src/vcr/record.ts +5 -3
  62. package/src/vcr/replay.ts +8 -18
  63. package/dist/plugins/kv.cjs +0 -131
  64. package/dist/plugins/kv.d.cts +0 -32
  65. package/dist/plugins/kv.d.mts +0 -32
  66. package/dist/plugins/kv.d.ts +0 -32
  67. package/dist/plugins/kv.mjs +0 -124
  68. package/dist/plugins/persistence.cjs +0 -182
  69. package/dist/plugins/persistence.d.cts +0 -50
  70. package/dist/plugins/persistence.d.mts +0 -50
  71. package/dist/plugins/persistence.d.ts +0 -50
  72. package/dist/plugins/persistence.mjs +0 -179
  73. package/dist/shared/indexer.2c23c9cd.mjs +0 -35
  74. package/dist/shared/indexer.318d3617.cjs +0 -47
  75. package/dist/shared/indexer.36530330.mjs +0 -249
  76. package/dist/shared/indexer.500fd281.d.cts +0 -23
  77. package/dist/shared/indexer.541d43eb.cjs +0 -266
  78. package/dist/shared/indexer.93d6b2eb.mjs +0 -17
  79. package/dist/shared/indexer.a8b7ab1f.cjs +0 -25
  80. package/dist/shared/indexer.b9c8f0d8.d.cts +0 -19
  81. package/dist/shared/indexer.b9c8f0d8.d.mts +0 -19
  82. package/dist/shared/indexer.b9c8f0d8.d.ts +0 -19
  83. package/dist/shared/indexer.c7ed6b83.d.cts +0 -82
  84. package/dist/shared/indexer.e1856641.d.mts +0 -23
  85. package/dist/shared/indexer.e4f2430f.d.ts +0 -23
  86. package/dist/shared/indexer.e8bd138d.d.mts +0 -82
  87. package/dist/shared/indexer.f761abcd.d.ts +0 -82
  88. package/dist/sinks/csv.cjs +0 -85
  89. package/dist/sinks/csv.d.cts +0 -66
  90. package/dist/sinks/csv.d.mts +0 -66
  91. package/dist/sinks/csv.d.ts +0 -66
  92. package/dist/sinks/csv.mjs +0 -78
  93. package/dist/sinks/drizzle/index.cjs +0 -212
  94. package/dist/sinks/drizzle/index.d.cts +0 -153
  95. package/dist/sinks/drizzle/index.d.mts +0 -153
  96. package/dist/sinks/drizzle/index.d.ts +0 -153
  97. package/dist/sinks/drizzle/index.mjs +0 -198
  98. package/dist/sinks/sqlite.cjs +0 -90
  99. package/dist/sinks/sqlite.d.cts +0 -71
  100. package/dist/sinks/sqlite.d.mts +0 -71
  101. package/dist/sinks/sqlite.d.ts +0 -71
  102. package/dist/sinks/sqlite.mjs +0 -87
  103. package/src/hooks/index.ts +0 -2
  104. package/src/hooks/useKVStore.ts +0 -12
  105. package/src/hooks/useSink.ts +0 -13
  106. package/src/plugins/kv.test.ts +0 -120
  107. package/src/plugins/kv.ts +0 -132
  108. package/src/plugins/persistence.test.ts +0 -151
  109. package/src/sink.ts +0 -36
  110. package/src/sinks/csv.test.ts +0 -65
  111. package/src/sinks/csv.ts +0 -159
  112. package/src/sinks/drizzle/Int8Range.ts +0 -52
  113. package/src/sinks/drizzle/delete.ts +0 -42
  114. package/src/sinks/drizzle/drizzle.test.ts +0 -239
  115. package/src/sinks/drizzle/drizzle.ts +0 -115
  116. package/src/sinks/drizzle/index.ts +0 -6
  117. package/src/sinks/drizzle/insert.ts +0 -42
  118. package/src/sinks/drizzle/select.ts +0 -44
  119. package/src/sinks/drizzle/transaction.ts +0 -49
  120. package/src/sinks/drizzle/update.ts +0 -47
  121. package/src/sinks/drizzle/utils.ts +0 -99
  122. package/src/sinks/sqlite.test.ts +0 -99
  123. package/src/sinks/sqlite.ts +0 -170
  124. package/src/testing/helper.ts +0 -13
  125. package/src/testing/indexer.ts +0 -35
  126. package/src/testing/setup.ts +0 -59
  127. package/src/testing/vcr.ts +0 -54
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ const consola = require('consola');
4
+ const context = require('./indexer.077335f3.cjs');
5
+ const config = require('./indexer.601ceab0.cjs');
6
+
7
+ function logger({
8
+ logger: logger2
9
+ } = {}) {
10
+ return config.defineIndexerPlugin((indexer) => {
11
+ indexer.hooks.hook("run:before", () => {
12
+ const ctx = context.useIndexerContext();
13
+ if (logger2) {
14
+ ctx.logger = consola.consola.create({ reporters: [logger2] });
15
+ } else {
16
+ ctx.logger = consola.consola.create({});
17
+ }
18
+ });
19
+ });
20
+ }
21
+ function useLogger() {
22
+ const ctx = context.useIndexerContext();
23
+ if (!ctx?.logger)
24
+ throw new Error("Logger plugin is not available in context");
25
+ return ctx.logger;
26
+ }
27
+
28
+ exports.logger = logger;
29
+ exports.useLogger = useLogger;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ function defineIndexerPlugin(def) {
4
+ return def;
5
+ }
6
+
7
+ exports.defineIndexerPlugin = defineIndexerPlugin;
@@ -0,0 +1,5 @@
1
+ function defineIndexerPlugin(def) {
2
+ return def;
3
+ }
4
+
5
+ export { defineIndexerPlugin as d };
@@ -0,0 +1,12 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { getContext } from 'unctx';
3
+
4
+ const indexerAsyncContext = getContext("indexer", {
5
+ asyncContext: true,
6
+ AsyncLocalStorage
7
+ });
8
+ function useIndexerContext() {
9
+ return indexerAsyncContext.use();
10
+ }
11
+
12
+ export { indexerAsyncContext as i, useIndexerContext as u };
@@ -0,0 +1,100 @@
1
+ import { StreamDataRequest, StreamDataOptions, Cursor, StreamDataResponse, Invalidate, Finalize, Heartbeat, SystemMessage, DataFinality, StreamConfig, Client } from '@apibara/protocol';
2
+ import { NestedHooks, Hookable } from 'hookable';
3
+
4
+ interface IndexerContext extends Record<string, any> {
5
+ }
6
+ declare function useIndexerContext(): IndexerContext;
7
+
8
+ type NextFunction = () => Promise<void>;
9
+ type MiddlewareFunction<C> = (context: C, next: NextFunction) => Promise<void>;
10
+
11
+ type IndexerPlugin<TFilter, TBlock> = (indexer: Indexer<TFilter, TBlock>) => void;
12
+ declare function defineIndexerPlugin<TFilter, TBlock>(def: IndexerPlugin<TFilter, TBlock>): IndexerPlugin<TFilter, TBlock>;
13
+
14
+ type UseMiddlewareFunction = (fn: MiddlewareFunction<IndexerContext>) => void;
15
+ interface IndexerHooks<TFilter, TBlock> {
16
+ "run:before": () => void;
17
+ "run:after": () => void;
18
+ "connect:before": ({ request, options, }: {
19
+ request: StreamDataRequest<TFilter>;
20
+ options: StreamDataOptions;
21
+ }) => void;
22
+ "connect:after": ({ request, }: {
23
+ request: StreamDataRequest<TFilter>;
24
+ }) => void;
25
+ "connect:factory": ({ request, endCursor, }: {
26
+ request: StreamDataRequest<TFilter>;
27
+ endCursor?: Cursor;
28
+ }) => void;
29
+ "handler:middleware": ({ use }: {
30
+ use: UseMiddlewareFunction;
31
+ }) => void;
32
+ message: ({ message }: {
33
+ message: StreamDataResponse<TBlock>;
34
+ }) => void;
35
+ "message:invalidate": ({ message }: {
36
+ message: Invalidate;
37
+ }) => void;
38
+ "message:finalize": ({ message }: {
39
+ message: Finalize;
40
+ }) => void;
41
+ "message:heartbeat": ({ message }: {
42
+ message: Heartbeat;
43
+ }) => void;
44
+ "message:systemMessage": ({ message }: {
45
+ message: SystemMessage;
46
+ }) => void;
47
+ }
48
+ type IndexerStartingCursor = {
49
+ startingCursor?: never;
50
+ startingBlock: bigint;
51
+ } | {
52
+ startingCursor: Cursor;
53
+ startingBlock?: never;
54
+ } | {
55
+ startingCursor?: never;
56
+ startingBlock?: never;
57
+ };
58
+ type IndexerConfig<TFilter, TBlock> = {
59
+ streamUrl: string;
60
+ filter: TFilter;
61
+ finality?: DataFinality;
62
+ factory?: ({ block, context, }: {
63
+ block: TBlock;
64
+ context: IndexerContext;
65
+ }) => Promise<{
66
+ filter?: TFilter;
67
+ }>;
68
+ transform: (args: {
69
+ block: TBlock;
70
+ cursor?: Cursor | undefined;
71
+ endCursor?: Cursor | undefined;
72
+ finality: DataFinality;
73
+ context: IndexerContext;
74
+ }) => Promise<void>;
75
+ hooks?: NestedHooks<IndexerHooks<TFilter, TBlock>>;
76
+ plugins?: ReadonlyArray<IndexerPlugin<TFilter, TBlock>>;
77
+ debug?: boolean;
78
+ } & IndexerStartingCursor;
79
+ type IndexerWithStreamConfig<TFilter, TBlock> = IndexerConfig<TFilter, TBlock> & {
80
+ streamConfig: StreamConfig<TFilter, TBlock>;
81
+ };
82
+ declare function defineIndexer<TFilter, TBlock>(streamConfig: StreamConfig<TFilter, TBlock>): (config: IndexerConfig<TFilter, TBlock>) => IndexerWithStreamConfig<TFilter, TBlock>;
83
+ interface Indexer<TFilter, TBlock> {
84
+ streamConfig: StreamConfig<TFilter, TBlock>;
85
+ options: IndexerConfig<TFilter, TBlock>;
86
+ hooks: Hookable<IndexerHooks<TFilter, TBlock>>;
87
+ }
88
+ declare function createIndexer<TFilter, TBlock>({ streamConfig, ...options }: IndexerWithStreamConfig<TFilter, TBlock>): Indexer<TFilter, TBlock>;
89
+ interface ReconnectOptions {
90
+ maxRetries?: number;
91
+ retryDelay?: number;
92
+ maxWait?: number;
93
+ }
94
+ declare function runWithReconnect<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, options?: ReconnectOptions): Promise<void>;
95
+ interface RunOptions {
96
+ onConnect?: () => void | Promise<void>;
97
+ }
98
+ declare function run<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, runOptions?: RunOptions): Promise<void>;
99
+
100
+ export { type IndexerWithStreamConfig as I, type ReconnectOptions as R, type UseMiddlewareFunction as U, type Indexer as a, type IndexerPlugin as b, type IndexerConfig as c, defineIndexerPlugin as d, type IndexerHooks as e, type IndexerStartingCursor as f, defineIndexer as g, createIndexer as h, type RunOptions as i, run as j, runWithReconnect as r, useIndexerContext as u };
@@ -0,0 +1,100 @@
1
+ import { StreamDataRequest, StreamDataOptions, Cursor, StreamDataResponse, Invalidate, Finalize, Heartbeat, SystemMessage, DataFinality, StreamConfig, Client } from '@apibara/protocol';
2
+ import { NestedHooks, Hookable } from 'hookable';
3
+
4
+ interface IndexerContext extends Record<string, any> {
5
+ }
6
+ declare function useIndexerContext(): IndexerContext;
7
+
8
+ type NextFunction = () => Promise<void>;
9
+ type MiddlewareFunction<C> = (context: C, next: NextFunction) => Promise<void>;
10
+
11
+ type IndexerPlugin<TFilter, TBlock> = (indexer: Indexer<TFilter, TBlock>) => void;
12
+ declare function defineIndexerPlugin<TFilter, TBlock>(def: IndexerPlugin<TFilter, TBlock>): IndexerPlugin<TFilter, TBlock>;
13
+
14
+ type UseMiddlewareFunction = (fn: MiddlewareFunction<IndexerContext>) => void;
15
+ interface IndexerHooks<TFilter, TBlock> {
16
+ "run:before": () => void;
17
+ "run:after": () => void;
18
+ "connect:before": ({ request, options, }: {
19
+ request: StreamDataRequest<TFilter>;
20
+ options: StreamDataOptions;
21
+ }) => void;
22
+ "connect:after": ({ request, }: {
23
+ request: StreamDataRequest<TFilter>;
24
+ }) => void;
25
+ "connect:factory": ({ request, endCursor, }: {
26
+ request: StreamDataRequest<TFilter>;
27
+ endCursor?: Cursor;
28
+ }) => void;
29
+ "handler:middleware": ({ use }: {
30
+ use: UseMiddlewareFunction;
31
+ }) => void;
32
+ message: ({ message }: {
33
+ message: StreamDataResponse<TBlock>;
34
+ }) => void;
35
+ "message:invalidate": ({ message }: {
36
+ message: Invalidate;
37
+ }) => void;
38
+ "message:finalize": ({ message }: {
39
+ message: Finalize;
40
+ }) => void;
41
+ "message:heartbeat": ({ message }: {
42
+ message: Heartbeat;
43
+ }) => void;
44
+ "message:systemMessage": ({ message }: {
45
+ message: SystemMessage;
46
+ }) => void;
47
+ }
48
+ type IndexerStartingCursor = {
49
+ startingCursor?: never;
50
+ startingBlock: bigint;
51
+ } | {
52
+ startingCursor: Cursor;
53
+ startingBlock?: never;
54
+ } | {
55
+ startingCursor?: never;
56
+ startingBlock?: never;
57
+ };
58
+ type IndexerConfig<TFilter, TBlock> = {
59
+ streamUrl: string;
60
+ filter: TFilter;
61
+ finality?: DataFinality;
62
+ factory?: ({ block, context, }: {
63
+ block: TBlock;
64
+ context: IndexerContext;
65
+ }) => Promise<{
66
+ filter?: TFilter;
67
+ }>;
68
+ transform: (args: {
69
+ block: TBlock;
70
+ cursor?: Cursor | undefined;
71
+ endCursor?: Cursor | undefined;
72
+ finality: DataFinality;
73
+ context: IndexerContext;
74
+ }) => Promise<void>;
75
+ hooks?: NestedHooks<IndexerHooks<TFilter, TBlock>>;
76
+ plugins?: ReadonlyArray<IndexerPlugin<TFilter, TBlock>>;
77
+ debug?: boolean;
78
+ } & IndexerStartingCursor;
79
+ type IndexerWithStreamConfig<TFilter, TBlock> = IndexerConfig<TFilter, TBlock> & {
80
+ streamConfig: StreamConfig<TFilter, TBlock>;
81
+ };
82
+ declare function defineIndexer<TFilter, TBlock>(streamConfig: StreamConfig<TFilter, TBlock>): (config: IndexerConfig<TFilter, TBlock>) => IndexerWithStreamConfig<TFilter, TBlock>;
83
+ interface Indexer<TFilter, TBlock> {
84
+ streamConfig: StreamConfig<TFilter, TBlock>;
85
+ options: IndexerConfig<TFilter, TBlock>;
86
+ hooks: Hookable<IndexerHooks<TFilter, TBlock>>;
87
+ }
88
+ declare function createIndexer<TFilter, TBlock>({ streamConfig, ...options }: IndexerWithStreamConfig<TFilter, TBlock>): Indexer<TFilter, TBlock>;
89
+ interface ReconnectOptions {
90
+ maxRetries?: number;
91
+ retryDelay?: number;
92
+ maxWait?: number;
93
+ }
94
+ declare function runWithReconnect<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, options?: ReconnectOptions): Promise<void>;
95
+ interface RunOptions {
96
+ onConnect?: () => void | Promise<void>;
97
+ }
98
+ declare function run<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, runOptions?: RunOptions): Promise<void>;
99
+
100
+ export { type IndexerWithStreamConfig as I, type ReconnectOptions as R, type UseMiddlewareFunction as U, type Indexer as a, type IndexerPlugin as b, type IndexerConfig as c, defineIndexerPlugin as d, type IndexerHooks as e, type IndexerStartingCursor as f, defineIndexer as g, createIndexer as h, type RunOptions as i, run as j, runWithReconnect as r, useIndexerContext as u };
@@ -0,0 +1,100 @@
1
+ import { StreamDataRequest, StreamDataOptions, Cursor, StreamDataResponse, Invalidate, Finalize, Heartbeat, SystemMessage, DataFinality, StreamConfig, Client } from '@apibara/protocol';
2
+ import { NestedHooks, Hookable } from 'hookable';
3
+
4
+ interface IndexerContext extends Record<string, any> {
5
+ }
6
+ declare function useIndexerContext(): IndexerContext;
7
+
8
+ type NextFunction = () => Promise<void>;
9
+ type MiddlewareFunction<C> = (context: C, next: NextFunction) => Promise<void>;
10
+
11
+ type IndexerPlugin<TFilter, TBlock> = (indexer: Indexer<TFilter, TBlock>) => void;
12
+ declare function defineIndexerPlugin<TFilter, TBlock>(def: IndexerPlugin<TFilter, TBlock>): IndexerPlugin<TFilter, TBlock>;
13
+
14
+ type UseMiddlewareFunction = (fn: MiddlewareFunction<IndexerContext>) => void;
15
+ interface IndexerHooks<TFilter, TBlock> {
16
+ "run:before": () => void;
17
+ "run:after": () => void;
18
+ "connect:before": ({ request, options, }: {
19
+ request: StreamDataRequest<TFilter>;
20
+ options: StreamDataOptions;
21
+ }) => void;
22
+ "connect:after": ({ request, }: {
23
+ request: StreamDataRequest<TFilter>;
24
+ }) => void;
25
+ "connect:factory": ({ request, endCursor, }: {
26
+ request: StreamDataRequest<TFilter>;
27
+ endCursor?: Cursor;
28
+ }) => void;
29
+ "handler:middleware": ({ use }: {
30
+ use: UseMiddlewareFunction;
31
+ }) => void;
32
+ message: ({ message }: {
33
+ message: StreamDataResponse<TBlock>;
34
+ }) => void;
35
+ "message:invalidate": ({ message }: {
36
+ message: Invalidate;
37
+ }) => void;
38
+ "message:finalize": ({ message }: {
39
+ message: Finalize;
40
+ }) => void;
41
+ "message:heartbeat": ({ message }: {
42
+ message: Heartbeat;
43
+ }) => void;
44
+ "message:systemMessage": ({ message }: {
45
+ message: SystemMessage;
46
+ }) => void;
47
+ }
48
+ type IndexerStartingCursor = {
49
+ startingCursor?: never;
50
+ startingBlock: bigint;
51
+ } | {
52
+ startingCursor: Cursor;
53
+ startingBlock?: never;
54
+ } | {
55
+ startingCursor?: never;
56
+ startingBlock?: never;
57
+ };
58
+ type IndexerConfig<TFilter, TBlock> = {
59
+ streamUrl: string;
60
+ filter: TFilter;
61
+ finality?: DataFinality;
62
+ factory?: ({ block, context, }: {
63
+ block: TBlock;
64
+ context: IndexerContext;
65
+ }) => Promise<{
66
+ filter?: TFilter;
67
+ }>;
68
+ transform: (args: {
69
+ block: TBlock;
70
+ cursor?: Cursor | undefined;
71
+ endCursor?: Cursor | undefined;
72
+ finality: DataFinality;
73
+ context: IndexerContext;
74
+ }) => Promise<void>;
75
+ hooks?: NestedHooks<IndexerHooks<TFilter, TBlock>>;
76
+ plugins?: ReadonlyArray<IndexerPlugin<TFilter, TBlock>>;
77
+ debug?: boolean;
78
+ } & IndexerStartingCursor;
79
+ type IndexerWithStreamConfig<TFilter, TBlock> = IndexerConfig<TFilter, TBlock> & {
80
+ streamConfig: StreamConfig<TFilter, TBlock>;
81
+ };
82
+ declare function defineIndexer<TFilter, TBlock>(streamConfig: StreamConfig<TFilter, TBlock>): (config: IndexerConfig<TFilter, TBlock>) => IndexerWithStreamConfig<TFilter, TBlock>;
83
+ interface Indexer<TFilter, TBlock> {
84
+ streamConfig: StreamConfig<TFilter, TBlock>;
85
+ options: IndexerConfig<TFilter, TBlock>;
86
+ hooks: Hookable<IndexerHooks<TFilter, TBlock>>;
87
+ }
88
+ declare function createIndexer<TFilter, TBlock>({ streamConfig, ...options }: IndexerWithStreamConfig<TFilter, TBlock>): Indexer<TFilter, TBlock>;
89
+ interface ReconnectOptions {
90
+ maxRetries?: number;
91
+ retryDelay?: number;
92
+ maxWait?: number;
93
+ }
94
+ declare function runWithReconnect<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, options?: ReconnectOptions): Promise<void>;
95
+ interface RunOptions {
96
+ onConnect?: () => void | Promise<void>;
97
+ }
98
+ declare function run<TFilter, TBlock>(client: Client<TFilter, TBlock>, indexer: Indexer<TFilter, TBlock>, runOptions?: RunOptions): Promise<void>;
99
+
100
+ export { type IndexerWithStreamConfig as I, type ReconnectOptions as R, type UseMiddlewareFunction as U, type Indexer as a, type IndexerPlugin as b, type IndexerConfig as c, defineIndexerPlugin as d, type IndexerHooks as e, type IndexerStartingCursor as f, defineIndexer as g, createIndexer as h, type RunOptions as i, run as j, runWithReconnect as r, useIndexerContext as u };
@@ -0,0 +1,26 @@
1
+ import { consola } from 'consola';
2
+ import { u as useIndexerContext } from './indexer.a55ad619.mjs';
3
+ import { d as defineIndexerPlugin } from './indexer.9b21ddd2.mjs';
4
+
5
+ function logger({
6
+ logger: logger2
7
+ } = {}) {
8
+ return defineIndexerPlugin((indexer) => {
9
+ indexer.hooks.hook("run:before", () => {
10
+ const ctx = useIndexerContext();
11
+ if (logger2) {
12
+ ctx.logger = consola.create({ reporters: [logger2] });
13
+ } else {
14
+ ctx.logger = consola.create({});
15
+ }
16
+ });
17
+ });
18
+ }
19
+ function useLogger() {
20
+ const ctx = useIndexerContext();
21
+ if (!ctx?.logger)
22
+ throw new Error("Logger plugin is not available in context");
23
+ return ctx.logger;
24
+ }
25
+
26
+ export { logger as l, useLogger as u };
@@ -1,64 +1,66 @@
1
1
  'use strict';
2
2
 
3
- const vitest = require('vitest');
4
- const helper = require('../shared/indexer.318d3617.cjs');
5
- const vcr_index = require('../shared/indexer.541d43eb.cjs');
3
+ const protocol = require('@apibara/protocol');
4
+ const ci = require('ci-info');
5
+ const index = require('../index.cjs');
6
+ const internal_plugins = require('../internal/plugins.cjs');
7
+ const logger = require('../shared/indexer.2416906c.cjs');
8
+ const vcr_index = require('../vcr/index.cjs');
9
+ require('consola');
10
+ require('hookable');
11
+ require('node:assert');
12
+ require('../shared/indexer.077335f3.cjs');
6
13
  require('node:async_hooks');
7
14
  require('unctx');
8
15
  require('@opentelemetry/api');
9
- require('node:fs');
10
- require('node:path');
16
+ require('../shared/indexer.601ceab0.cjs');
11
17
  require('node:fs/promises');
12
- require('klona/full');
13
- require('consola');
14
- require('hookable');
15
- require('node:assert');
16
- require('../shared/indexer.a8b7ab1f.cjs');
18
+ require('node:path');
19
+ require('node:fs');
17
20
  require('@apibara/protocol/testing');
18
21
 
19
- const test = vitest.test.extend({
20
- vcr: {
21
- withClient
22
- }
23
- });
24
- async function withClient(cassetteName, range, callback) {
25
- const vcrConfig = {
26
- cassetteDir: "cassettes"
27
- };
28
- const cassetteOptions = {
29
- name: cassetteName,
30
- startingCursor: {
31
- orderKey: range.fromBlock
32
- },
33
- endingCursor: {
34
- orderKey: range.toBlock
35
- }
36
- };
37
- const context = {
38
- async run(indexer) {
39
- const client = vcr_index.loadCassette(vcrConfig, cassetteName);
40
- if (!helper.isCassetteAvailable(vcrConfig, cassetteName)) {
22
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
23
+
24
+ const ci__default = /*#__PURE__*/_interopDefaultCompat(ci);
25
+
26
+ function createVcr() {
27
+ return {
28
+ async run(cassetteName, indexerConfig, range) {
29
+ const vcrConfig = {
30
+ cassetteDir: "cassettes"
31
+ };
32
+ const cassetteOptions = {
33
+ name: cassetteName,
34
+ startingCursor: {
35
+ orderKey: range.fromBlock
36
+ },
37
+ endingCursor: {
38
+ orderKey: range.toBlock
39
+ }
40
+ };
41
+ indexerConfig.plugins = [
42
+ internal_plugins.internalContext({
43
+ indexerName: cassetteName,
44
+ availableIndexers: [cassetteName]
45
+ }),
46
+ logger.logger(),
47
+ ...indexerConfig.plugins ?? []
48
+ ];
49
+ const indexer = index.createIndexer(indexerConfig);
50
+ if (!vcr_index.isCassetteAvailable(vcrConfig, cassetteName)) {
51
+ if (ci__default.isCI) {
52
+ throw new Error("Cannot record cassette in CI");
53
+ }
54
+ const client = protocol.createClient(
55
+ indexer.streamConfig,
56
+ indexer.options.streamUrl
57
+ );
41
58
  await vcr_index.record(vcrConfig, client, indexer, cassetteOptions);
59
+ } else {
60
+ await vcr_index.replay(vcrConfig, indexer, cassetteName);
42
61
  }
43
- return await vcr_index.replay(vcrConfig, indexer, cassetteName);
44
62
  }
45
63
  };
46
- await callback(context);
47
- }
48
-
49
- function generateMockMessages(count = 10) {
50
- return [...Array(count)].map((_, i) => ({
51
- _tag: "data",
52
- data: {
53
- cursor: { orderKey: BigInt(5e6 - 1) },
54
- finality: "accepted",
55
- data: [{ data: `${5e6 + i}` }],
56
- endCursor: { orderKey: BigInt(5e6 + i) }
57
- }
58
- }));
59
64
  }
60
65
 
61
- exports.VcrSink = vcr_index.VcrSink;
62
- exports.vcr = vcr_index.vcr;
63
- exports.generateMockMessages = generateMockMessages;
64
- exports.test = test;
66
+ exports.createVcr = createVcr;
@@ -1,40 +1,12 @@
1
- import * as vitest from 'vitest';
2
- import { f as Indexer } from '../shared/indexer.c7ed6b83.cjs';
3
- import { a as VcrReplayResult } from '../shared/indexer.500fd281.cjs';
4
- import { Cursor } from '@apibara/protocol';
5
- import { S as Sink, b as SinkData, a as SinkCursorParams } from '../shared/indexer.b9c8f0d8.cjs';
6
- import { MockStreamResponse } from '@apibara/protocol/testing';
1
+ import { I as IndexerWithStreamConfig } from '../shared/indexer.fedcd831.cjs';
2
+ import '@apibara/protocol';
7
3
  import 'hookable';
8
4
 
9
- declare const test: vitest.TestAPI<{
10
- vcr: {
11
- withClient: typeof withClient;
12
- };
13
- }>;
14
- type WithClientContext<TFilter, TBlock, TTxnParams> = {
15
- run: (indexerArgs: Indexer<TFilter, TBlock, TTxnParams>) => Promise<VcrReplayResult>;
5
+ declare function createVcr(): {
6
+ run<TFilter, TBlock>(cassetteName: string, indexerConfig: IndexerWithStreamConfig<TFilter, TBlock>, range: {
7
+ fromBlock: bigint;
8
+ toBlock: bigint;
9
+ }): Promise<void>;
16
10
  };
17
- declare function withClient<TFilter, TBlock, TTxnParams>(cassetteName: string, range: {
18
- fromBlock: bigint;
19
- toBlock: bigint;
20
- }, callback: (context: WithClientContext<TFilter, TBlock, TTxnParams>) => Promise<void>): Promise<void>;
21
11
 
22
- type TxnParams = {
23
- writer: {
24
- insert: (data: SinkData[]) => void;
25
- };
26
- };
27
- declare class VcrSink extends Sink {
28
- result: VcrReplayResult["outputs"];
29
- write({ data, endCursor }: {
30
- data: SinkData[];
31
- endCursor?: Cursor;
32
- }): void;
33
- transaction({ cursor, endCursor, finality }: SinkCursorParams, cb: (params: TxnParams) => Promise<void>): Promise<void>;
34
- invalidate(cursor?: Cursor): Promise<void>;
35
- }
36
- declare function vcr(): VcrSink;
37
-
38
- declare function generateMockMessages(count?: number): MockStreamResponse[];
39
-
40
- export { VcrSink, generateMockMessages, test, vcr };
12
+ export { createVcr };
@@ -1,40 +1,12 @@
1
- import * as vitest from 'vitest';
2
- import { f as Indexer } from '../shared/indexer.e8bd138d.mjs';
3
- import { a as VcrReplayResult } from '../shared/indexer.e1856641.mjs';
4
- import { Cursor } from '@apibara/protocol';
5
- import { S as Sink, b as SinkData, a as SinkCursorParams } from '../shared/indexer.b9c8f0d8.mjs';
6
- import { MockStreamResponse } from '@apibara/protocol/testing';
1
+ import { I as IndexerWithStreamConfig } from '../shared/indexer.fedcd831.mjs';
2
+ import '@apibara/protocol';
7
3
  import 'hookable';
8
4
 
9
- declare const test: vitest.TestAPI<{
10
- vcr: {
11
- withClient: typeof withClient;
12
- };
13
- }>;
14
- type WithClientContext<TFilter, TBlock, TTxnParams> = {
15
- run: (indexerArgs: Indexer<TFilter, TBlock, TTxnParams>) => Promise<VcrReplayResult>;
5
+ declare function createVcr(): {
6
+ run<TFilter, TBlock>(cassetteName: string, indexerConfig: IndexerWithStreamConfig<TFilter, TBlock>, range: {
7
+ fromBlock: bigint;
8
+ toBlock: bigint;
9
+ }): Promise<void>;
16
10
  };
17
- declare function withClient<TFilter, TBlock, TTxnParams>(cassetteName: string, range: {
18
- fromBlock: bigint;
19
- toBlock: bigint;
20
- }, callback: (context: WithClientContext<TFilter, TBlock, TTxnParams>) => Promise<void>): Promise<void>;
21
11
 
22
- type TxnParams = {
23
- writer: {
24
- insert: (data: SinkData[]) => void;
25
- };
26
- };
27
- declare class VcrSink extends Sink {
28
- result: VcrReplayResult["outputs"];
29
- write({ data, endCursor }: {
30
- data: SinkData[];
31
- endCursor?: Cursor;
32
- }): void;
33
- transaction({ cursor, endCursor, finality }: SinkCursorParams, cb: (params: TxnParams) => Promise<void>): Promise<void>;
34
- invalidate(cursor?: Cursor): Promise<void>;
35
- }
36
- declare function vcr(): VcrSink;
37
-
38
- declare function generateMockMessages(count?: number): MockStreamResponse[];
39
-
40
- export { VcrSink, generateMockMessages, test, vcr };
12
+ export { createVcr };
@@ -1,40 +1,12 @@
1
- import * as vitest from 'vitest';
2
- import { f as Indexer } from '../shared/indexer.f761abcd.js';
3
- import { a as VcrReplayResult } from '../shared/indexer.e4f2430f.js';
4
- import { Cursor } from '@apibara/protocol';
5
- import { S as Sink, b as SinkData, a as SinkCursorParams } from '../shared/indexer.b9c8f0d8.js';
6
- import { MockStreamResponse } from '@apibara/protocol/testing';
1
+ import { I as IndexerWithStreamConfig } from '../shared/indexer.fedcd831.js';
2
+ import '@apibara/protocol';
7
3
  import 'hookable';
8
4
 
9
- declare const test: vitest.TestAPI<{
10
- vcr: {
11
- withClient: typeof withClient;
12
- };
13
- }>;
14
- type WithClientContext<TFilter, TBlock, TTxnParams> = {
15
- run: (indexerArgs: Indexer<TFilter, TBlock, TTxnParams>) => Promise<VcrReplayResult>;
5
+ declare function createVcr(): {
6
+ run<TFilter, TBlock>(cassetteName: string, indexerConfig: IndexerWithStreamConfig<TFilter, TBlock>, range: {
7
+ fromBlock: bigint;
8
+ toBlock: bigint;
9
+ }): Promise<void>;
16
10
  };
17
- declare function withClient<TFilter, TBlock, TTxnParams>(cassetteName: string, range: {
18
- fromBlock: bigint;
19
- toBlock: bigint;
20
- }, callback: (context: WithClientContext<TFilter, TBlock, TTxnParams>) => Promise<void>): Promise<void>;
21
11
 
22
- type TxnParams = {
23
- writer: {
24
- insert: (data: SinkData[]) => void;
25
- };
26
- };
27
- declare class VcrSink extends Sink {
28
- result: VcrReplayResult["outputs"];
29
- write({ data, endCursor }: {
30
- data: SinkData[];
31
- endCursor?: Cursor;
32
- }): void;
33
- transaction({ cursor, endCursor, finality }: SinkCursorParams, cb: (params: TxnParams) => Promise<void>): Promise<void>;
34
- invalidate(cursor?: Cursor): Promise<void>;
35
- }
36
- declare function vcr(): VcrSink;
37
-
38
- declare function generateMockMessages(count?: number): MockStreamResponse[];
39
-
40
- export { VcrSink, generateMockMessages, test, vcr };
12
+ export { createVcr };