orbitdb-relay-pinner 0.6.4 → 0.7.0
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 +45 -0
- package/dist/config/libp2p.d.ts +3 -1
- package/dist/config/libp2p.d.ts.map +1 -1
- package/dist/config/libp2p.js +2 -1
- package/dist/config/libp2p.js.map +1 -1
- package/dist/events/handlers.d.ts +1 -1
- package/dist/events/handlers.d.ts.map +1 -1
- package/dist/events/handlers.js +2 -57
- package/dist/events/handlers.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/relay.d.ts.map +1 -1
- package/dist/relay.js +12 -30
- package/dist/relay.js.map +1 -1
- package/dist/services/orbitdb-replication-service.d.ts +19 -0
- package/dist/services/orbitdb-replication-service.d.ts.map +1 -0
- package/dist/services/orbitdb-replication-service.js +232 -0
- package/dist/services/orbitdb-replication-service.js.map +1 -0
- package/docs/http-api.md +316 -0
- package/docs/libp2p-service.md +151 -0
- package/docs/nym-vpn-ports.md +44 -0
- package/docs/relay-media-pinning.md +104 -0
- package/docs/systemd-deployment.md +234 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -13,6 +13,7 @@ See `AGENTS.md` for an architecture and feature guide (entrypoints, data flow, e
|
|
|
13
13
|
|
|
14
14
|
- Relay media pinning flow: `docs/relay-media-pinning.md`
|
|
15
15
|
- HTTP API (`/health`, `/multiaddrs`, `/pinning/*`, `/ipfs/*`, `/metrics`): `docs/http-api.md`
|
|
16
|
+
- Libp2p service integration guide: `docs/libp2p-service.md`
|
|
16
17
|
|
|
17
18
|
## CLI
|
|
18
19
|
|
|
@@ -34,6 +35,50 @@ Test mode (deterministic peer id via `TEST_PRIVATE_KEY` or `RELAY_PRIV_KEY`):
|
|
|
34
35
|
orbitdb-relay-pinner --test
|
|
35
36
|
```
|
|
36
37
|
|
|
38
|
+
## Library
|
|
39
|
+
|
|
40
|
+
The package still exports `startRelay()` as the compatibility wrapper used by the CLI and the existing tests.
|
|
41
|
+
|
|
42
|
+
For a fuller install + integration walkthrough, see `docs/libp2p-service.md`.
|
|
43
|
+
|
|
44
|
+
It also exports `orbitdbReplicationService()` so the OrbitDB replication + Helia pinning logic can be mounted directly in any libp2p node:
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import { createLibp2p } from 'libp2p'
|
|
48
|
+
import { LevelDatastore } from 'datastore-level'
|
|
49
|
+
import { LevelBlockstore } from 'blockstore-level'
|
|
50
|
+
import { gossipsub } from '@chainsafe/libp2p-gossipsub'
|
|
51
|
+
import { identify } from '@libp2p/identify'
|
|
52
|
+
import { orbitdbReplicationService } from 'orbitdb-relay-pinner'
|
|
53
|
+
|
|
54
|
+
const datastore = new LevelDatastore('./tmp/ipfs/data')
|
|
55
|
+
const blockstore = new LevelBlockstore('./tmp/ipfs/blocks')
|
|
56
|
+
|
|
57
|
+
await datastore.open()
|
|
58
|
+
await blockstore.open()
|
|
59
|
+
|
|
60
|
+
const libp2p = await createLibp2p({
|
|
61
|
+
datastore,
|
|
62
|
+
services: {
|
|
63
|
+
identify: identify(),
|
|
64
|
+
pubsub: gossipsub(),
|
|
65
|
+
orbitdbReplication: orbitdbReplicationService({
|
|
66
|
+
datastore,
|
|
67
|
+
blockstore,
|
|
68
|
+
orbitdbDirectory: './tmp/orbitdb'
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
await libp2p.services.orbitdbReplication.syncAllOrbitDBRecords('/orbitdb/...')
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Notes:
|
|
77
|
+
|
|
78
|
+
- `orbitdbReplicationService()` expects caller-owned `datastore` and `blockstore`.
|
|
79
|
+
- Stopping the libp2p node stops the replication service, OrbitDB, and its Helia instance.
|
|
80
|
+
- The caller still closes `datastore` and `blockstore` after `libp2p.stop()`.
|
|
81
|
+
|
|
37
82
|
## Supported Access Controllers
|
|
38
83
|
|
|
39
84
|
`orbitdb-relay-pinner` supports the following Access Controller types when opening OrbitDB databases:
|
package/dist/config/libp2p.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { PrivateKey } from '@libp2p/interface';
|
|
2
2
|
import type { Datastore } from 'interface-datastore';
|
|
3
|
-
|
|
3
|
+
type ExtraServiceFactories = Record<string, (components: any) => unknown>;
|
|
4
|
+
export declare const createLibp2pConfig: (privateKey: PrivateKey, datastore: Datastore, extraServices?: ExtraServiceFactories) => any;
|
|
5
|
+
export {};
|
|
4
6
|
//# sourceMappingURL=libp2p.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p.d.ts","sourceRoot":"","sources":["../../src/config/libp2p.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AA2DpD,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"libp2p.d.ts","sourceRoot":"","sources":["../../src/config/libp2p.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AA2DpD,KAAK,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC,CAAA;AAEzE,eAAO,MAAM,kBAAkB,GAC7B,YAAY,UAAU,EACtB,WAAW,SAAS,EACpB,gBAAe,qBAA0B,KAkFpC,GACN,CAAA"}
|
package/dist/config/libp2p.js
CHANGED
|
@@ -54,7 +54,7 @@ function readRelayListenEnv() {
|
|
|
54
54
|
pubsubTopics,
|
|
55
55
|
};
|
|
56
56
|
}
|
|
57
|
-
export const createLibp2pConfig = (privateKey, datastore) => {
|
|
57
|
+
export const createLibp2pConfig = (privateKey, datastore, extraServices = {}) => {
|
|
58
58
|
const e = readRelayListenEnv();
|
|
59
59
|
return {
|
|
60
60
|
privateKey,
|
|
@@ -129,6 +129,7 @@ export const createLibp2pConfig = (privateKey, datastore) => {
|
|
|
129
129
|
}),
|
|
130
130
|
}),
|
|
131
131
|
keychain: keychain(),
|
|
132
|
+
...extraServices,
|
|
132
133
|
},
|
|
133
134
|
connectionGater: {
|
|
134
135
|
denyDialMultiaddr: async () => false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../src/config/libp2p.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"libp2p.js","sourceRoot":"","sources":["../../src/config/libp2p.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function setupEventHandlers(libp2p: any
|
|
1
|
+
export declare function setupEventHandlers(libp2p: 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":"
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"AAYA,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,GAAG,uBAoF7C"}
|
package/dist/events/handlers.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import PQueue from 'p-queue';
|
|
2
1
|
import { WebSocketsSecure } from '@multiformats/multiaddr-matcher';
|
|
3
|
-
import {
|
|
4
|
-
import { log, syncLog } from '../utils/logger.js';
|
|
2
|
+
import { log } from '../utils/logger.js';
|
|
5
3
|
import { loggingConfig } from '../config/logging.js';
|
|
6
4
|
import { isRelayRequireOrbitdbHeadsProtocolEnabled } from '../config/orbitdb-inbound-filter-env.js';
|
|
7
5
|
import { incRelayInboundOrbitdbHeadsReject } from '../services/metrics.js';
|
|
@@ -10,7 +8,7 @@ function remoteHasOrbitdbHeadsProtocol(protocols) {
|
|
|
10
8
|
return false;
|
|
11
9
|
return protocols.some((p) => typeof p === 'string' && p.startsWith('/orbitdb/heads/'));
|
|
12
10
|
}
|
|
13
|
-
export function setupEventHandlers(libp2p
|
|
11
|
+
export function setupEventHandlers(libp2p) {
|
|
14
12
|
const cleanupFunctions = [];
|
|
15
13
|
const certificateIntervals = new Set();
|
|
16
14
|
let isShuttingDown = false;
|
|
@@ -75,42 +73,6 @@ export function setupEventHandlers(libp2p, databaseService) {
|
|
|
75
73
|
};
|
|
76
74
|
libp2p.addEventListener('peer:disconnect', peerDisconnectHandler);
|
|
77
75
|
cleanupFunctions.push(() => libp2p.removeEventListener('peer:disconnect', peerDisconnectHandler));
|
|
78
|
-
const syncQueue = new PQueue({ concurrency: 2 });
|
|
79
|
-
const subscribedOrbitdbTopics = new Set();
|
|
80
|
-
const pubsub = libp2p.services.pubsub;
|
|
81
|
-
const ensureOrbitdbTopicSubscribed = async (topic) => {
|
|
82
|
-
if (!topic?.startsWith('/orbitdb/'))
|
|
83
|
-
return;
|
|
84
|
-
if (subscribedOrbitdbTopics.has(topic))
|
|
85
|
-
return;
|
|
86
|
-
try {
|
|
87
|
-
await pubsub.subscribe(topic);
|
|
88
|
-
subscribedOrbitdbTopics.add(topic);
|
|
89
|
-
await databaseService.prefetchManifestForLogging?.(topic);
|
|
90
|
-
{
|
|
91
|
-
const dbName = databaseService.getCachedDbName?.(topic);
|
|
92
|
-
syncLog('Explicitly subscribed relay pubsub to OrbitDB topic:', inspect(dbName ? { topic, dbName } : { topic }, { depth: null, colors: false, compact: false }));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
syncLog('Failed to subscribe relay pubsub to OrbitDB topic:', topic, error?.message || String(error));
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
const pubsubMessageHandler = (event) => {
|
|
100
|
-
if (isShuttingDown)
|
|
101
|
-
return;
|
|
102
|
-
const msg = event.detail;
|
|
103
|
-
if (typeof msg.topic === 'string' && msg.topic.startsWith('/orbitdb/')) {
|
|
104
|
-
const dbName = databaseService.getCachedDbName?.(msg.topic);
|
|
105
|
-
syncLog('Received pubsub message:', inspect(dbName ? { topic: msg.topic, dbName } : { topic: msg.topic }, { depth: null, colors: false, compact: false }));
|
|
106
|
-
}
|
|
107
|
-
if (msg.topic && msg.topic.startsWith('/orbitdb/')) {
|
|
108
|
-
syncQueue.add(() => ensureOrbitdbTopicSubscribed(msg.topic));
|
|
109
|
-
syncQueue.add(() => databaseService.syncAllOrbitDBRecords(msg.topic));
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
libp2p.services.pubsub.addEventListener('message', pubsubMessageHandler);
|
|
113
|
-
cleanupFunctions.push(() => libp2p.services.pubsub.removeEventListener('message', pubsubMessageHandler));
|
|
114
76
|
const connectionOpenHandler = async (event) => {
|
|
115
77
|
const connection = event.detail;
|
|
116
78
|
if (loggingConfig.logLevels.connection)
|
|
@@ -118,26 +80,9 @@ export function setupEventHandlers(libp2p, databaseService) {
|
|
|
118
80
|
};
|
|
119
81
|
libp2p.addEventListener('connection:open', connectionOpenHandler);
|
|
120
82
|
cleanupFunctions.push(() => libp2p.removeEventListener('connection:open', connectionOpenHandler));
|
|
121
|
-
const subscriptionChangeHandler = (event) => {
|
|
122
|
-
if (isShuttingDown)
|
|
123
|
-
return;
|
|
124
|
-
if (event.detail?.subscriptions) {
|
|
125
|
-
for (const subscription of event.detail.subscriptions) {
|
|
126
|
-
if (subscription.topic?.startsWith('/orbitdb/')) {
|
|
127
|
-
syncQueue.add(() => ensureOrbitdbTopicSubscribed(subscription.topic));
|
|
128
|
-
syncQueue.add(() => databaseService.syncAllOrbitDBRecords(subscription.topic));
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
pubsub.addEventListener('subscription-change', subscriptionChangeHandler);
|
|
134
|
-
cleanupFunctions.push(() => pubsub.removeEventListener('subscription-change', subscriptionChangeHandler));
|
|
135
83
|
return async () => {
|
|
136
84
|
isShuttingDown = true;
|
|
137
85
|
cleanupFunctions.forEach((cleanup) => cleanup());
|
|
138
|
-
syncQueue.pause();
|
|
139
|
-
syncQueue.clear();
|
|
140
|
-
await syncQueue.onIdle();
|
|
141
86
|
for (const interval of certificateIntervals) {
|
|
142
87
|
clearInterval(interval);
|
|
143
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/events/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export type { RelayOptions, RelayRuntime } from './relay.js';
|
|
2
2
|
export { startRelay } from './relay.js';
|
|
3
|
+
export type { OrbitdbReplicationServiceApi, OrbitdbReplicationServiceInit } from './services/orbitdb-replication-service.js';
|
|
4
|
+
export { orbitdbReplicationService } from './services/orbitdb-replication-service.js';
|
|
3
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvC,YAAY,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAA;AAC5H,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAA"}
|
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":"AAaA,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;AAwDD,wBAAsB,UAAU,CAAC,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,YAAY,CAAC,CAsE/E"}
|
package/dist/relay.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { createLibp2p } from 'libp2p';
|
|
2
|
-
import { createHelia } from 'helia';
|
|
3
2
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
4
3
|
import { privateKeyFromProtobuf } from '@libp2p/crypto/keys';
|
|
5
4
|
import { join } from 'node:path';
|
|
6
5
|
import { createLibp2pConfig } from './config/libp2p.js';
|
|
7
6
|
import { initializeStorage } from './services/storage.js';
|
|
8
|
-
import { DatabaseService } from './services/database.js';
|
|
9
7
|
import { MetricsServer } from './services/metrics.js';
|
|
8
|
+
import { orbitdbReplicationService } from './services/orbitdb-replication-service.js';
|
|
10
9
|
import { setupEventHandlers } from './events/handlers.js';
|
|
11
10
|
import { loggingConfig } from './config/logging.js';
|
|
12
11
|
import { headsStreamLog, log } from './utils/logger.js';
|
|
@@ -65,15 +64,19 @@ export async function startRelay(opts = {}) {
|
|
|
65
64
|
privateKey = privateKeyFromProtobuf(uint8ArrayFromString(hex, 'hex'));
|
|
66
65
|
}
|
|
67
66
|
}
|
|
68
|
-
const libp2p = await createLibp2p(createLibp2pConfig(privateKey, datastore
|
|
67
|
+
const libp2p = await createLibp2p(createLibp2pConfig(privateKey, datastore, {
|
|
68
|
+
orbitdbReplication: orbitdbReplicationService({
|
|
69
|
+
datastore,
|
|
70
|
+
blockstore,
|
|
71
|
+
orbitdbDirectory: join(storageDir, 'orbitdb'),
|
|
72
|
+
}),
|
|
73
|
+
}));
|
|
69
74
|
attachOrbitdbHeadsStreamLogging(libp2p);
|
|
70
|
-
const
|
|
71
|
-
const
|
|
72
|
-
await databaseService.initialize(ipfs, join(storageDir, 'orbitdb'));
|
|
73
|
-
const cleanupEventHandlers = await setupEventHandlers(libp2p, databaseService);
|
|
75
|
+
const orbitdbReplication = libp2p.services.orbitdbReplication;
|
|
76
|
+
const cleanupEventHandlers = await setupEventHandlers(libp2p);
|
|
74
77
|
const metricsServer = new MetricsServer({
|
|
75
78
|
getLibp2p: () => libp2p,
|
|
76
|
-
pinning:
|
|
79
|
+
pinning: orbitdbReplication.createPinningHttpHandlers(),
|
|
77
80
|
});
|
|
78
81
|
await metricsServer.start();
|
|
79
82
|
metricsServer.attachAutoTlsFromLibp2p(libp2p);
|
|
@@ -83,19 +86,12 @@ export async function startRelay(opts = {}) {
|
|
|
83
86
|
}
|
|
84
87
|
return {
|
|
85
88
|
stop: async () => {
|
|
86
|
-
databaseService.beginShutdown();
|
|
87
89
|
try {
|
|
88
90
|
await cleanupEventHandlers?.();
|
|
89
91
|
}
|
|
90
92
|
catch {
|
|
91
93
|
// ignore
|
|
92
94
|
}
|
|
93
|
-
try {
|
|
94
|
-
await databaseService.stop();
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// ignore
|
|
98
|
-
}
|
|
99
95
|
try {
|
|
100
96
|
await metricsServer.stop();
|
|
101
97
|
}
|
|
@@ -103,15 +99,7 @@ export async function startRelay(opts = {}) {
|
|
|
103
99
|
// ignore
|
|
104
100
|
}
|
|
105
101
|
try {
|
|
106
|
-
|
|
107
|
-
// @ts-expect-error helia internal store wrappers
|
|
108
|
-
await ipfs.blockstore?.child?.child?.child?.close?.();
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// ignore
|
|
112
|
-
}
|
|
113
|
-
try {
|
|
114
|
-
await ipfs.stop();
|
|
102
|
+
await libp2p.stop();
|
|
115
103
|
}
|
|
116
104
|
catch {
|
|
117
105
|
// ignore
|
|
@@ -128,12 +116,6 @@ export async function startRelay(opts = {}) {
|
|
|
128
116
|
catch {
|
|
129
117
|
// ignore
|
|
130
118
|
}
|
|
131
|
-
try {
|
|
132
|
-
await libp2p.stop();
|
|
133
|
-
}
|
|
134
|
-
catch {
|
|
135
|
-
// ignore
|
|
136
|
-
}
|
|
137
119
|
},
|
|
138
120
|
};
|
|
139
121
|
}
|
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,
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Blockstore } from 'interface-blockstore';
|
|
2
|
+
import type { Datastore } from 'interface-datastore';
|
|
3
|
+
import type { PinningHttpHandlers } from './metrics.js';
|
|
4
|
+
export type OrbitdbReplicationServiceInit = {
|
|
5
|
+
datastore: Datastore;
|
|
6
|
+
blockstore: Blockstore;
|
|
7
|
+
orbitdbDirectory?: string;
|
|
8
|
+
};
|
|
9
|
+
export interface OrbitdbReplicationServiceApi {
|
|
10
|
+
createPinningHttpHandlers(): PinningHttpHandlers;
|
|
11
|
+
syncAllOrbitDBRecords(dbAddress: string): Promise<void>;
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
afterStart?(): Promise<void>;
|
|
15
|
+
beforeStop?(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare function orbitdbReplicationService(init: OrbitdbReplicationServiceInit): (components: any) => OrbitdbReplicationServiceApi;
|
|
18
|
+
export type { PinningHttpHandlers };
|
|
19
|
+
//# sourceMappingURL=orbitdb-replication-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orbitdb-replication-service.d.ts","sourceRoot":"","sources":["../../src/services/orbitdb-replication-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAIvD,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,SAAS,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,MAAM,WAAW,4BAA4B;IAC3C,yBAAyB,IAAI,mBAAmB,CAAA;IAChD,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAoRD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,6BAA6B,IACnE,YAAY,GAAG,KAAG,4BAA4B,CAGvD;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { createHelia } from 'helia';
|
|
2
|
+
import { serviceDependencies } from '@libp2p/interface';
|
|
3
|
+
import PQueue from 'p-queue';
|
|
4
|
+
import { inspect } from 'node:util';
|
|
5
|
+
import { DatabaseService } from './database.js';
|
|
6
|
+
import { syncLog } from '../utils/logger.js';
|
|
7
|
+
function createLibp2pServiceFacade(components) {
|
|
8
|
+
const events = components.events;
|
|
9
|
+
const services = new Proxy({}, {
|
|
10
|
+
get: (_target, prop) => {
|
|
11
|
+
if (typeof prop !== 'string')
|
|
12
|
+
return undefined;
|
|
13
|
+
return components[prop];
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
const dial = async (peer, options = {}) => {
|
|
17
|
+
return await components.connectionManager.openConnection(peer, {
|
|
18
|
+
priority: 75,
|
|
19
|
+
...options,
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
peerId: components.peerId,
|
|
24
|
+
peerStore: components.peerStore,
|
|
25
|
+
contentRouting: components.contentRouting,
|
|
26
|
+
peerRouting: components.peerRouting,
|
|
27
|
+
metrics: components.metrics,
|
|
28
|
+
logger: components.logger,
|
|
29
|
+
services,
|
|
30
|
+
status: 'started',
|
|
31
|
+
isStarted: () => true,
|
|
32
|
+
addEventListener: events.addEventListener.bind(events),
|
|
33
|
+
removeEventListener: events.removeEventListener.bind(events),
|
|
34
|
+
dispatchEvent: events.dispatchEvent.bind(events),
|
|
35
|
+
safeDispatchEvent: events.safeDispatchEvent?.bind(events),
|
|
36
|
+
getConnections: (peerId) => components.connectionManager.getConnections(peerId),
|
|
37
|
+
getMultiaddrs: () => components.addressManager.getAddresses(),
|
|
38
|
+
getProtocols: () => components.registrar.getProtocols(),
|
|
39
|
+
dial,
|
|
40
|
+
dialProtocol: async (peer, protocols, options = {}) => {
|
|
41
|
+
const connection = await dial(peer, options);
|
|
42
|
+
const protocolList = Array.isArray(protocols) ? protocols : [protocols];
|
|
43
|
+
return await connection.newStream(protocolList, options);
|
|
44
|
+
},
|
|
45
|
+
hangUp: async (peer, options) => {
|
|
46
|
+
await components.connectionManager.closeConnections(peer, options);
|
|
47
|
+
},
|
|
48
|
+
handle: async (protocols, handler, options) => {
|
|
49
|
+
const protocolList = Array.isArray(protocols) ? protocols : [protocols];
|
|
50
|
+
await Promise.all(protocolList.map(async (protocol) => await components.registrar.handle(protocol, handler, options)));
|
|
51
|
+
},
|
|
52
|
+
unhandle: async (protocols, options) => {
|
|
53
|
+
const protocolList = Array.isArray(protocols) ? protocols : [protocols];
|
|
54
|
+
await Promise.all(protocolList.map(async (protocol) => await components.registrar.unhandle(protocol, options)));
|
|
55
|
+
},
|
|
56
|
+
register: async (protocol, topology, options) => {
|
|
57
|
+
return await components.registrar.register(protocol, topology, options);
|
|
58
|
+
},
|
|
59
|
+
unregister: (id) => {
|
|
60
|
+
components.registrar.unregister(id);
|
|
61
|
+
},
|
|
62
|
+
isDialable: async (multiaddr, options) => {
|
|
63
|
+
return await components.connectionManager.isDialable(multiaddr, options);
|
|
64
|
+
},
|
|
65
|
+
start: async () => { },
|
|
66
|
+
stop: async () => { },
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function setupOrbitdbReplicationHandlers(libp2p, databaseService) {
|
|
70
|
+
const syncQueue = new PQueue({ concurrency: 2 });
|
|
71
|
+
const subscribedOrbitdbTopics = new Set();
|
|
72
|
+
const pubsub = libp2p.services.pubsub;
|
|
73
|
+
let isShuttingDown = false;
|
|
74
|
+
const ensureOrbitdbTopicSubscribed = async (topic) => {
|
|
75
|
+
if (!topic?.startsWith('/orbitdb/'))
|
|
76
|
+
return;
|
|
77
|
+
if (subscribedOrbitdbTopics.has(topic))
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
await pubsub.subscribe(topic);
|
|
81
|
+
subscribedOrbitdbTopics.add(topic);
|
|
82
|
+
await databaseService.prefetchManifestForLogging(topic);
|
|
83
|
+
const dbName = databaseService.getCachedDbName(topic);
|
|
84
|
+
syncLog('Explicitly subscribed relay pubsub to OrbitDB topic:', inspect(dbName ? { topic, dbName } : { topic }, { depth: null, colors: false, compact: false }));
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
syncLog('Failed to subscribe relay pubsub to OrbitDB topic:', topic, error?.message || String(error));
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const pubsubMessageHandler = (event) => {
|
|
91
|
+
if (isShuttingDown)
|
|
92
|
+
return;
|
|
93
|
+
const msg = event.detail;
|
|
94
|
+
if (typeof msg.topic === 'string' && msg.topic.startsWith('/orbitdb/')) {
|
|
95
|
+
const dbName = databaseService.getCachedDbName(msg.topic);
|
|
96
|
+
syncLog('Received pubsub message:', inspect(dbName ? { topic: msg.topic, dbName } : { topic: msg.topic }, { depth: null, colors: false, compact: false }));
|
|
97
|
+
}
|
|
98
|
+
if (msg.topic?.startsWith('/orbitdb/')) {
|
|
99
|
+
syncQueue.add(() => ensureOrbitdbTopicSubscribed(msg.topic));
|
|
100
|
+
syncQueue.add(() => databaseService.syncAllOrbitDBRecords(msg.topic));
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const subscriptionChangeHandler = (event) => {
|
|
104
|
+
if (isShuttingDown)
|
|
105
|
+
return;
|
|
106
|
+
if (event.detail?.subscriptions) {
|
|
107
|
+
for (const subscription of event.detail.subscriptions) {
|
|
108
|
+
if (subscription.topic?.startsWith('/orbitdb/')) {
|
|
109
|
+
syncQueue.add(() => ensureOrbitdbTopicSubscribed(subscription.topic));
|
|
110
|
+
syncQueue.add(() => databaseService.syncAllOrbitDBRecords(subscription.topic));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
pubsub.addEventListener('message', pubsubMessageHandler);
|
|
116
|
+
pubsub.addEventListener('subscription-change', subscriptionChangeHandler);
|
|
117
|
+
return async () => {
|
|
118
|
+
isShuttingDown = true;
|
|
119
|
+
pubsub.removeEventListener('message', pubsubMessageHandler);
|
|
120
|
+
pubsub.removeEventListener('subscription-change', subscriptionChangeHandler);
|
|
121
|
+
syncQueue.pause();
|
|
122
|
+
syncQueue.clear();
|
|
123
|
+
await syncQueue.onIdle();
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
class OrbitdbReplicationService {
|
|
127
|
+
[serviceDependencies] = ['@libp2p/pubsub'];
|
|
128
|
+
[Symbol.toStringTag] = '@le-space/orbitdb-replication-service';
|
|
129
|
+
components;
|
|
130
|
+
init;
|
|
131
|
+
libp2p;
|
|
132
|
+
ipfs;
|
|
133
|
+
databaseService;
|
|
134
|
+
cleanupSyncHandlers;
|
|
135
|
+
started;
|
|
136
|
+
constructor(components, init) {
|
|
137
|
+
this.components = components;
|
|
138
|
+
this.init = init;
|
|
139
|
+
this.libp2p = null;
|
|
140
|
+
this.ipfs = null;
|
|
141
|
+
this.databaseService = null;
|
|
142
|
+
this.cleanupSyncHandlers = null;
|
|
143
|
+
this.started = false;
|
|
144
|
+
}
|
|
145
|
+
async start() { }
|
|
146
|
+
async afterStart() {
|
|
147
|
+
if (this.started)
|
|
148
|
+
return;
|
|
149
|
+
const libp2p = createLibp2pServiceFacade(this.components);
|
|
150
|
+
const ipfs = await createHelia({
|
|
151
|
+
libp2p: libp2p,
|
|
152
|
+
datastore: this.init.datastore,
|
|
153
|
+
blockstore: this.init.blockstore,
|
|
154
|
+
});
|
|
155
|
+
const databaseService = new DatabaseService();
|
|
156
|
+
try {
|
|
157
|
+
await databaseService.initialize(ipfs, this.init.orbitdbDirectory);
|
|
158
|
+
const cleanupSyncHandlers = setupOrbitdbReplicationHandlers(libp2p, databaseService);
|
|
159
|
+
this.libp2p = libp2p;
|
|
160
|
+
this.ipfs = ipfs;
|
|
161
|
+
this.databaseService = databaseService;
|
|
162
|
+
this.cleanupSyncHandlers = cleanupSyncHandlers;
|
|
163
|
+
this.started = true;
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
databaseService.beginShutdown();
|
|
167
|
+
try {
|
|
168
|
+
await databaseService.stop();
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// ignore cleanup failures
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
await ipfs.stop();
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// ignore cleanup failures
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async beforeStop() {
|
|
183
|
+
if (!this.started && this.databaseService == null && this.ipfs == null)
|
|
184
|
+
return;
|
|
185
|
+
const cleanupSyncHandlers = this.cleanupSyncHandlers;
|
|
186
|
+
const databaseService = this.databaseService;
|
|
187
|
+
const ipfs = this.ipfs;
|
|
188
|
+
this.started = false;
|
|
189
|
+
this.cleanupSyncHandlers = null;
|
|
190
|
+
this.databaseService = null;
|
|
191
|
+
this.ipfs = null;
|
|
192
|
+
this.libp2p = null;
|
|
193
|
+
databaseService?.beginShutdown();
|
|
194
|
+
try {
|
|
195
|
+
await cleanupSyncHandlers?.();
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// ignore cleanup failures
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
await databaseService?.stop();
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// ignore cleanup failures
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
await ipfs?.stop();
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// ignore cleanup failures
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async stop() { }
|
|
214
|
+
createPinningHttpHandlers() {
|
|
215
|
+
return this.requireDatabaseService().createPinningHttpHandlers();
|
|
216
|
+
}
|
|
217
|
+
async syncAllOrbitDBRecords(dbAddress) {
|
|
218
|
+
await this.requireDatabaseService().syncAllOrbitDBRecords(dbAddress);
|
|
219
|
+
}
|
|
220
|
+
requireDatabaseService() {
|
|
221
|
+
if (this.databaseService == null) {
|
|
222
|
+
throw new Error('OrbitDB replication service is not started');
|
|
223
|
+
}
|
|
224
|
+
return this.databaseService;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
export function orbitdbReplicationService(init) {
|
|
228
|
+
return (components) => {
|
|
229
|
+
return new OrbitdbReplicationService(components, init);
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=orbitdb-replication-service.js.map
|