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 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,cAmEnE"}
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"}
@@ -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
- pubsub.addEventListener('subscription-change', (event) => {
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
- return () => cleanupFunctions.forEach((cleanup) => cleanup());
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":"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"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"AAWA,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,CAgE/E"}
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":"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"}
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
- processedDataCidsByDb: Map<string, Set<string>>;
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 shouldPinDatabase;
16
- private addCandidateCid;
17
- private shouldTreatFieldAsCid;
18
- private extractCandidateCids;
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,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAOpC;IAEF,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,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/C,OAAO,EAAE,GAAG,CAAA;IACZ,IAAI,EAAE,GAAG,CAAA;;IAaH,UAAU,CAAC,IAAI,EAAE,GAAG;IAO1B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IA0CvB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,oBAAoB;YAiCd,cAAc;YAqBd,aAAa;YAQb,mBAAmB;IAQjC,OAAO,CAAC,sBAAsB;IAqBxB,qBAAqB,CAAC,SAAS,EAAE,MAAM;CAqD9C"}
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
- processedDataCidsByDb;
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.processedDataCidsByDb = new Map();
34
- this.ipfs = null;
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
- shouldPinDatabase(dbAddress, dbName) {
43
- const rawAllowlist = process.env.PIN_DATABASE_ALLOWLIST;
44
- if (!rawAllowlist || rawAllowlist.trim() === '')
45
- return true;
46
- const allowed = rawAllowlist
47
- .split(',')
48
- .map((s) => s.trim().toLowerCase())
49
- .filter(Boolean);
50
- if (allowed.length === 0)
51
- return true;
52
- const haystack = `${dbAddress} ${dbName || ''}`.toLowerCase();
53
- return allowed.some((token) => haystack.includes(token));
54
- }
55
- addCandidateCid(candidate, out) {
56
- if (typeof candidate !== 'string')
57
- return;
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
- shouldTreatFieldAsCid(lowerKey) {
100
- return (DatabaseService.CID_FIELD_KEYS.has(lowerKey) ||
101
- lowerKey.endsWith('cid') ||
102
- lowerKey.endsWith('cids'));
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
- if (Array.isArray(value)) {
112
- for (const item of value)
113
- this.extractCandidateCids(item, out, visited);
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
- if (typeof value === 'object') {
117
- const obj = value;
118
- if (visited.has(obj))
119
- return;
120
- visited.add(obj);
121
- const idValue = typeof obj._id === 'string' ? obj._id.toLowerCase() : '';
122
- const valueIsCidById = idValue.endsWith('cid') || idValue.endsWith('cids') || idValue === 'profilepicture';
123
- for (const [key, fieldValue] of Object.entries(obj)) {
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
- else if (typeof fieldValue === 'string' && (fieldValue.includes('ipfs://') || fieldValue.includes('/ipfs/'))) {
129
- this.addCandidateCid(fieldValue, out);
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
- this.extractCandidateCids(fieldValue, out, visited);
132
- }
85
+ finally {
86
+ this.queuedImageCids.delete(imageCid);
87
+ }
88
+ })
89
+ .catch(() => {
90
+ // handled in task body
91
+ });
133
92
  }
134
93
  }
135
- async pinCidIfNeeded(dbAddress, cid) {
136
- if (!this.ipfs?.pins?.add)
137
- return;
138
- if (!this.processedDataCidsByDb.has(dbAddress))
139
- this.processedDataCidsByDb.set(dbAddress, new Set());
140
- const seen = this.processedDataCidsByDb.get(dbAddress);
141
- if (seen.has(cid))
142
- return;
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
- await this.ipfs.pins.add(CID.parse(cid));
145
- seen.add(cid);
146
- if (loggingConfig.logLevels.database) {
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
- catch (err) {
151
- if (loggingConfig.logLevels.database) {
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
- let db;
198
- if (this.openDatabases.has(dbAddress)) {
199
- db = this.openDatabases.get(dbAddress);
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
- db = await this.orbitdb.open(dbAddress);
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
- await this.processDatabasePins(dbAddress, db, records);
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":"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"}
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;AAqBvB,qBAAa,aAAa;;IAWlB,UAAU;IAIhB,KAAK,CAAC,IAAI,GAAE,MAAM,GAAG,MAAyC;IAsC9D,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAY;IAI1C,cAAc,CAAC,IAAI,EAAE,MAAM;CAG5B"}
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"}
@@ -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
- return listen(Number.isFinite(desiredPort) ? desiredPort : 9090);
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":"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"}
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",
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
  }