Skip to content

Commit 4dc5118

Browse files
committed
updated arkiver start loggers and updated examples
1 parent 5b8dae1 commit 4dc5118

File tree

11 files changed

+228
-25
lines changed

11 files changed

+228
-25
lines changed

cli/deps.ts

+1
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ export { join } from 'https://deno.land/std@0.179.0/path/mod.ts'
1818
export { serve } from 'https://deno.land/std@0.180.0/http/server.ts'
1919
export { createYoga } from 'npm:graphql-yoga'
2020
export * as log from 'https://deno.land/std@0.181.0/log/mod.ts'
21+
export * as logLevel from 'https://deno.land/std@0.181.0/log/levels.ts'

cli/start/logger.ts

+155
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
import { ArkiveConsoleLogHandler, ArkiveManifest } from '../../mod.ts'
2+
import { DataSource } from '../../src/arkiver/types.ts'
3+
import { log } from '../deps.ts'
4+
5+
export const createManifestHandlers = (
6+
manifest: ArkiveManifest,
7+
logLevel: log.LevelName,
8+
) => {
9+
let manifestHandlers: Record<string, ArkiveConsoleLogHandler> = {}
10+
let manifestLoggers: Record<string, log.LoggerConfig> = {}
11+
12+
for (const [name, dataSource] of Object.entries(manifest.dataSources)) {
13+
const { handlers: contractHandlers, loggers: contractLoggers } =
14+
createContractHandlers({
15+
chain: name,
16+
dataSource,
17+
handlers: manifestHandlers,
18+
loggers: manifestLoggers,
19+
logLevel,
20+
manifest,
21+
})
22+
manifestHandlers = contractHandlers
23+
manifestLoggers = contractLoggers
24+
25+
const { handlers: blockHandlers, loggers: blockLoggers } =
26+
createBlockHandlers({
27+
chain: name,
28+
dataSource,
29+
handlers: manifestHandlers,
30+
loggers: manifestLoggers,
31+
logLevel,
32+
manifest,
33+
})
34+
manifestHandlers = blockHandlers
35+
manifestLoggers = blockLoggers
36+
37+
const { handlers: chainHandlers, loggers: chainLoggers } =
38+
createChainHandlers({
39+
chain: name,
40+
handlers: manifestHandlers,
41+
loggers: manifestLoggers,
42+
logLevel,
43+
manifest,
44+
})
45+
manifestHandlers = chainHandlers
46+
manifestLoggers = chainLoggers
47+
}
48+
49+
return { loggers: manifestLoggers, handlers: manifestHandlers }
50+
}
51+
52+
const createContractHandlers = (
53+
params: {
54+
manifest: ArkiveManifest
55+
logLevel: log.LevelName
56+
handlers: Record<string, ArkiveConsoleLogHandler>
57+
loggers: Record<string, log.LoggerConfig>
58+
chain: string
59+
dataSource: DataSource
60+
},
61+
) => {
62+
const { chain, dataSource, handlers, loggers, logLevel, manifest } = params
63+
64+
if (!dataSource.contracts) return { handlers, loggers }
65+
66+
for (const contract of dataSource.contracts) {
67+
for (const event of contract.events) {
68+
const key = `${chain}-${contract.id}-${event.name}`
69+
handlers[key] = new ArkiveConsoleLogHandler(
70+
logLevel,
71+
{
72+
arkive: {
73+
name: manifest.name ?? 'my-arkive',
74+
id: 0,
75+
majorVersion: 1,
76+
minorVersion: 0,
77+
},
78+
contract: contract.id,
79+
chain,
80+
event: event.name,
81+
},
82+
)
83+
loggers[key] = {
84+
handlers: [key],
85+
level: logLevel,
86+
}
87+
}
88+
}
89+
90+
return { handlers, loggers }
91+
}
92+
93+
const createBlockHandlers = (
94+
params: {
95+
manifest: ArkiveManifest
96+
logLevel: log.LevelName
97+
handlers: Record<string, ArkiveConsoleLogHandler>
98+
loggers: Record<string, log.LoggerConfig>
99+
chain: string
100+
dataSource: DataSource
101+
},
102+
) => {
103+
const { chain, dataSource, handlers, loggers, logLevel, manifest } = params
104+
105+
if (!dataSource.blockHandlers) return { handlers, loggers }
106+
107+
for (const blockHandler of dataSource.blockHandlers) {
108+
const key = `${chain}-${blockHandler.name}`
109+
handlers[key] = new ArkiveConsoleLogHandler(logLevel, {
110+
arkive: {
111+
name: manifest.name ?? 'my-arkive',
112+
id: 0,
113+
majorVersion: 1,
114+
minorVersion: 0,
115+
},
116+
chain,
117+
blockHandler: blockHandler.name,
118+
})
119+
loggers[key] = {
120+
handlers: [key],
121+
level: logLevel,
122+
}
123+
}
124+
125+
return { handlers, loggers }
126+
}
127+
128+
const createChainHandlers = (
129+
params: {
130+
manifest: ArkiveManifest
131+
logLevel: log.LevelName
132+
handlers: Record<string, ArkiveConsoleLogHandler>
133+
loggers: Record<string, log.LoggerConfig>
134+
chain: string
135+
},
136+
) => {
137+
const { chain, handlers, loggers, logLevel, manifest } = params
138+
139+
const key = `${chain}`
140+
handlers[key] = new ArkiveConsoleLogHandler(logLevel, {
141+
arkive: {
142+
name: manifest.name ?? 'my-arkive',
143+
id: 0,
144+
majorVersion: 1,
145+
minorVersion: 0,
146+
},
147+
chain,
148+
})
149+
loggers[key] = {
150+
handlers: [key],
151+
level: logLevel,
152+
}
153+
154+
return { handlers, loggers }
155+
}

cli/start/mod.ts

+32-9
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import {
44
buildSchemaFromEntities,
55
defaultArkiveData,
66
} from '../../mod.ts'
7-
import { $, createYoga, delay, join, log, serve } from '../deps.ts'
7+
import { $, createYoga, delay, join, log, logLevel, serve } from '../deps.ts'
88
import { ArkiverMetadata } from '../../src/arkiver/arkive-metadata.ts'
9+
import { createManifestHandlers } from './logger.ts'
10+
import { colors } from '../../src/deps.ts'
911

1012
export const action = async (
1113
options: {
@@ -20,6 +22,13 @@ export const action = async (
2022
) => {
2123
Deno.env.set('DENO_ENV', 'PROD')
2224

25+
try {
26+
logLevel.getLevelByName(options.logLevel.toUpperCase() as log.LevelName)
27+
} catch (e) {
28+
console.error(e)
29+
Deno.exit(1)
30+
}
31+
2332
if (!options.mongoConnection && options.db) {
2433
const cleanup = async () => {
2534
console.log(`\nCleaning up...`)
@@ -58,15 +67,14 @@ export const action = async (
5867
)
5968
}
6069

61-
const rpcUrls = options.rpcUrl?.reduce((acc, rpc) => {
62-
const [name, url] = rpc.split('=')
63-
acc[name] = url
64-
return acc
65-
}, {} as Record<string, string>) ?? {}
70+
const { handlers, loggers } = createManifestHandlers(
71+
manifest,
72+
options.logLevel.toUpperCase() as log.LevelName,
73+
)
6674

6775
log.setup({
6876
handlers: {
69-
console: new ArkiveConsoleLogHandler(
77+
arkiver: new ArkiveConsoleLogHandler(
7078
options.logLevel.toUpperCase() as log.LevelName,
7179
{
7280
arkive: {
@@ -77,14 +85,23 @@ export const action = async (
7785
},
7886
},
7987
),
88+
...handlers,
8089
},
8190
loggers: {
8291
arkiver: {
8392
level: options.logLevel as log.LevelName,
84-
handlers: ['console'],
93+
handlers: ['arkiver'],
8594
},
95+
...loggers,
8696
},
8797
})
98+
99+
const rpcUrls = options.rpcUrl?.reduce((acc, rpc) => {
100+
const [name, url] = rpc.split('=')
101+
acc[name] = url
102+
return acc
103+
}, {} as Record<string, string>) ?? {}
104+
88105
const arkiver = new Arkiver({
89106
manifest,
90107
mongoConnection: options.db
@@ -122,7 +139,13 @@ export const action = async (
122139
port: 4000,
123140
onListen: ({ hostname, port }) => {
124141
console.log(
125-
`🚀 Arkiver playground ready at http://${hostname}:${port}/graphql`,
142+
colors.magenta(
143+
colors.bold(
144+
`🚀 Arkiver playground ready at ${
145+
colors.underline(`http://${hostname}:${port}/graphql`)
146+
}`,
147+
),
148+
),
126149
)
127150
},
128151
})
+11-7
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
1-
import { Manifest } from "https://deno.land/x/robo_arkiver@v0.4.4/mod.ts";
2-
import { VaultSnapshot } from "./entities/vault.ts";
3-
import { snapshotVault } from "./handlers/vault.ts";
1+
import { Manifest } from 'https://deno.land/x/robo_arkiver/mod.ts'
2+
import { VaultSnapshot } from './entities/vault.ts'
3+
import { snapshotVault } from './handlers/vault.ts'
44

5-
const manifest = new Manifest("yearn-vaults");
5+
const manifest = new Manifest('yearn-vaults')
66

77
manifest
88
.addEntity(VaultSnapshot)
9-
.chain("mainnet")
10-
.addBlockHandler({ blockInterval: 1000, startBlockHeight: 12790000n, handler: snapshotVault })
9+
.chain('mainnet')
10+
.addBlockHandler({
11+
blockInterval: 1000,
12+
startBlockHeight: 12790000n,
13+
handler: snapshotVault,
14+
})
1115

1216
export default manifest
13-
.build();
17+
.build()

examples/erc20-balance-history/manifest.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const manifest = new Manifest('frax-balances')
88
manifest
99
.addEntities(Entities)
1010
.chain('mainnet', { blockRange: 500n })
11-
.contract(erc20)
11+
.contract('ERC20', erc20)
1212
.addSources({ '0x853d955aCEf822Db058eb8505911ED77F175b99e': 11465581n })
1313
.addEventHandlers({ 'Transfer': onTransfer })
1414

examples/erc20-events/manifest.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { Manifest } from 'https://deno.land/x/robo_arkiver/mod.ts'
22
import erc20 from './erc20.ts'
3-
import { Transfer, Approval } from './entities.ts'
4-
import { onTransfer, onApproval } from './handlers.ts'
3+
import { Approval, Transfer } from './entities.ts'
4+
import { onApproval, onTransfer } from './handlers.ts'
55

66
const manifest = new Manifest('weth-events')
77

88
manifest
99
.addEntities([Transfer, Approval])
1010
.chain('mainnet', { blockRange: 500n })
11-
.contract(erc20)
11+
.contract('ERC20', erc20)
1212
.addSources({ '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2': 4729568n })
1313
.addEventHandlers({ 'Transfer': onTransfer })
1414
.addEventHandlers({ 'Approval': onApproval })

examples/event-wildcard/deps.ts

-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@ export { formatUnits } from 'npm:viem'
22
export {
33
createEntity,
44
type EventHandlerFor,
5-
logger,
65
Manifest,
76
} from 'https://deno.land/x/robo_arkiver/mod.ts'

examples/event-wildcard/manifest.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const manifest = new Manifest('agnostic-events')
66

77
manifest
88
.chain('avalanche', { blockRange: 100n })
9-
.contract(erc20)
9+
.contract('ERC20', erc20)
1010
.addSources({ '*': 27347402n })
1111
.addEventHandlers({ 'Transfer': transferHandler })
1212

examples/simple/deps.ts

-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@ export { formatUnits } from 'npm:viem'
22
export {
33
createEntity,
44
type EventHandlerFor,
5-
logger,
65
Manifest,
76
} from 'https://deno.land/x/robo_arkiver/mod.ts'

examples/simple/manifest.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const manifest = new Manifest('simple')
88
manifest
99
.addEntity(Balance)
1010
.chain('mainnet', { blockRange: 100n })
11-
.contract(erc20)
11+
.contract('ERC20', erc20)
1212
.addSources({ '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2': 16987011n })
1313
.addEventHandlers({ 'Transfer': transferHandler })
1414

src/logger.ts

+23-1
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,45 @@ type Arkive = {
99

1010
export class ArkiveConsoleLogHandler extends ConsoleHandler {
1111
private arkive: Arkive
12+
private chain?: string
13+
private contract?: string
14+
private event?: string
15+
private blockHandler?: string
1216

1317
constructor(
1418
levelName: log.LevelName,
1519
options: log.HandlerOptions & {
1620
arkive: Arkive
21+
chain?: string
22+
contract?: string
23+
event?: string
24+
blockHandler?: string
1725
},
1826
) {
1927
super(levelName, options)
2028
this.arkive = options.arkive
29+
this.chain = options.chain
30+
this.contract = options.contract
31+
this.event = options.event
32+
this.blockHandler = options.blockHandler
2133
}
2234

2335
override format(logRecord: log.LogRecord): string {
2436
let msg = super.format(logRecord)
2537

38+
let header =
39+
`${this.arkive.id}:${this.arkive.name}@v${this.arkive.majorVersion}.${this.arkive.minorVersion}${
40+
this.chain ? `:${this.chain}` : ''
41+
}`
42+
if (this.blockHandler) {
43+
header += `:${this.blockHandler}`
44+
} else if (this.contract && this.event) {
45+
header += `:${this.contract}:${this.event}`
46+
}
47+
2648
msg = `${
2749
colors.blue(
28-
`[${this.arkive.id}:${this.arkive.name}@v${this.arkive.majorVersion}.${this.arkive.minorVersion}]`,
50+
`[${header}]`,
2951
)
3052
} ${msg}`
3153

0 commit comments

Comments
 (0)