Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update auth api key & export to web/node #11

Merged
merged 1 commit into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
!.vscode
!.node-version
!.env.tpl
*.csv
*.cursor

*-linux-x64
*-macos-arm64
Expand Down
19 changes: 11 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
[![License](https://img.shields.io/github/license/substreams-js/substreams-node)](LICENSE)
[![Try substreams on RunKit](https://badge.runkitcdn.com/@substreams/node.svg)](https://npm.runkit.com/@substreams/node)

> Substreams for `Node.js`
> Substreams for `Node.js` & Web

## Install

Expand All @@ -20,21 +20,24 @@ npm install @substreams/node
```typescript
import { createModuleHashHex, createRegistry, createRequest } from "@substreams/core";
import { readPackage } from "@substreams/manifest";
import { BlockEmitter, createNodeTransport } from "@substreams/node";
import { BlockEmitter } from "@substreams/node";
import { createNodeTransport } from "@substreams/node/createNodeTransport";
// or
import { createWebTransport } from "@substreams/node/createWebTransport";

// auth API token
// https://app.streamingfast.io/
// https://app.pinax.network/
if (!process.env.SUBSTREAMS_API_TOKEN) {
throw new Error("SUBSTREAMS_API_TOKEN is require");
if (!process.env.SUBSTREAMS_API_KEY) {
throw new Error("SUBSTREAMS_API_KEY is require");
}

const token = process.env.SUBSTREAMS_API_TOKEN;
const token = process.env.SUBSTREAMS_API_KEY;
const baseUrl = "https://eth.substreams.pinax.network:443";

// User parameters
const manifest = "https://github.com/pinax-network/subtivity-substreams/releases/download/v0.2.3/subtivity-ethereum-v0.2.3.spkg";
const outputModule = "map_block_stats";
const manifest = "https://github.com/pinax-network/substreams-erc20-balance-changes/releases/download/v1.2.0/erc20-balance-changes-mainnet-v1.2.0.spkg";
const outputModule = "map_balance_changes";
const startBlockNum = 17381140;
const stopBlockNum = "+3";

Expand All @@ -47,7 +50,7 @@ const moduleHash = await createModuleHashHex(substreamPackage.modules, outputMod
console.log({ moduleHash });

// Connect Transport
const headers = new Headers({ "User-Agent": "@substreams/node" });
const headers = new Headers({ "X-User-Agent": "@substreams/node", "X-Api-Key": SUBSTREAMS_API_KEY });
const registry = createRegistry(substreamPackage);
const transport = createNodeTransport(baseUrl, token, registry, headers);
const request = createRequest({
Expand Down
12 changes: 6 additions & 6 deletions examples/eos-eosio.token-to-CSV.mjs
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import fs from "fs";
import { createModuleHashHex, createRegistry, createRequest } from "@substreams/core";
import { readPackage } from "@substreams/manifest";
import { BlockEmitter, createNodeTransport } from "@substreams/node";
import { BlockEmitter } from "@substreams/node";
import { createNodeTransport } from "@substreams/node/createNodeTransport";
import LogUpdate from "log-update";

// auth API token
// https://app.streamingfast.io/
// https://app.pinax.network/
if (!process.env.SUBSTREAMS_API_TOKEN) {
throw new Error("SUBSTREAMS_API_TOKEN is require");
if (!process.env.SUBSTREAMS_API_KEY) {
throw new Error("SUBSTREAMS_API_KEY is require");
}
const token = process.env.SUBSTREAMS_API_TOKEN;
const token = process.env.SUBSTREAMS_API_KEY;

// User parameters
const baseUrl = "https://eos.substreams.pinax.network:443";
Expand All @@ -30,9 +31,8 @@ const filename = `${moduleHash}-${startBlockNum}`
const startCursor = fs.existsSync(`${filename}.cursor`) ? fs.readFileSync(`${filename}.cursor`, "utf8") : undefined;

// Connect Transport
const headers = new Headers({ "User-Agent": "@substreams/node" });
const registry = createRegistry(substreamPackage);
const transport = createNodeTransport(baseUrl, token, registry, headers);
const transport = createNodeTransport(baseUrl, token, registry);
const request = createRequest({
substreamPackage,
outputModule,
Expand Down
12 changes: 6 additions & 6 deletions examples/eosevm-erc20-transfers.mjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { createRegistry, createRequest } from "@substreams/core";
import { readPackage } from "@substreams/manifest";
import { BlockEmitter, createNodeTransport } from "@substreams/node";
import { BlockEmitter } from "@substreams/node";
import { createNodeTransport } from "@substreams/node/createNodeTransport";

// auth API token
// https://app.streamingfast.io/
// https://app.pinax.network/
if (!process.env.SUBSTREAMS_API_TOKEN) {
throw new Error("SUBSTREAMS_API_TOKEN is require");
if (!process.env.SUBSTREAMS_API_KEY) {
throw new Error("SUBSTREAMS_API_KEY is require");
}
const token = process.env.SUBSTREAMS_API_TOKEN;
const token = process.env.SUBSTREAMS_API_KEY;

// User parameters
const baseUrl = "https://eosevm.substreams.pinax.network:443";
Expand All @@ -23,9 +24,8 @@ if (!substreamPackage.modules) {
}

// Connect Transport
const headers = new Headers({ "User-Agent": "@substreams/node" });
const registry = createRegistry(substreamPackage);
const transport = createNodeTransport(baseUrl, token, registry, headers);
const transport = createNodeTransport(baseUrl, token, registry);
const request = createRequest({
substreamPackage,
outputModule,
Expand Down
16 changes: 7 additions & 9 deletions examples/ethereum-block_stats.mjs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import { createModuleHashHex, createRegistry, createRequest } from "@substreams/core";
import { createRegistry, createRequest } from "@substreams/core";
import { readPackage } from "@substreams/manifest";
import { BlockEmitter, createNodeTransport } from "@substreams/node";
import { BlockEmitter } from "@substreams/node";
import { createNodeTransport } from "@substreams/node/createNodeTransport";

// auth API token
// https://app.streamingfast.io/
// https://app.pinax.network/
if (!process.env.SUBSTREAMS_API_TOKEN) {
throw new Error("SUBSTREAMS_API_TOKEN is require");
if (!process.env.SUBSTREAMS_API_KEY) {
throw new Error("SUBSTREAMS_API_KEY is require");
}

const token = process.env.SUBSTREAMS_API_TOKEN;
const token = process.env.SUBSTREAMS_API_KEY;
const baseUrl = "https://eth.substreams.pinax.network:443";

// User parameters
Expand All @@ -23,13 +24,10 @@ const substreamPackage = await readPackage(manifest);
if (!substreamPackage.modules) {
throw new Error("No modules found in substream package");
}
const moduleHash = await createModuleHashHex(substreamPackage.modules, outputModule);
console.log({ moduleHash });

// Connect Transport
const headers = new Headers({ "User-Agent": "@substreams/node" });
const registry = createRegistry(substreamPackage);
const transport = createNodeTransport(baseUrl, token, registry, headers);
const transport = createNodeTransport(baseUrl, token, registry);
const request = createRequest({
substreamPackage,
outputModule,
Expand Down
15 changes: 7 additions & 8 deletions examples/ethereum-erc20-balance-changes.mjs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import { createModuleHashHex, createRegistry, createRequest } from "@substreams/core";
import { createRegistry, createRequest } from "@substreams/core";
import { readPackage } from "@substreams/manifest";
import { BlockEmitter, createNodeTransport } from "@substreams/node";
import { BlockEmitter } from "@substreams/node";
import { createNodeTransport } from "@substreams/node/createNodeTransport";

// auth API token
// https://app.streamingfast.io/
// https://app.pinax.network/
if (!process.env.SUBSTREAMS_API_TOKEN) {
throw new Error("SUBSTREAMS_API_TOKEN is require");
if (!process.env.SUBSTREAMS_API_KEY) {
throw new Error("SUBSTREAMS_API_KEY is require");
}

const token = process.env.SUBSTREAMS_API_TOKEN;
const token = process.env.SUBSTREAMS_API_KEY;
const baseUrl = "https://eth.substreams.pinax.network:443";

// User parameters
Expand All @@ -22,11 +23,9 @@ const substreamPackage = await readPackage(manifest);
if (!substreamPackage.modules) {
throw new Error("No modules found in substream package");
}
const moduleHash = await createModuleHashHex(substreamPackage.modules, outputModule);
console.log({ moduleHash });

// Connect Transport
const headers = new Headers({ "User-Agent": "@substreams/node" });
const headers = new Headers({ "X-User-Agent": "@substreams/node", "X-Api-Key": SUBSTREAMS_API_KEY });
const registry = createRegistry(substreamPackage);
const transport = createNodeTransport(baseUrl, token, registry, headers);
const request = createRequest({
Expand Down
2 changes: 1 addition & 1 deletion examples/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"@substreams/core": "latest",
"@substreams/manifest": "latest",
"@substreams/node": "latest",
"@wharfkit/antelope": "^1.0.6",
"@wharfkit/antelope": "latest",
"log-update": "latest"
}
}
11 changes: 6 additions & 5 deletions examples/wax-delband.mjs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import { createRegistry, createRequest, applyParams } from "@substreams/core";
import { readPackage } from "@substreams/manifest";
import { BlockEmitter, createNodeTransport } from "@substreams/node";
import { APIClient, Bytes, Serializer } from "@wharfkit/antelope";
import { BlockEmitter } from "@substreams/node";
import { createNodeTransport } from "@substreams/node/createNodeTransport";
import { APIClient, Serializer } from "@wharfkit/antelope";

// auth API token
// https://app.streamingfast.io/
// https://app.pinax.network/
if (!process.env.SUBSTREAMS_API_TOKEN) {
throw new Error("SUBSTREAMS_API_TOKEN is require");
if (!process.env.SUBSTREAMS_API_KEY) {
throw new Error("SUBSTREAMS_API_KEY is require");
}
const token = process.env.SUBSTREAMS_API_TOKEN;
const token = process.env.SUBSTREAMS_API_KEY;

// RPC API Client
const rpc = new APIClient({ url: "https://wax.api.eosnation.io" });
Expand Down
5 changes: 1 addition & 4 deletions index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,2 @@
export { BlockEmitter } from "./src/BlockEmitter.js";
export { createDefaultTransport } from "./src/createDefaultTransport.js";
export { createNodeTransport } from "./src/createNodeTransport.js";
export { createWebTransport } from "./src/createWebTransport.js";
export { createHeadersInterceptor } from "./src/createHeadersInterceptor.js";
export { createHeadersInterceptor, createAuthInterceptor, createInterceptors, defaultHeadersInterceptor } from "./src/interceptors.js";
25 changes: 20 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
{
"name": "@substreams/node",
"version": "0.5.3",
"description": "Substreams for Node.js",
"version": "0.6.0",
"description": "Substreams for Node.js & Web",
"license": "MIT",
"repository": "substreams-js/substreams-node",
"type": "module",
"exports": "./dist/index.js",
"types": "./dist/index.d.ts",
"runkitExampleFilename": "example.js",
"exports": {
".": {
"default": "./dist/index.js",
"import": "./dist/index.js",
"types": "./dist/index.d.ts"
},
"./createNodeTransport": {
"default": "./dist/src/createNodeTransport.js",
"import": "./dist/src/createNodeTransport.js",
"types": "./dist/src/createNodeTransport.d.ts"
},
"./createWebTransport": {
"default": "./dist/src/createWebTransport.js",
"import": "./dist/src/createWebTransport.js",
"types": "./dist/src/createWebTransport.d.ts"
}
},
"sideEffects": false,
"engines": {
"node": ">=18"
Expand All @@ -16,7 +31,7 @@
"build": "tsc",
"prepublishOnly": "npm run build"
},
"files": ["dist", "src", "example.js"],
"files": ["dist", "src"],
"keywords": ["substreams", "streamingfast", "thegraph", "graph"],
"dependencies": {
"@bufbuild/protobuf": "latest",
Expand Down
1 change: 0 additions & 1 deletion src/BlockEmitter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// import { type Request, type Response, Stream } from "@substreams/core/proto";
import { AnyMessage, IMessageTypeRegistry, JsonObject, Message } from "@bufbuild/protobuf";
import { type CallOptions, type ConnectError, type Transport, createCallbackClient } from "@connectrpc/connect";
import { isEmptyMessage, unpackMapOutput } from "@substreams/core";
Expand Down
4 changes: 0 additions & 4 deletions src/createDefaultTransport.ts

This file was deleted.

11 changes: 0 additions & 11 deletions src/createHeadersInterceptor.ts

This file was deleted.

9 changes: 2 additions & 7 deletions src/createNodeTransport.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,13 @@
import { createHeadersInterceptor } from "./createHeadersInterceptor.js";
import type { IMessageTypeRegistry } from "@bufbuild/protobuf";
import { Transport } from "@connectrpc/connect";
import { createGrpcWebTransport } from "@connectrpc/connect-node";
import { createAuthInterceptor } from "@substreams/core";
import { createInterceptors } from "./interceptors.js";

export function createNodeTransport(baseUrl: string, token: string, registry: IMessageTypeRegistry, headers?: Headers): Transport {
const interceptors = [createHeadersInterceptor(headers)];
if (token) {
interceptors.push(createAuthInterceptor(token));
}
return createGrpcWebTransport({
baseUrl,
httpVersion: "2",
interceptors,
interceptors: createInterceptors(token, headers),
jsonOptions: {
typeRegistry: registry,
},
Expand Down
9 changes: 2 additions & 7 deletions src/createWebTransport.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import { createHeadersInterceptor } from "./createHeadersInterceptor.js";
import type { IMessageTypeRegistry } from "@bufbuild/protobuf";
import { Transport } from "@connectrpc/connect";
import { createGrpcWebTransport } from "@connectrpc/connect-web";
import { createAuthInterceptor } from "@substreams/core";
import { createInterceptors } from "./interceptors.js";

export function createWebTransport(baseUrl: string, token: string, registry: IMessageTypeRegistry, headers?: Headers): Transport {
const interceptors = [createHeadersInterceptor(headers)];
if (token) {
interceptors.push(createAuthInterceptor(token));
}
return createGrpcWebTransport({
baseUrl,
interceptors,
interceptors: createInterceptors(token, headers),
jsonOptions: {
typeRegistry: registry,
},
Expand Down
31 changes: 31 additions & 0 deletions src/interceptors.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import type { Interceptor } from "@connectrpc/connect";

export function createAuthInterceptor(token: string) {
const headers = new Headers({"X-Api-Key": token});
return createHeadersInterceptor(headers)
}

export function defaultHeadersInterceptor() {
const headers = new Headers({"X-User-Agent": "@substreams/node"});
return createHeadersInterceptor(headers)
}

export function createHeadersInterceptor(headers: Headers): Interceptor {
return (next) => async (req) => {
for (const [key, value] of Array.from(headers)) {
req.header.set(key, value);
}
return next(req);
};
}

export function createInterceptors(token?: string, headers?: Headers) {
const interceptors = [defaultHeadersInterceptor()];
if (token) {
interceptors.push(createAuthInterceptor(token));
}
if (headers) {
interceptors.push(createHeadersInterceptor(headers));
}
return interceptors;
}
3 changes: 2 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"sourceMap": true
},
"include": [
"index.ts"
"index.ts",
"src/**.ts"
]
}
Loading