-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathdb.ts
84 lines (70 loc) · 1.86 KB
/
db.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import mongo from 'mongodb';
const MongoClient = mongo.MongoClient;
let client: mongo.MongoClient = null;
let db: mongo.Db = null;
type State = {
_id: string;
height: number;
};
const getDbo = async () => {
if (db) {
return db;
}
client = await MongoClient.connect(process.env.BMAP_MONGO_URL, {
minPoolSize: 1,
maxPoolSize: 10,
});
db = client.db('bmap');
return db;
};
const closeDb = async () => {
if (client !== null) {
try {
await client.close();
} catch (_e) {
console.error('Failed to close DB');
return;
}
client = null;
}
};
async function getCollectionCounts(fromTimestamp: number): Promise<Record<string, number>[]> {
const dbo = await getDbo();
const collections = await dbo.listCollections().toArray();
const countPromises = collections.map(async (c) => {
let count = 0;
if (fromTimestamp) {
const query = { timestamp: { $gt: fromTimestamp } };
count = await dbo.collection(c.name).countDocuments(query);
} else {
count = await dbo.collection(c.name).estimatedDocumentCount();
}
return [c.name, count];
});
const countsArray = await Promise.all(countPromises);
return Object.fromEntries(countsArray) as Record<string, number>[];
}
async function getCurrentBlockHeight(): Promise<number> {
const _dbo = await getDbo();
const state = await getState();
return state ? state.height : 0;
}
async function getState(): Promise<State | undefined> {
const dbo = await getDbo();
return await dbo.collection('_state').findOne<State>({});
}
export { closeDb, getCollectionCounts, getCurrentBlockHeight, getDbo, getState };
// db.c.createIndex({
// "MAP.app": 1,
// "MAP.type": 1,
// })
// db.c.createIndex({
// "MAP.app": 1,
// "MAP.type": 1,
// "blk.t": -1,
// })
// db.c.createIndex({
// "MAP.app": 1,
// "MAP.type": 1,
// "blk.i": -1,
// })