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 +21 -0
- package/README.md +39 -11
- package/dist/cli.js +0 -0
- package/dist/services/database.d.ts +11 -0
- package/dist/services/database.d.ts.map +1 -1
- package/dist/services/database.js +168 -1
- package/dist/services/database.js.map +1 -1
- package/package.json +23 -2
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
|
-
|
|
11
|
+
Install:
|
|
8
12
|
|
|
9
13
|
```bash
|
|
10
|
-
npm
|
|
14
|
+
npm i orbitdb-relay-pinner
|
|
11
15
|
```
|
|
12
16
|
|
|
13
17
|
Run:
|
|
14
18
|
|
|
15
19
|
```bash
|
|
16
|
-
|
|
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
|
-
|
|
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
|
-
- `
|
|
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":"
|
|
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 {
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,0BAA0B,MAAM,gCAAgC,CAAA;AACvE,OAAO,KAAK,cAAc,MAAM,kBAAkB,CAAA;
|
|
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;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,MAAM,OAAO,eAAe;IAClB,MAAM,CAAU,cAAc,GAAG,IAAI,GAAG,CAAC;QAC/C,KAAK;QACL,MAAM;QACN,SAAS;QACT,UAAU;QACV,gBAAgB;QAChB,mBAAmB;KACpB,CAAC,CAAA;IAEF,OAAO,CAAe;IACtB,iBAAiB,CAAkB;IACnC,gBAAgB,CAAkB;IAClC,YAAY,CAAkB;IAC9B,aAAa,CAAkB;IAC/B,aAAa,CAAkB;IAC/B,qBAAqB,CAA0B;IAC/C,OAAO,CAAK;IACZ,IAAI,CAAK;IAET;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,EAAE,CAAA;QAClC,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAE,CAAA;QAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAA;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAA;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAA;QAC9B,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAA;QAC9B,IAAI,CAAC,qBAAqB,GAAG,IAAI,GAAG,EAAE,CAAA;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAS;QACxB,0BAA0B,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAA;QACvE,mBAAmB,CAAC,0BAAiC,CAAC,CAAA;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAEO,iBAAiB,CAAC,SAAiB,EAAE,MAAe;QAC1D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;QACvD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,IAAI,CAAA;QAE5D,MAAM,OAAO,GAAG,YAAY;aACzB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;aAClC,MAAM,CAAC,OAAO,CAAC,CAAA;QAClB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAErC,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,CAAA;QAC7D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1D,CAAC;IAEO,eAAe,CAAC,SAAkB,EAAE,GAAgB;QAC1D,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAM;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAChC,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,IAAI,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YACtC,OAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAA;QACtE,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAA;QACpE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACrC,IAAI,CAAC,IAAI;gBAAE,SAAQ;YACnB,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,uEAAuE,CAAC,CAAC,CAAA;QACrH,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAEO,qBAAqB,CAAC,QAAgB;QAC5C,OAAO,CACL,eAAe,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC5C,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC1B,CAAA;IACH,CAAC;IAEO,oBAAoB,CAAC,KAAc,EAAE,GAAgB,EAAE,UAAU,IAAI,OAAO,EAAU;QAC5F,IAAI,KAAK,IAAI,IAAI;YAAE,OAAM;QAEzB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACvE,OAAM;QACR,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAgC,CAAA;YAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,OAAM;YAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAEhB,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;YACxE,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,gBAAgB,CAAA;YAE1G,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;gBAClC,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC;oBACrF,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBACvC,CAAC;qBAAM,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;oBAC/G,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBACvC,CAAC;gBACD,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,GAAW;QACzD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG;YAAE,OAAM;QAEjC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACpG,MAAM,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAA;QACvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAM;QAEzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YACxC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACb,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACrC,OAAO,CAAC,uBAAuB,SAAS,GAAG,EAAE,GAAG,CAAC,CAAA;YACnD,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACrC,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,0BAA0B,GAAG,QAAQ,SAAS,GAAG,EAAE,GAAG,CAAC,CAAA;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,MAAW;QACxD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;QACvC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAChD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAAiB,EAAE,EAAO,EAAE,OAAc;QAC1E,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC;YAAE,OAAM;QAExD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC;IAEO,sBAAsB,CAAC,SAAiB,EAAE,EAAO;QACvD,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE;YAAE,OAAM;QAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAM;QAC7C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC;YAAE,OAAM;QAExD,MAAM,aAAa,GAAG,KAAK,EAAE,KAAU,EAAE,EAAE;YACzC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;gBAC1C,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;YACnD,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;oBACrC,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,qCAAqC,SAAS,GAAG,EAAE,GAAG,CAAC,CAAA;gBACvE,CAAC;YACH,CAAC;QACH,CAAC,CAAA;QAED,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;QACrC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,SAAiB;QAC3C,OAAO,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QAE7D,IAAI,CAAC;YACH,IAAI,EAAO,CAAA;YACX,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACxC,CAAC;iBAAM,CAAC;gBACN,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACvC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;gBACrC,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;YAC5C,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;YACnG,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,GAAG,EAAE,CAAA;YAC9B,MAAM,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;YAEtD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,sBAAsB,EAAE,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAChF,CAAC;YAED,IAAI,YAAY,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;YACtD,IAAI,MAAM,GAAG,SAAS,CAAA;YAEtB,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1D,YAAY,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAA;gBACnC,MAAM,GAAG,OAAO,CAAA;YAClB,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvE,YAAY,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAA;gBACtC,MAAM,GAAG,UAAU,CAAA;YACrB,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACrC,YAAY,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAA;gBACnC,MAAM,GAAG,OAAO,CAAA;YAClB,CAAC;iBAAM,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtE,MAAM,GAAG,UAAU,CAAA;YACrB,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAA;YAC/B,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,CAAC,CAAA;YACrE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;YAEnD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;YAC9C,QAAQ,EAAE,CAAA;QACZ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;YAC9C,QAAQ,EAAE,CAAA;YACV,IAAI,aAAa,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;gBACrC,sCAAsC;gBACtC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orbitdb-relay-pinner",
|
|
3
|
-
"version": "0.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
|
}
|