orbitdb-relay-pinner 0.1.1 → 0.1.3

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Nico Krause
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -2,35 +2,63 @@
2
2
 
3
3
  OrbitDB relay + pinning/sync service used by our apps and tests.
4
4
 
5
+ ## AI Agents
6
+
7
+ See `AGENTS.md` for an architecture and feature guide (entrypoints, data flow, env vars, and extension points).
8
+
5
9
  ## CLI
6
10
 
7
- Build:
11
+ Install:
8
12
 
9
13
  ```bash
10
- npm --prefix packages/orbitdb-relay-pinner run build
14
+ npm i orbitdb-relay-pinner
11
15
  ```
12
16
 
13
17
  Run:
14
18
 
15
19
  ```bash
16
- node packages/orbitdb-relay-pinner/dist/cli.js
20
+ orbitdb-relay-pinner
17
21
  ```
18
22
 
19
- Test mode (deterministic peer id via `TEST_PRIVATE_KEY`):
23
+ Test mode (deterministic peer id via `TEST_PRIVATE_KEY` or `RELAY_PRIV_KEY`):
20
24
 
21
25
  ```bash
22
- node packages/orbitdb-relay-pinner/dist/cli.js --test
26
+ orbitdb-relay-pinner --test
23
27
  ```
24
28
 
25
- ## Why This Exists
26
-
27
- - The relay must be able to verify OrbitDB entries created by `did:key` identities.
28
- - This package registers `@orbitdb/identity-provider-did` with a `key-did-resolver` resolver before opening OrbitDB.
29
-
30
29
  ## Environment Variables (common)
31
30
 
32
31
  - `RELAY_TCP_PORT`, `RELAY_WS_PORT`, `RELAY_WEBRTC_PORT`
33
32
  - `RELAY_DISABLE_WEBRTC=true` to disable UDP `/webrtc-direct` listener in constrained environments
34
33
  - `METRICS_PORT=0` to bind metrics on an ephemeral port (avoid `EADDRINUSE`)
35
- - `TEST_PRIVATE_KEY` for `--test` runs
34
+ - `DATASTORE_PATH` or `RELAY_DATASTORE_PATH` to control where LevelDB data is stored
35
+ - `PUBSUB_TOPICS` to override pubsub peer discovery topics (default: `todo._peer-discovery._p2p._pubsub`)
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
+
39
+ ## Development
40
+
41
+ ```bash
42
+ npm i
43
+ npm run build
44
+ node dist/cli.js --test
45
+ ```
46
+
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
+ ## Docker Compose Example
59
+
60
+ See `docker-compose.example.yml` for a minimal deployment example with:
36
61
 
62
+ - persistent datastore volume (PeerId/key survives restarts)
63
+ - relay + metrics ports exposed (`9091/tcp`, `9092/tcp`, `9093/udp`, `9090/tcp`)
64
+ - WebRTC enabled and AutoTLS left enabled by default
package/dist/cli.js CHANGED
File without changes
@@ -1,14 +1,25 @@
1
1
  import { MetricsServer } from './metrics.js';
2
2
  export declare class DatabaseService {
3
+ private static readonly CID_FIELD_KEYS;
3
4
  metrics: MetricsServer;
4
5
  identityDatabases: Map<string, any>;
5
6
  databaseContexts: Map<string, any>;
6
7
  updateTimers: Map<string, any>;
7
8
  openDatabases: Map<string, any>;
8
9
  eventHandlers: Map<string, any>;
10
+ processedDataCidsByDb: Map<string, Set<string>>;
9
11
  orbitdb: any;
12
+ ipfs: any;
10
13
  constructor();
11
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;
12
23
  syncAllOrbitDBRecords(dbAddress: string): Promise<void>;
13
24
  }
14
25
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/services/database.ts"],"names":[],"mappings":"AAIA,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,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/B,OAAO,EAAE,GAAG,CAAA;;IAWN,UAAU,CAAC,IAAI,EAAE,GAAG;IAMpB,qBAAqB,CAAC,SAAS,EAAE,MAAM;CAmD9C"}
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,17 +1,28 @@
1
1
  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
+ import { CID } from 'multiformats/cid';
4
5
  import { MetricsServer } from './metrics.js';
5
- import { log, syncLog, logSyncStats } from '../utils/logger.js';
6
+ import { syncLog, logSyncStats } from '../utils/logger.js';
6
7
  import { loggingConfig } from '../config/logging.js';
7
8
  export class DatabaseService {
9
+ static CID_FIELD_KEYS = new Set([
10
+ 'cid',
11
+ 'cids',
12
+ 'mediaid',
13
+ 'mediaids',
14
+ 'profilepicture',
15
+ 'profilepicturecid',
16
+ ]);
8
17
  metrics;
9
18
  identityDatabases;
10
19
  databaseContexts;
11
20
  updateTimers;
12
21
  openDatabases;
13
22
  eventHandlers;
23
+ processedDataCidsByDb;
14
24
  orbitdb;
25
+ ipfs;
15
26
  constructor() {
16
27
  this.metrics = new MetricsServer();
17
28
  this.identityDatabases = new Map();
@@ -19,12 +30,166 @@ export class DatabaseService {
19
30
  this.updateTimers = new Map();
20
31
  this.openDatabases = new Map();
21
32
  this.eventHandlers = new Map();
33
+ this.processedDataCidsByDb = new Map();
34
+ this.ipfs = null;
22
35
  }
23
36
  async initialize(ipfs) {
24
37
  OrbitDBIdentityProviderDID.setDIDResolver(KeyDIDResolver.getResolver());
25
38
  useIdentityProvider(OrbitDBIdentityProviderDID);
39
+ this.ipfs = ipfs;
26
40
  this.orbitdb = await createOrbitDB({ ipfs });
27
41
  }
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
96
+ }
97
+ }
98
+ }
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;
110
+ }
111
+ if (Array.isArray(value)) {
112
+ for (const item of value)
113
+ this.extractCandidateCids(item, out, visited);
114
+ 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);
127
+ }
128
+ else if (typeof fieldValue === 'string' && (fieldValue.includes('ipfs://') || fieldValue.includes('/ipfs/'))) {
129
+ this.addCandidateCid(fieldValue, out);
130
+ }
131
+ this.extractCandidateCids(fieldValue, out, visited);
132
+ }
133
+ }
134
+ }
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;
143
+ 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);
148
+ }
149
+ }
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);
169
+ }
170
+ }
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
+ }
28
193
  async syncAllOrbitDBRecords(dbAddress) {
29
194
  syncLog('Starting sync for database:', dbAddress);
30
195
  const endTimer = this.metrics.startSyncTimer('all_databases');
@@ -36,9 +201,11 @@ export class DatabaseService {
36
201
  else {
37
202
  db = await this.orbitdb.open(dbAddress);
38
203
  this.openDatabases.set(dbAddress, db);
204
+ this.setupDatabaseListeners(dbAddress, db);
39
205
  }
40
206
  const previousCounts = this.identityDatabases.get(dbAddress) || { posts: 0, comments: 0, media: 0 };
41
207
  const records = await db.all();
208
+ await this.processDatabasePins(dbAddress, db, records);
42
209
  if (records.length > 0) {
43
210
  syncLog(`Sample record from ${db.name}:`, JSON.stringify(records[0], null, 2));
44
211
  }
@@ -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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"}
package/package.json CHANGED
@@ -1,16 +1,33 @@
1
1
  {
2
2
  "name": "orbitdb-relay-pinner",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "OrbitDB relay + pinning/sync service for Helia/libp2p stacks.",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/NiKrause/orbitdb-relay-pinner.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/NiKrause/orbitdb-relay-pinner/issues"
13
+ },
14
+ "homepage": "https://github.com/NiKrause/orbitdb-relay-pinner#readme",
15
+ "keywords": [
16
+ "orbitdb",
17
+ "libp2p",
18
+ "helia",
19
+ "ipfs",
20
+ "relay",
21
+ "pinning"
22
+ ],
7
23
  "license": "MIT",
8
24
  "engines": {
9
25
  "node": ">=22"
10
26
  },
11
27
  "files": [
12
28
  "dist",
13
- "README.md"
29
+ "README.md",
30
+ "LICENSE"
14
31
  ],
15
32
  "main": "./dist/index.js",
16
33
  "exports": {
@@ -26,6 +43,9 @@
26
43
  "build": "tsc -p tsconfig.json && node scripts/add-shebang.mjs",
27
44
  "prepack": "npm run build"
28
45
  },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
29
49
  "dependencies": {
30
50
  "@chainsafe/libp2p-gossipsub": "^14.1.1",
31
51
  "@chainsafe/libp2p-noise": "^16.1.3",
@@ -56,6 +76,7 @@
56
76
  "key-did-resolver": "^4.0.0"
57
77
  },
58
78
  "devDependencies": {
79
+ "@types/node": "^22.13.1",
59
80
  "typescript": "^5.8.3"
60
81
  }
61
82
  }