@apibara/indexer 0.4.1 → 2.0.0-beta.3

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 (112) hide show
  1. package/README.md +2 -9
  2. package/package.json +66 -45
  3. package/src/context.ts +19 -0
  4. package/src/hooks/index.ts +2 -0
  5. package/src/hooks/useKVStore.ts +12 -0
  6. package/src/hooks/useSink.ts +13 -0
  7. package/src/index.ts +7 -1
  8. package/src/indexer.test.ts +491 -0
  9. package/src/indexer.ts +322 -0
  10. package/src/otel.ts +3 -0
  11. package/src/plugins/config.ts +11 -0
  12. package/src/plugins/kv.test.ts +120 -0
  13. package/src/plugins/kv.ts +132 -0
  14. package/src/plugins/persistence.test.ts +151 -0
  15. package/src/plugins/persistence.ts +202 -0
  16. package/src/sink.ts +36 -0
  17. package/src/sinks/csv.test.ts +65 -0
  18. package/src/sinks/csv.ts +159 -0
  19. package/src/sinks/drizzle/Int8Range.ts +52 -0
  20. package/src/sinks/drizzle/delete.ts +42 -0
  21. package/src/sinks/drizzle/drizzle.test.ts +239 -0
  22. package/src/sinks/drizzle/drizzle.ts +115 -0
  23. package/src/sinks/drizzle/index.ts +6 -0
  24. package/src/sinks/drizzle/insert.ts +39 -0
  25. package/src/sinks/drizzle/select.ts +44 -0
  26. package/src/sinks/drizzle/transaction.ts +49 -0
  27. package/src/sinks/drizzle/update.ts +47 -0
  28. package/src/sinks/drizzle/utils.ts +36 -0
  29. package/src/sinks/sqlite.test.ts +99 -0
  30. package/src/sinks/sqlite.ts +170 -0
  31. package/src/testing/helper.ts +13 -0
  32. package/src/testing/index.ts +3 -0
  33. package/src/testing/indexer.ts +35 -0
  34. package/src/testing/setup.ts +59 -0
  35. package/src/testing/vcr.ts +54 -0
  36. package/src/vcr/config.ts +11 -0
  37. package/src/vcr/helper.ts +27 -0
  38. package/src/vcr/index.ts +4 -0
  39. package/src/vcr/record.ts +45 -0
  40. package/src/vcr/replay.ts +51 -0
  41. package/LICENSE.txt +0 -202
  42. package/dist/config.d.ts +0 -35
  43. package/dist/config.js +0 -2
  44. package/dist/config.js.map +0 -1
  45. package/dist/config.test-d.d.ts +0 -1
  46. package/dist/config.test-d.js +0 -38
  47. package/dist/config.test-d.js.map +0 -1
  48. package/dist/index.js +0 -2
  49. package/dist/index.js.map +0 -1
  50. package/dist/sink/console.d.ts +0 -10
  51. package/dist/sink/console.js +0 -2
  52. package/dist/sink/console.js.map +0 -1
  53. package/dist/sink/console.test-d.d.ts +0 -1
  54. package/dist/sink/console.test-d.js +0 -12
  55. package/dist/sink/console.test-d.js.map +0 -1
  56. package/dist/sink/mongo.d.ts +0 -14
  57. package/dist/sink/mongo.js +0 -2
  58. package/dist/sink/mongo.js.map +0 -1
  59. package/dist/sink/parquet.d.ts +0 -9
  60. package/dist/sink/parquet.js +0 -2
  61. package/dist/sink/parquet.js.map +0 -1
  62. package/dist/sink/postgres.d.ts +0 -10
  63. package/dist/sink/postgres.js +0 -2
  64. package/dist/sink/postgres.js.map +0 -1
  65. package/dist/sink/webhook.d.ts +0 -12
  66. package/dist/sink/webhook.js +0 -2
  67. package/dist/sink/webhook.js.map +0 -1
  68. package/dist/starknet/block.d.ts +0 -409
  69. package/dist/starknet/block.js +0 -2
  70. package/dist/starknet/block.js.map +0 -1
  71. package/dist/starknet/block.test-d.d.ts +0 -1
  72. package/dist/starknet/block.test-d.js +0 -95
  73. package/dist/starknet/block.test-d.js.map +0 -1
  74. package/dist/starknet/felt.d.ts +0 -11
  75. package/dist/starknet/felt.js +0 -25
  76. package/dist/starknet/felt.js.map +0 -1
  77. package/dist/starknet/felt.test.d.ts +0 -1
  78. package/dist/starknet/felt.test.js +0 -16
  79. package/dist/starknet/felt.test.js.map +0 -1
  80. package/dist/starknet/filter.d.ts +0 -175
  81. package/dist/starknet/filter.js +0 -2
  82. package/dist/starknet/filter.js.map +0 -1
  83. package/dist/starknet/filter.test-d.d.ts +0 -1
  84. package/dist/starknet/filter.test-d.js +0 -166
  85. package/dist/starknet/filter.test-d.js.map +0 -1
  86. package/dist/starknet/index.d.ts +0 -10
  87. package/dist/starknet/index.js +0 -5
  88. package/dist/starknet/index.js.map +0 -1
  89. package/dist/starknet/parser.d.ts +0 -16
  90. package/dist/starknet/parser.js +0 -49
  91. package/dist/starknet/parser.js.map +0 -1
  92. package/dist/starknet/parser.test.d.ts +0 -1
  93. package/dist/starknet/parser.test.js +0 -50
  94. package/dist/starknet/parser.test.js.map +0 -1
  95. package/src/config.test-d.ts +0 -55
  96. package/src/config.ts +0 -47
  97. package/src/sink/console.test-d.ts +0 -14
  98. package/src/sink/console.ts +0 -11
  99. package/src/sink/mongo.ts +0 -14
  100. package/src/sink/parquet.ts +0 -9
  101. package/src/sink/postgres.ts +0 -10
  102. package/src/sink/webhook.ts +0 -12
  103. package/src/starknet/block.test-d.ts +0 -112
  104. package/src/starknet/block.ts +0 -469
  105. package/src/starknet/felt.test.ts +0 -25
  106. package/src/starknet/felt.ts +0 -30
  107. package/src/starknet/filter.test-d.ts +0 -197
  108. package/src/starknet/filter.ts +0 -205
  109. package/src/starknet/index.ts +0 -12
  110. package/src/starknet/parser.test.ts +0 -67
  111. package/src/starknet/parser.ts +0 -69
  112. /package/{dist/index.d.ts → src/plugins/index.ts} +0 -0
@@ -1,50 +0,0 @@
1
- import { Contract } from "./parser";
2
- import { describe, expect, it } from "vitest";
3
- describe("Contract", () => {
4
- const mockContractAddress = "0x0";
5
- const mockContractAbi = [
6
- {
7
- type: "event",
8
- name: "MockEvent",
9
- kind: "struct",
10
- members: [{ name: "param1", type: "felt", kind: "key" }],
11
- },
12
- {
13
- type: "event",
14
- name: "AnotherEvent",
15
- kind: "struct",
16
- members: [{ name: "param1", type: "felt", kind: "key" }],
17
- },
18
- ];
19
- it("should create an EventFilter for a valid event name", () => {
20
- const contract = new Contract(mockContractAddress, mockContractAbi);
21
- const filter = contract.eventFilter("MockEvent");
22
- expect(filter).toBeDefined();
23
- expect(filter.fromAddress).toBe(mockContractAddress);
24
- expect(filter.includeReceipt).toBeFalsy();
25
- });
26
- it("overrides some arguments", () => {
27
- const contract = new Contract(mockContractAddress, mockContractAbi);
28
- const filter = contract.eventFilter("MockEvent", { includeReceipt: true });
29
- expect(filter).toBeDefined();
30
- expect(filter.includeReceipt).toBeTruthy();
31
- });
32
- it("can lookup an event name by its selector", () => {
33
- const contract = new Contract(mockContractAddress, mockContractAbi);
34
- const filter = contract.eventFilter("AnotherEvent");
35
- const eventName = contract.lookupEventFromSelector(filter.keys?.[0] ?? "0x00");
36
- expect(eventName).toEqual("AnotherEvent");
37
- });
38
- it("returns undefined if no event matches", () => {
39
- const contract = new Contract(mockContractAddress, mockContractAbi);
40
- const eventName = contract.lookupEventFromSelector("0x1234567890123456789012345678901234567890123456789012345678901234");
41
- expect(eventName).toBeUndefined();
42
- });
43
- it("should throw an error for an invalid event name", () => {
44
- const contract = new Contract(mockContractAddress, mockContractAbi);
45
- expect(() => {
46
- contract.eventFilter("InvalidEvent");
47
- }).toThrow("Event InvalidEvent not found in contract ABI");
48
- });
49
- });
50
- //# sourceMappingURL=parser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.test.js","sourceRoot":"","sources":["../../src/starknet/parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAI9C,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,MAAM,mBAAmB,GAAiB,KAAK,CAAC;IAEhD,MAAM,eAAe,GAAG;QACtB;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SACzD;QACD;YACE,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SACzD;KACF,CAAC;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3E,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,QAAQ,CAAC,uBAAuB,CAChD,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAC3B,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,QAAQ,CAAC,uBAAuB,CAChD,oEAAoE,CACrE,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAEpE,MAAM,CAAC,GAAG,EAAE;YACV,QAAQ,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,55 +0,0 @@
1
- import { assertType, describe, test } from "vitest";
2
-
3
- import type { Config } from "./config";
4
-
5
- describe("Config", () => {
6
- test("without any network or sink type", () => {
7
- assertType<Config>({
8
- network: "test-network",
9
- filter: {},
10
- sinkType: "test-sink",
11
- sinkOptions: {},
12
- });
13
- });
14
-
15
- test("with restrictions on network and sink", () => {
16
- type Network = {
17
- network: "test-network";
18
- filter: { a: number };
19
- };
20
-
21
- type Sink = {
22
- sinkType: "test-sink";
23
- sinkOptions: {
24
- b: string;
25
- };
26
- };
27
-
28
- assertType<Config<Network, Sink>>({
29
- network: "test-network",
30
- filter: {
31
- a: 1,
32
- },
33
- sinkType: "test-sink",
34
- sinkOptions: {
35
- b: "test",
36
- },
37
- });
38
- });
39
-
40
- test("network options are required", () => {
41
- // @ts-expect-error - missing network options
42
- assertType<Config>({
43
- sinkType: "test-sink",
44
- sinkOptions: {},
45
- });
46
- });
47
-
48
- test("sink options are required", () => {
49
- // @ts-expect-error - missing sink options
50
- assertType<Config>({
51
- network: "test-network",
52
- filter: {},
53
- });
54
- });
55
- });
package/src/config.ts DELETED
@@ -1,47 +0,0 @@
1
- /** Sink-related options. */
2
- export type SinkOptions = {
3
- /** Sink type. */
4
- sinkType: string;
5
- /** Sink options. */
6
- sinkOptions: object;
7
- };
8
-
9
- /** Network-specific options. */
10
- export type NetworkOptions = {
11
- /** Network name. */
12
- network: string;
13
- /** Data filter. */
14
- filter: object;
15
- };
16
-
17
- /** Data finality. */
18
- export type Finality =
19
- | "DATA_STATUS_FINALIZED"
20
- | "DATA_STATUS_ACCEPTED"
21
- | "DATA_STATUS_PENDING";
22
-
23
- /** Stream-related options. */
24
- export type StreamOptions = {
25
- /** The Apibara DNA stream url, e.g. `mainnet.starknet.a5a.ch`. */
26
- streamUrl?: string;
27
- /** Maximum message size, e.g. `50Mb` */
28
- maxMessageSize?: string;
29
- /** Additional metadata to send when connecting to the stream, in `key: value` form. */
30
- metadata?: string[];
31
- /** The Apibara DNA stream auth token. */
32
- authToken?: string;
33
- };
34
-
35
- export type Config<
36
- TNetworkOptions extends NetworkOptions = NetworkOptions,
37
- TSink extends SinkOptions = SinkOptions,
38
- > = TSink &
39
- TNetworkOptions &
40
- StreamOptions & {
41
- /** How many historical blocks to process in a single batch. */
42
- batchSize?: number;
43
- /** Finality of the data to process. */
44
- finality?: Finality;
45
- /** Start streaming data from this block. */
46
- startingBlock?: number;
47
- };
@@ -1,14 +0,0 @@
1
- import { assertType, describe, test } from "vitest";
2
-
3
- import type { Console } from "./console";
4
-
5
- describe("Console", () => {
6
- test("accepts any option", () => {
7
- assertType<Console>({
8
- sinkType: "console",
9
- sinkOptions: {
10
- hello: "world",
11
- },
12
- });
13
- });
14
- });
@@ -1,11 +0,0 @@
1
- /** Console sink type. */
2
- export type Console = {
3
- sinkType: "console";
4
-
5
- /** Accept any options.
6
- *
7
- * @remarks We do this so that users can quickly switch to the console sink to debug,
8
- * without having to remove the options from the config file.
9
- */
10
- sinkOptions: object;
11
- };
package/src/sink/mongo.ts DELETED
@@ -1,14 +0,0 @@
1
- /** MongoDB sink options */
2
- export type Mongo = {
3
- sinkType: "mongo";
4
- sinkOptions: {
5
- /** MongoDB connection string. */
6
- connectionString?: string;
7
- /** Target database name. */
8
- database?: string;
9
- /** Target collection name. */
10
- collectionName?: string;
11
- /** Enable entity mode. */
12
- entityMode?: boolean;
13
- };
14
- };
@@ -1,9 +0,0 @@
1
- export type Parquet = {
2
- sinkType: "parquet";
3
- sinkOptions: {
4
- /** Target output directory. */
5
- outputDir?: string;
6
- /** How many blocks to include in each file. */
7
- batchSize?: number;
8
- };
9
- };
@@ -1,10 +0,0 @@
1
- /** PostgreSQL sink options. */
2
- export type Postgres = {
3
- sinkType: "postgres";
4
- sinkOptions: {
5
- /** Postgres connection string. */
6
- connectionString?: string;
7
- /** Target table name. */
8
- tableName?: string;
9
- };
10
- };
@@ -1,12 +0,0 @@
1
- /** Webhook sink options */
2
- export type Webhook = {
3
- sinkType: "webhook";
4
- sinkOptions: {
5
- /** Target URL. */
6
- targetUrl?: string;
7
- /** Additional headers to send with the request, `key: value` format. */
8
- header?: string[];
9
- /** Send the data returned from the transform function as the request body. */
10
- raw?: boolean;
11
- };
12
- };
@@ -1,112 +0,0 @@
1
- import { assertType, describe, test } from "vitest";
2
-
3
- import type { Block, BlockHeader, Transaction, TransactionMeta } from "./block";
4
- import { FieldElement } from "./felt";
5
-
6
- const address =
7
- "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7";
8
- const entryPointSelector =
9
- "0x03943907ef0ef6f9d2e2408b05e520a66daaf74293dbf665e5a20b117676170e";
10
- const calldata = [FieldElement.parse("0x01"), FieldElement.parse("0x02")];
11
- const meta: TransactionMeta = {
12
- hash: FieldElement.parse("0x01"),
13
- maxFee: FieldElement.parse("0x02"),
14
- signature: [FieldElement.parse("0x03")],
15
- nonce: FieldElement.parse("0x04"),
16
- version: "0",
17
- };
18
-
19
- const invokeV0 = {
20
- contractAddress: FieldElement.parse(address),
21
- entryPointSelector: FieldElement.parse(entryPointSelector),
22
- calldata,
23
- };
24
-
25
- const invokeV1 = {
26
- senderAddress: FieldElement.parse(address),
27
- calldata,
28
- };
29
-
30
- const deploy = {
31
- constructorCalldata: calldata,
32
- contractAddressSalt: FieldElement.parse("0x01"),
33
- classHash: FieldElement.parse("0x02"),
34
- };
35
-
36
- const declare = {
37
- classHash: FieldElement.parse("0x01"),
38
- senderAddress: FieldElement.parse(address),
39
- compiledClassHash: FieldElement.parse("0x02"),
40
- };
41
-
42
- describe("Block", () => {
43
- test("all optional", () => {
44
- assertType<Block>({});
45
- });
46
- });
47
-
48
- describe("BlockHeader", () => {
49
- test("all fields", () => {
50
- assertType<BlockHeader>({
51
- blockHash: FieldElement.parse("0x01"),
52
- parentBlockHash: FieldElement.parse("0x00"),
53
- blockNumber: "1",
54
- sequencerAddress: FieldElement.parse(address),
55
- newRoot: FieldElement.parse("0x02"),
56
- timestamp: "1",
57
- });
58
- });
59
- });
60
-
61
- describe("Transaction", () => {
62
- test("only one type", () => {
63
- // @ts-expect-error - should be one of the types
64
- assertType<Transaction>({
65
- meta,
66
- invokeV0,
67
- invokeV1,
68
- });
69
- });
70
-
71
- test("invokeV0", () => {
72
- assertType<Transaction>({
73
- meta,
74
- invokeV0,
75
- });
76
- });
77
-
78
- test("invokeV1", () => {
79
- assertType<Transaction>({
80
- meta,
81
- invokeV1,
82
- });
83
- });
84
-
85
- test("deploy", () => {
86
- assertType<Transaction>({
87
- meta,
88
- deploy,
89
- });
90
- });
91
-
92
- test("declare", () => {
93
- assertType<Transaction>({
94
- meta,
95
- declare,
96
- });
97
- });
98
-
99
- test("l1Handler", () => {
100
- assertType<Transaction>({
101
- meta,
102
- l1Handler: invokeV0,
103
- });
104
- });
105
-
106
- test("deployAccount", () => {
107
- assertType<Transaction>({
108
- meta,
109
- deployAccount: deploy,
110
- });
111
- });
112
- });