orbitdb-relay-pinner 0.1.3 → 0.1.4
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.
- package/README.md +0 -12
- package/dist/events/handlers.d.ts +1 -1
- package/dist/events/handlers.d.ts.map +1 -1
- package/dist/events/handlers.js +25 -4
- package/dist/events/handlers.js.map +1 -1
- package/dist/relay.d.ts.map +1 -1
- package/dist/relay.js +23 -3
- package/dist/relay.js.map +1 -1
- package/dist/services/database.d.ts +12 -12
- package/dist/services/database.d.ts.map +1 -1
- package/dist/services/database.js +111 -181
- package/dist/services/database.js.map +1 -1
- package/dist/services/metrics.d.ts +3 -0
- package/dist/services/metrics.d.ts.map +1 -1
- package/dist/services/metrics.js +30 -4
- package/dist/services/metrics.js.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -34,7 +34,6 @@ orbitdb-relay-pinner --test
|
|
|
34
34
|
- `DATASTORE_PATH` or `RELAY_DATASTORE_PATH` to control where LevelDB data is stored
|
|
35
35
|
- `PUBSUB_TOPICS` to override pubsub peer discovery topics (default: `todo._peer-discovery._p2p._pubsub`)
|
|
36
36
|
- `TEST_PRIVATE_KEY` / `RELAY_PRIV_KEY` for `--test` runs (optional)
|
|
37
|
-
- `PIN_DATABASE_ALLOWLIST` optional comma-separated filter (matches db address/name substrings) to restrict which OrbitDB databases are pinned
|
|
38
37
|
|
|
39
38
|
## Development
|
|
40
39
|
|
|
@@ -44,17 +43,6 @@ npm run build
|
|
|
44
43
|
node dist/cli.js --test
|
|
45
44
|
```
|
|
46
45
|
|
|
47
|
-
## Pinning Behavior
|
|
48
|
-
|
|
49
|
-
- The relay scans document payloads for candidate IPFS CIDs and pins them.
|
|
50
|
-
- It prioritizes CID-oriented fields (for example `cid`, `mediaIds`, `...Cid`, `...Cids`, and settings-style CID references) and also parses IPFS links in strings.
|
|
51
|
-
- Extracted CID forms include:
|
|
52
|
-
- direct CID strings
|
|
53
|
-
- `ipfs://<cid>`
|
|
54
|
-
- `/ipfs/<cid>` paths
|
|
55
|
-
- bare CID tokens (eg `bafy...`, `Qm...`) found in text
|
|
56
|
-
- Pinning is deduplicated per database to avoid re-pinning the same CID repeatedly.
|
|
57
|
-
|
|
58
46
|
## Docker Compose Example
|
|
59
47
|
|
|
60
48
|
See `docker-compose.example.yml` for a minimal deployment example with:
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function setupEventHandlers(libp2p: any, databaseService: any): () => void
|
|
1
|
+
export declare function setupEventHandlers(libp2p: any, databaseService: any): () => Promise<void>;
|
|
2
2
|
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,eAAe,EAAE,GAAG,uBAyFnE"}
|
package/dist/events/handlers.js
CHANGED
|
@@ -5,6 +5,8 @@ import { log, syncLog } from '../utils/logger.js';
|
|
|
5
5
|
import { loggingConfig } from '../config/logging.js';
|
|
6
6
|
export function setupEventHandlers(libp2p, databaseService) {
|
|
7
7
|
const cleanupFunctions = [];
|
|
8
|
+
const certificateIntervals = new Set();
|
|
9
|
+
let isShuttingDown = false;
|
|
8
10
|
const peerConnectHandler = async (event) => {
|
|
9
11
|
const peer = event.detail;
|
|
10
12
|
try {
|
|
@@ -27,9 +29,12 @@ export function setupEventHandlers(libp2p, databaseService) {
|
|
|
27
29
|
.getMultiaddrs()
|
|
28
30
|
.filter((ma) => WebSocketsSecure.exactMatch(ma) && ma.toString().includes('/sni/'))
|
|
29
31
|
.map((ma) => ma.toString());
|
|
30
|
-
if (mas.length > 0)
|
|
32
|
+
if (mas.length > 0) {
|
|
31
33
|
clearInterval(interval);
|
|
34
|
+
certificateIntervals.delete(interval);
|
|
35
|
+
}
|
|
32
36
|
}, 1000);
|
|
37
|
+
certificateIntervals.add(interval);
|
|
33
38
|
};
|
|
34
39
|
libp2p.addEventListener('certificate:provision', certificateHandler);
|
|
35
40
|
cleanupFunctions.push(() => libp2p.removeEventListener('certificate:provision', certificateHandler));
|
|
@@ -40,6 +45,8 @@ export function setupEventHandlers(libp2p, databaseService) {
|
|
|
40
45
|
cleanupFunctions.push(() => libp2p.removeEventListener('peer:disconnect', peerDisconnectHandler));
|
|
41
46
|
const syncQueue = new PQueue({ concurrency: 2 });
|
|
42
47
|
const pubsubMessageHandler = (event) => {
|
|
48
|
+
if (isShuttingDown)
|
|
49
|
+
return;
|
|
43
50
|
const msg = event.detail;
|
|
44
51
|
syncLog('Received pubsub message:', msg.topic);
|
|
45
52
|
if (msg.topic && msg.topic.startsWith('/orbitdb/')) {
|
|
@@ -56,7 +63,9 @@ export function setupEventHandlers(libp2p, databaseService) {
|
|
|
56
63
|
libp2p.addEventListener('connection:open', connectionOpenHandler);
|
|
57
64
|
cleanupFunctions.push(() => libp2p.removeEventListener('connection:open', connectionOpenHandler));
|
|
58
65
|
const pubsub = libp2p.services.pubsub;
|
|
59
|
-
|
|
66
|
+
const subscriptionChangeHandler = (event) => {
|
|
67
|
+
if (isShuttingDown)
|
|
68
|
+
return;
|
|
60
69
|
if (event.detail?.subscriptions) {
|
|
61
70
|
for (const subscription of event.detail.subscriptions) {
|
|
62
71
|
if (subscription.topic?.startsWith('/orbitdb/')) {
|
|
@@ -64,7 +73,19 @@ export function setupEventHandlers(libp2p, databaseService) {
|
|
|
64
73
|
}
|
|
65
74
|
}
|
|
66
75
|
}
|
|
67
|
-
}
|
|
68
|
-
|
|
76
|
+
};
|
|
77
|
+
pubsub.addEventListener('subscription-change', subscriptionChangeHandler);
|
|
78
|
+
cleanupFunctions.push(() => pubsub.removeEventListener('subscription-change', subscriptionChangeHandler));
|
|
79
|
+
return async () => {
|
|
80
|
+
isShuttingDown = true;
|
|
81
|
+
cleanupFunctions.forEach((cleanup) => cleanup());
|
|
82
|
+
syncQueue.pause();
|
|
83
|
+
syncQueue.clear();
|
|
84
|
+
await syncQueue.onIdle();
|
|
85
|
+
for (const interval of certificateIntervals) {
|
|
86
|
+
clearInterval(interval);
|
|
87
|
+
}
|
|
88
|
+
certificateIntervals.clear();
|
|
89
|
+
};
|
|
69
90
|
}
|
|
70
91
|
//# sourceMappingURL=handlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,UAAU,kBAAkB,CAAC,MAAW,EAAE,eAAoB;IAClE,MAAM,gBAAgB,GAAsB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/relay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B,CAAA;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAgF/E"}
|
package/dist/relay.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createLibp2p } from 'libp2p';
|
|
|
2
2
|
import { createHelia } from 'helia';
|
|
3
3
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
4
4
|
import { privateKeyFromProtobuf } from '@libp2p/crypto/keys';
|
|
5
|
+
import { join } from 'node:path';
|
|
5
6
|
import { createLibp2pConfig } from './config/libp2p.js';
|
|
6
7
|
import { initializeStorage } from './services/storage.js';
|
|
7
8
|
import { DatabaseService } from './services/database.js';
|
|
@@ -22,10 +23,10 @@ export async function startRelay(opts = {}) {
|
|
|
22
23
|
const libp2p = await createLibp2p(createLibp2pConfig(privateKey, datastore));
|
|
23
24
|
const ipfs = await createHelia({ libp2p, datastore, blockstore });
|
|
24
25
|
const databaseService = new DatabaseService();
|
|
25
|
-
await databaseService.initialize(ipfs);
|
|
26
|
+
await databaseService.initialize(ipfs, join(storageDir, 'orbitdb'));
|
|
26
27
|
const cleanupEventHandlers = await setupEventHandlers(libp2p, databaseService);
|
|
27
28
|
const metricsServer = new MetricsServer();
|
|
28
|
-
metricsServer.start();
|
|
29
|
+
await metricsServer.start();
|
|
29
30
|
// Important: Playwright setup waits for this marker.
|
|
30
31
|
// eslint-disable-next-line no-console
|
|
31
32
|
console.log(`Relay PeerId: ${libp2p.peerId.toString()}`);
|
|
@@ -33,8 +34,21 @@ export async function startRelay(opts = {}) {
|
|
|
33
34
|
console.log('p2p addr: ', libp2p.getMultiaddrs().map((ma) => ma.toString()));
|
|
34
35
|
return {
|
|
35
36
|
stop: async () => {
|
|
37
|
+
databaseService.beginShutdown();
|
|
36
38
|
try {
|
|
37
|
-
cleanupEventHandlers?.();
|
|
39
|
+
await cleanupEventHandlers?.();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// ignore
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
await databaseService.stop();
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// ignore
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
await metricsServer.stop();
|
|
38
52
|
}
|
|
39
53
|
catch {
|
|
40
54
|
// ignore
|
|
@@ -47,6 +61,12 @@ export async function startRelay(opts = {}) {
|
|
|
47
61
|
catch {
|
|
48
62
|
// ignore
|
|
49
63
|
}
|
|
64
|
+
try {
|
|
65
|
+
await ipfs.stop();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// ignore
|
|
69
|
+
}
|
|
50
70
|
try {
|
|
51
71
|
await datastore.close();
|
|
52
72
|
}
|
package/dist/relay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACnC,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
+
import PQueue from 'p-queue';
|
|
1
2
|
import { MetricsServer } from './metrics.js';
|
|
2
3
|
export declare class DatabaseService {
|
|
3
|
-
private static readonly CID_FIELD_KEYS;
|
|
4
4
|
metrics: MetricsServer;
|
|
5
5
|
identityDatabases: Map<string, any>;
|
|
6
6
|
databaseContexts: Map<string, any>;
|
|
7
7
|
updateTimers: Map<string, any>;
|
|
8
|
-
openDatabases: Map<string, any>;
|
|
9
8
|
eventHandlers: Map<string, any>;
|
|
10
|
-
|
|
9
|
+
pinQueue: PQueue;
|
|
10
|
+
queuedImageCids: Set<string>;
|
|
11
|
+
pinnedImageCids: Set<string>;
|
|
12
|
+
isShuttingDown: boolean;
|
|
11
13
|
orbitdb: any;
|
|
12
14
|
ipfs: any;
|
|
13
15
|
constructor();
|
|
14
|
-
initialize(ipfs: any): Promise<void>;
|
|
15
|
-
private
|
|
16
|
-
private
|
|
17
|
-
private
|
|
18
|
-
private
|
|
19
|
-
private pinCidIfNeeded;
|
|
20
|
-
private pinFromRecord;
|
|
21
|
-
private processDatabasePins;
|
|
22
|
-
private setupDatabaseListeners;
|
|
16
|
+
initialize(ipfs: any, directory?: string): Promise<void>;
|
|
17
|
+
private extractImageCids;
|
|
18
|
+
private pinImageCid;
|
|
19
|
+
private enqueueImageCidsForPinning;
|
|
20
|
+
private waitForUpdateEvent;
|
|
23
21
|
syncAllOrbitDBRecords(dbAddress: string): Promise<void>;
|
|
22
|
+
beginShutdown(): void;
|
|
23
|
+
stop(): Promise<void>;
|
|
24
24
|
}
|
|
25
25
|
//# sourceMappingURL=database.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C,qBAAa,eAAe;IAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"AAKA,OAAO,MAAM,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C,qBAAa,eAAe;IAC1B,OAAO,EAAE,aAAa,CAAA;IACtB,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAClC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC9B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,cAAc,EAAE,OAAO,CAAA;IACvB,OAAO,EAAE,GAAG,CAAA;IACZ,IAAI,EAAE,GAAG,CAAA;;IAcH,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM;IAO9C,OAAO,CAAC,gBAAgB;YAwBV,WAAW;IAQzB,OAAO,CAAC,0BAA0B;YA2BpB,kBAAkB;IAoB1B,qBAAqB,CAAC,SAAS,EAAE,MAAM;IAgD7C,aAAa;IAIP,IAAI;CAaX"}
|
|
@@ -2,25 +2,21 @@ import { createOrbitDB, useIdentityProvider } from '@orbitdb/core';
|
|
|
2
2
|
import OrbitDBIdentityProviderDID from '@orbitdb/identity-provider-did';
|
|
3
3
|
import * as KeyDIDResolver from 'key-did-resolver';
|
|
4
4
|
import { CID } from 'multiformats/cid';
|
|
5
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
6
|
+
import PQueue from 'p-queue';
|
|
5
7
|
import { MetricsServer } from './metrics.js';
|
|
6
|
-
import { syncLog, logSyncStats } from '../utils/logger.js';
|
|
8
|
+
import { log, syncLog, logSyncStats } from '../utils/logger.js';
|
|
7
9
|
import { loggingConfig } from '../config/logging.js';
|
|
8
10
|
export class DatabaseService {
|
|
9
|
-
static CID_FIELD_KEYS = new Set([
|
|
10
|
-
'cid',
|
|
11
|
-
'cids',
|
|
12
|
-
'mediaid',
|
|
13
|
-
'mediaids',
|
|
14
|
-
'profilepicture',
|
|
15
|
-
'profilepicturecid',
|
|
16
|
-
]);
|
|
17
11
|
metrics;
|
|
18
12
|
identityDatabases;
|
|
19
13
|
databaseContexts;
|
|
20
14
|
updateTimers;
|
|
21
|
-
openDatabases;
|
|
22
15
|
eventHandlers;
|
|
23
|
-
|
|
16
|
+
pinQueue;
|
|
17
|
+
queuedImageCids;
|
|
18
|
+
pinnedImageCids;
|
|
19
|
+
isShuttingDown;
|
|
24
20
|
orbitdb;
|
|
25
21
|
ipfs;
|
|
26
22
|
constructor() {
|
|
@@ -28,207 +24,118 @@ export class DatabaseService {
|
|
|
28
24
|
this.identityDatabases = new Map();
|
|
29
25
|
this.databaseContexts = new Map();
|
|
30
26
|
this.updateTimers = new Map();
|
|
31
|
-
this.openDatabases = new Map();
|
|
32
27
|
this.eventHandlers = new Map();
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
28
|
+
this.pinQueue = new PQueue({ concurrency: 4 });
|
|
29
|
+
this.queuedImageCids = new Set();
|
|
30
|
+
this.pinnedImageCids = new Set();
|
|
31
|
+
this.isShuttingDown = false;
|
|
35
32
|
}
|
|
36
|
-
async initialize(ipfs) {
|
|
33
|
+
async initialize(ipfs, directory) {
|
|
37
34
|
OrbitDBIdentityProviderDID.setDIDResolver(KeyDIDResolver.getResolver());
|
|
38
35
|
useIdentityProvider(OrbitDBIdentityProviderDID);
|
|
39
36
|
this.ipfs = ipfs;
|
|
40
|
-
this.orbitdb = await createOrbitDB({ ipfs });
|
|
37
|
+
this.orbitdb = await createOrbitDB({ ipfs, ...(directory ? { directory } : {}) });
|
|
41
38
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const trimmed = candidate.trim();
|
|
59
|
-
if (!trimmed)
|
|
60
|
-
return;
|
|
61
|
-
try {
|
|
62
|
-
out.add(CID.parse(trimmed).toString());
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// ignore
|
|
67
|
-
}
|
|
68
|
-
const ipfsUriMatches = [...trimmed.matchAll(/ipfs:\/\/([^/?#\s]+)/gi)];
|
|
69
|
-
for (const match of ipfsUriMatches) {
|
|
70
|
-
try {
|
|
71
|
-
out.add(CID.parse(match[1]).toString());
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// ignore
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
const ipfsPathMatches = trimmed.match(/\/ipfs\/([^/?#\s]+)/gi) || [];
|
|
78
|
-
for (const match of ipfsPathMatches) {
|
|
79
|
-
const part = match.split('/ipfs/')[1];
|
|
80
|
-
if (!part)
|
|
81
|
-
continue;
|
|
82
|
-
try {
|
|
83
|
-
out.add(CID.parse(part).toString());
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// ignore
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
const bareCidMatches = [...trimmed.matchAll(/\b(bafy[a-z2-7]{20,}|bafk[a-z2-7]{20,}|Qm[1-9A-HJ-NP-Za-km-z]{44})\b/g)];
|
|
90
|
-
for (const match of bareCidMatches) {
|
|
91
|
-
try {
|
|
92
|
-
out.add(CID.parse(match[1]).toString());
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
// ignore
|
|
39
|
+
extractImageCids(records) {
|
|
40
|
+
const result = new Set();
|
|
41
|
+
for (const record of records) {
|
|
42
|
+
const payload = record?.value;
|
|
43
|
+
const imageCid = payload?.imageCid ?? payload?.imageCID ?? payload?.image?.cid;
|
|
44
|
+
const profilePictureCid = payload?.profilePicture ??
|
|
45
|
+
payload?.profilePictureCid ??
|
|
46
|
+
payload?.profilePictureCID ??
|
|
47
|
+
((payload?._id === 'profilePicture' || payload?._id === 'profilePictureCid' || payload?._id === 'profilePictureCID')
|
|
48
|
+
? payload?.value
|
|
49
|
+
: undefined);
|
|
50
|
+
const mediaIds = Array.isArray(payload?.mediaIds) ? payload.mediaIds : [];
|
|
51
|
+
const mediaId = payload?.mediaId;
|
|
52
|
+
for (const candidate of [imageCid, profilePictureCid, mediaId, ...mediaIds]) {
|
|
53
|
+
if (typeof candidate === 'string' && candidate.length > 0)
|
|
54
|
+
result.add(candidate);
|
|
96
55
|
}
|
|
97
56
|
}
|
|
57
|
+
return Array.from(result);
|
|
98
58
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
extractCandidateCids(value, out, visited = new WeakSet()) {
|
|
105
|
-
if (value == null)
|
|
106
|
-
return;
|
|
107
|
-
if (typeof value === 'string') {
|
|
108
|
-
this.addCandidateCid(value, out);
|
|
109
|
-
return;
|
|
59
|
+
async pinImageCid(imageCid) {
|
|
60
|
+
const cid = CID.parse(imageCid);
|
|
61
|
+
for await (const _ of this.ipfs.pins.add(cid)) {
|
|
62
|
+
// consume the async generator to completion
|
|
110
63
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
64
|
+
syncLog('Pinned image CID:', imageCid);
|
|
65
|
+
}
|
|
66
|
+
enqueueImageCidsForPinning(imageCids) {
|
|
67
|
+
if (!this.ipfs?.pins || imageCids.length === 0 || this.isShuttingDown)
|
|
114
68
|
return;
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const lowerKey = key.toLowerCase();
|
|
125
|
-
if (this.shouldTreatFieldAsCid(lowerKey) || (lowerKey === 'value' && valueIsCidById)) {
|
|
126
|
-
this.addCandidateCid(fieldValue, out);
|
|
69
|
+
for (const imageCid of imageCids) {
|
|
70
|
+
if (this.pinnedImageCids.has(imageCid) || this.queuedImageCids.has(imageCid))
|
|
71
|
+
continue;
|
|
72
|
+
this.queuedImageCids.add(imageCid);
|
|
73
|
+
this.pinQueue
|
|
74
|
+
.add(async () => {
|
|
75
|
+
try {
|
|
76
|
+
await this.pinImageCid(imageCid);
|
|
77
|
+
this.pinnedImageCids.add(imageCid);
|
|
127
78
|
}
|
|
128
|
-
|
|
129
|
-
|
|
79
|
+
catch (err) {
|
|
80
|
+
if (loggingConfig.logLevels.database) {
|
|
81
|
+
// eslint-disable-next-line no-console
|
|
82
|
+
console.error(`Failed to pin image CID ${imageCid}:`, err?.message || err);
|
|
83
|
+
}
|
|
130
84
|
}
|
|
131
|
-
|
|
132
|
-
|
|
85
|
+
finally {
|
|
86
|
+
this.queuedImageCids.delete(imageCid);
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
.catch(() => {
|
|
90
|
+
// handled in task body
|
|
91
|
+
});
|
|
133
92
|
}
|
|
134
93
|
}
|
|
135
|
-
async
|
|
136
|
-
if (!
|
|
137
|
-
return;
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
94
|
+
async waitForUpdateEvent(db, timeoutMs = 5000) {
|
|
95
|
+
if (!db?.events?.on || !db?.events?.off)
|
|
96
|
+
return false;
|
|
97
|
+
let didUpdate = false;
|
|
98
|
+
const onUpdate = () => {
|
|
99
|
+
didUpdate = true;
|
|
100
|
+
};
|
|
101
|
+
db.events.on('update', onUpdate);
|
|
143
102
|
try {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
syncLog(`Pinned data CID for ${dbAddress}:`, cid);
|
|
103
|
+
const startedAt = Date.now();
|
|
104
|
+
while (!didUpdate && !this.isShuttingDown && Date.now() - startedAt < timeoutMs) {
|
|
105
|
+
await delay(100);
|
|
148
106
|
}
|
|
107
|
+
return didUpdate;
|
|
149
108
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
// eslint-disable-next-line no-console
|
|
153
|
-
console.error(`Failed to pin data CID ${cid} for ${dbAddress}:`, err);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
async pinFromRecord(dbAddress, record) {
|
|
158
|
-
const candidateCids = new Set();
|
|
159
|
-
this.extractCandidateCids(record, candidateCids);
|
|
160
|
-
for (const cid of candidateCids) {
|
|
161
|
-
await this.pinCidIfNeeded(dbAddress, cid);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
async processDatabasePins(dbAddress, db, records) {
|
|
165
|
-
if (!this.shouldPinDatabase(dbAddress, db?.name))
|
|
166
|
-
return;
|
|
167
|
-
for (const record of records) {
|
|
168
|
-
await this.pinFromRecord(dbAddress, record);
|
|
109
|
+
finally {
|
|
110
|
+
db.events.off('update', onUpdate);
|
|
169
111
|
}
|
|
170
112
|
}
|
|
171
|
-
setupDatabaseListeners(dbAddress, db) {
|
|
172
|
-
if (!db?.events?.on)
|
|
173
|
-
return;
|
|
174
|
-
if (this.eventHandlers.has(dbAddress))
|
|
175
|
-
return;
|
|
176
|
-
if (!this.shouldPinDatabase(dbAddress, db?.name))
|
|
177
|
-
return;
|
|
178
|
-
const updateHandler = async (entry) => {
|
|
179
|
-
try {
|
|
180
|
-
await this.pinFromRecord(dbAddress, entry);
|
|
181
|
-
await this.pinFromRecord(dbAddress, entry?.value);
|
|
182
|
-
}
|
|
183
|
-
catch (err) {
|
|
184
|
-
if (loggingConfig.logLevels.database) {
|
|
185
|
-
// eslint-disable-next-line no-console
|
|
186
|
-
console.error(`Failed to process update pins for ${dbAddress}:`, err);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
db.events.on('update', updateHandler);
|
|
191
|
-
this.eventHandlers.set(dbAddress, updateHandler);
|
|
192
|
-
}
|
|
193
113
|
async syncAllOrbitDBRecords(dbAddress) {
|
|
114
|
+
if (this.isShuttingDown)
|
|
115
|
+
return;
|
|
194
116
|
syncLog('Starting sync for database:', dbAddress);
|
|
195
117
|
const endTimer = this.metrics.startSyncTimer('all_databases');
|
|
118
|
+
let db;
|
|
196
119
|
try {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
120
|
+
syncLog('Opening database:', dbAddress);
|
|
121
|
+
db = await this.orbitdb.open(dbAddress);
|
|
122
|
+
syncLog('Opened database:', dbAddress);
|
|
123
|
+
syncLog('Waiting for database update event:', dbAddress);
|
|
124
|
+
const didReceiveUpdate = await this.waitForUpdateEvent(db);
|
|
125
|
+
if (!didReceiveUpdate) {
|
|
126
|
+
syncLog('No update event received within timeout:', dbAddress);
|
|
200
127
|
}
|
|
201
128
|
else {
|
|
202
|
-
|
|
203
|
-
this.openDatabases.set(dbAddress, db);
|
|
204
|
-
this.setupDatabaseListeners(dbAddress, db);
|
|
129
|
+
syncLog('Received update event for database:', dbAddress);
|
|
205
130
|
}
|
|
206
|
-
const previousCounts = this.identityDatabases.get(dbAddress) || { posts: 0, comments: 0, media: 0 };
|
|
207
131
|
const records = await db.all();
|
|
208
|
-
|
|
132
|
+
syncLog('Read records from database:', dbAddress, 'count:', records.length);
|
|
133
|
+
if (didReceiveUpdate) {
|
|
134
|
+
this.enqueueImageCidsForPinning(this.extractImageCids(records));
|
|
135
|
+
}
|
|
209
136
|
if (records.length > 0) {
|
|
210
137
|
syncLog(`Sample record from ${db.name}:`, JSON.stringify(records[0], null, 2));
|
|
211
138
|
}
|
|
212
|
-
let recordCounts = { posts: 0, comments: 0, media: 0 };
|
|
213
|
-
let dbType = 'unknown';
|
|
214
|
-
if (db.name.includes('posts') || db.name.includes('post')) {
|
|
215
|
-
recordCounts.posts = records.length;
|
|
216
|
-
dbType = 'posts';
|
|
217
|
-
}
|
|
218
|
-
else if (db.name.includes('comments') || db.name.includes('comment')) {
|
|
219
|
-
recordCounts.comments = records.length;
|
|
220
|
-
dbType = 'comments';
|
|
221
|
-
}
|
|
222
|
-
else if (db.name.includes('media')) {
|
|
223
|
-
recordCounts.media = records.length;
|
|
224
|
-
dbType = 'media';
|
|
225
|
-
}
|
|
226
|
-
else if (db.name.includes('settings') || db.name.includes('config')) {
|
|
227
|
-
dbType = 'settings';
|
|
228
|
-
}
|
|
229
|
-
const peerId = db?.identity?.id;
|
|
230
|
-
logSyncStats(dbType, dbAddress, peerId, recordCounts, previousCounts);
|
|
231
|
-
this.identityDatabases.set(dbAddress, recordCounts);
|
|
232
139
|
this.metrics.trackSync('documents', 'success');
|
|
233
140
|
endTimer();
|
|
234
141
|
}
|
|
@@ -240,6 +147,29 @@ export class DatabaseService {
|
|
|
240
147
|
console.error('Failed to sync database:', err);
|
|
241
148
|
}
|
|
242
149
|
}
|
|
150
|
+
finally {
|
|
151
|
+
try {
|
|
152
|
+
await db?.close?.();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// ignore close failures
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
beginShutdown() {
|
|
160
|
+
this.isShuttingDown = true;
|
|
161
|
+
}
|
|
162
|
+
async stop() {
|
|
163
|
+
this.beginShutdown();
|
|
164
|
+
this.pinQueue.pause();
|
|
165
|
+
this.pinQueue.clear();
|
|
166
|
+
await this.pinQueue.onIdle();
|
|
167
|
+
try {
|
|
168
|
+
await this.orbitdb?.stop?.();
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// ignore stop failures
|
|
172
|
+
}
|
|
243
173
|
}
|
|
244
174
|
}
|
|
245
175
|
//# sourceMappingURL=database.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,0BAA0B,MAAM,gCAAgC,CAAA;AACvE,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
2
|
export declare class MetricsServer {
|
|
3
|
+
server: http.Server | null;
|
|
4
|
+
startPromise: Promise<http.Server | null> | null;
|
|
3
5
|
constructor();
|
|
4
6
|
getMetrics(): Promise<string>;
|
|
5
7
|
start(port?: number | string): Promise<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse> | null> | null;
|
|
6
8
|
trackSync(type: string, status?: string): void;
|
|
7
9
|
startSyncTimer(type: string): (labels?: Partial<Record<"type", string | number>> | undefined) => number;
|
|
10
|
+
stop(): Promise<void>;
|
|
8
11
|
}
|
|
9
12
|
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/services/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/services/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAsBvB,qBAAa,aAAa;IACxB,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;;IAY1C,UAAU;IAIhB,KAAK,CAAC,IAAI,GAAE,MAAM,GAAG,MAAyC;IAoD9D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAY;IAI1C,cAAc,CAAC,IAAI,EAAE,MAAM;IAIrB,IAAI;CAYX"}
|
package/dist/services/metrics.js
CHANGED
|
@@ -3,6 +3,7 @@ import client from 'prom-client';
|
|
|
3
3
|
import { logger } from '@libp2p/logger';
|
|
4
4
|
const log = logger('le-space:relay');
|
|
5
5
|
let metricsInstance = null;
|
|
6
|
+
let defaultMetricsInitialized = false;
|
|
6
7
|
const syncCounter = new client.Counter({
|
|
7
8
|
name: 'orbitdb_sync_total',
|
|
8
9
|
help: 'Total number of OrbitDB synchronization operations',
|
|
@@ -15,11 +16,12 @@ const syncDurationHistogram = new client.Histogram({
|
|
|
15
16
|
buckets: [0.1, 0.5, 1, 2, 5, 10],
|
|
16
17
|
});
|
|
17
18
|
export class MetricsServer {
|
|
19
|
+
server;
|
|
20
|
+
startPromise;
|
|
18
21
|
constructor() {
|
|
22
|
+
this.server = null;
|
|
23
|
+
this.startPromise = null;
|
|
19
24
|
if (!metricsInstance) {
|
|
20
|
-
if (!client.register.getSingleMetric('process_cpu_user_seconds_total')) {
|
|
21
|
-
client.collectDefaultMetrics();
|
|
22
|
-
}
|
|
23
25
|
metricsInstance = this;
|
|
24
26
|
}
|
|
25
27
|
return metricsInstance;
|
|
@@ -32,6 +34,14 @@ export class MetricsServer {
|
|
|
32
34
|
log('Metrics server disabled (METRICS_DISABLED)');
|
|
33
35
|
return null;
|
|
34
36
|
}
|
|
37
|
+
if (this.server)
|
|
38
|
+
return Promise.resolve(this.server);
|
|
39
|
+
if (this.startPromise)
|
|
40
|
+
return this.startPromise;
|
|
41
|
+
if (!defaultMetricsInitialized && !client.register.getSingleMetric('process_cpu_user_seconds_total')) {
|
|
42
|
+
client.collectDefaultMetrics();
|
|
43
|
+
defaultMetricsInitialized = true;
|
|
44
|
+
}
|
|
35
45
|
const desiredPort = typeof port === 'string' ? Number(port) : port;
|
|
36
46
|
const createServer = () => http.createServer(async (req, res) => {
|
|
37
47
|
if (req.url === '/metrics') {
|
|
@@ -56,7 +66,12 @@ export class MetricsServer {
|
|
|
56
66
|
});
|
|
57
67
|
server.listen(p, () => resolve(server));
|
|
58
68
|
});
|
|
59
|
-
|
|
69
|
+
this.startPromise = listen(Number.isFinite(desiredPort) ? desiredPort : 9090).then((server) => {
|
|
70
|
+
this.server = server;
|
|
71
|
+
this.startPromise = null;
|
|
72
|
+
return server;
|
|
73
|
+
});
|
|
74
|
+
return this.startPromise;
|
|
60
75
|
}
|
|
61
76
|
trackSync(type, status = 'success') {
|
|
62
77
|
syncCounter.labels(type, status).inc();
|
|
@@ -64,5 +79,16 @@ export class MetricsServer {
|
|
|
64
79
|
startSyncTimer(type) {
|
|
65
80
|
return syncDurationHistogram.startTimer({ type });
|
|
66
81
|
}
|
|
82
|
+
async stop() {
|
|
83
|
+
if (this.startPromise) {
|
|
84
|
+
await this.startPromise;
|
|
85
|
+
}
|
|
86
|
+
if (!this.server)
|
|
87
|
+
return;
|
|
88
|
+
await new Promise((resolve) => {
|
|
89
|
+
this.server?.close(() => resolve());
|
|
90
|
+
});
|
|
91
|
+
this.server = null;
|
|
92
|
+
}
|
|
67
93
|
}
|
|
68
94
|
//# sourceMappingURL=metrics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/services/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;AAEpC,IAAI,eAAe,GAAyB,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/services/metrics.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orbitdb-relay-pinner",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "OrbitDB relay + pinning/sync service for Helia/libp2p stacks.",
|
|
@@ -41,6 +41,8 @@
|
|
|
41
41
|
},
|
|
42
42
|
"scripts": {
|
|
43
43
|
"build": "tsc -p tsconfig.json && node scripts/add-shebang.mjs",
|
|
44
|
+
"test": "npm run build && mocha --timeout 180000 \"test/**/*.test.mjs\"",
|
|
45
|
+
"test:integration:relay-media": "npm run build && mocha --timeout 180000 \"test/relay-media-replication.test.mjs\"",
|
|
44
46
|
"prepack": "npm run build"
|
|
45
47
|
},
|
|
46
48
|
"publishConfig": {
|
|
@@ -77,6 +79,7 @@
|
|
|
77
79
|
},
|
|
78
80
|
"devDependencies": {
|
|
79
81
|
"@types/node": "^22.13.1",
|
|
82
|
+
"mocha": "^11.7.2",
|
|
80
83
|
"typescript": "^5.8.3"
|
|
81
84
|
}
|
|
82
85
|
}
|