@helia/interop 3.0.1 → 4.0.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/.aegir.js +46 -0
- package/README.md +11 -0
- package/dist/src/bin.d.ts +3 -0
- package/dist/src/bin.d.ts.map +1 -0
- package/dist/src/bin.js +20 -0
- package/dist/src/bin.js.map +1 -0
- package/dist/src/car.spec.d.ts +2 -0
- package/dist/src/car.spec.d.ts.map +1 -0
- package/dist/src/car.spec.js +77 -0
- package/dist/src/car.spec.js.map +1 -0
- package/dist/src/dag-cbor.spec.d.ts +2 -0
- package/dist/src/dag-cbor.spec.d.ts.map +1 -0
- package/dist/src/dag-cbor.spec.js +49 -0
- package/dist/src/dag-cbor.spec.js.map +1 -0
- package/dist/src/dag-json.spec.d.ts +2 -0
- package/dist/src/dag-json.spec.d.ts.map +1 -0
- package/dist/src/dag-json.spec.js +49 -0
- package/dist/src/dag-json.spec.js.map +1 -0
- package/dist/src/fixtures/connect.d.ts +7 -0
- package/dist/src/fixtures/connect.d.ts.map +1 -0
- package/dist/src/fixtures/connect.js +17 -0
- package/dist/src/fixtures/connect.js.map +1 -0
- package/dist/src/fixtures/create-helia-http.d.ts +4 -0
- package/dist/src/fixtures/create-helia-http.d.ts.map +1 -0
- package/dist/src/fixtures/create-helia-http.js +7 -0
- package/dist/src/fixtures/create-helia-http.js.map +1 -0
- package/dist/src/fixtures/create-helia.browser.d.ts +6 -0
- package/dist/src/fixtures/create-helia.browser.d.ts.map +1 -0
- package/dist/src/fixtures/create-helia.browser.js +56 -0
- package/dist/src/fixtures/create-helia.browser.js.map +1 -0
- package/dist/src/fixtures/create-helia.d.ts +6 -0
- package/dist/src/fixtures/create-helia.d.ts.map +1 -0
- package/dist/src/fixtures/create-helia.js +46 -0
- package/dist/src/fixtures/create-helia.js.map +1 -0
- package/dist/src/fixtures/create-kubo.browser.d.ts +3 -0
- package/dist/src/fixtures/create-kubo.browser.d.ts.map +1 -0
- package/dist/src/fixtures/create-kubo.browser.js +30 -0
- package/dist/src/fixtures/create-kubo.browser.js.map +1 -0
- package/dist/src/fixtures/create-kubo.d.ts +3 -0
- package/dist/src/fixtures/create-kubo.d.ts.map +1 -0
- package/dist/src/fixtures/create-kubo.js +32 -0
- package/dist/src/fixtures/create-kubo.js.map +1 -0
- package/dist/src/fixtures/create-peer-ids.d.ts +14 -0
- package/dist/src/fixtures/create-peer-ids.d.ts.map +1 -0
- package/dist/src/fixtures/create-peer-ids.js +37 -0
- package/dist/src/fixtures/create-peer-ids.js.map +1 -0
- package/dist/src/fixtures/key-types.d.ts +3 -0
- package/dist/src/fixtures/key-types.d.ts.map +1 -0
- package/dist/src/fixtures/key-types.js +6 -0
- package/dist/src/fixtures/key-types.js.map +1 -0
- package/dist/src/fixtures/memory-car.d.ts +7 -0
- package/dist/src/fixtures/memory-car.d.ts.map +1 -0
- package/dist/src/fixtures/memory-car.js +26 -0
- package/dist/src/fixtures/memory-car.js.map +1 -0
- package/dist/src/fixtures/wait-for.d.ts +7 -0
- package/dist/src/fixtures/wait-for.d.ts.map +1 -0
- package/dist/src/fixtures/wait-for.js +17 -0
- package/dist/src/fixtures/wait-for.js.map +1 -0
- package/dist/src/helia-blockstore.spec.d.ts +2 -0
- package/dist/src/helia-blockstore.spec.d.ts.map +1 -0
- package/dist/src/helia-blockstore.spec.js +48 -0
- package/dist/src/helia-blockstore.spec.js.map +1 -0
- package/dist/src/helia-hashes.spec.d.ts +2 -0
- package/dist/src/helia-hashes.spec.d.ts.map +1 -0
- package/dist/src/helia-hashes.spec.js +50 -0
- package/dist/src/helia-hashes.spec.js.map +1 -0
- package/dist/src/helia-pins.spec.d.ts +2 -0
- package/dist/src/helia-pins.spec.d.ts.map +1 -0
- package/dist/src/helia-pins.spec.js +48 -0
- package/dist/src/helia-pins.spec.js.map +1 -0
- package/dist/src/index.d.ts +12 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns-http.spec.d.ts +2 -0
- package/dist/src/ipns-http.spec.d.ts.map +1 -0
- package/dist/src/ipns-http.spec.js +55 -0
- package/dist/src/ipns-http.spec.js.map +1 -0
- package/dist/src/ipns-pubsub.spec.d.ts +2 -0
- package/dist/src/ipns-pubsub.spec.d.ts.map +1 -0
- package/dist/src/ipns-pubsub.spec.js +151 -0
- package/dist/src/ipns-pubsub.spec.js.map +1 -0
- package/dist/src/ipns.spec.d.ts +2 -0
- package/dist/src/ipns.spec.d.ts.map +1 -0
- package/dist/src/ipns.spec.js +146 -0
- package/dist/src/ipns.spec.js.map +1 -0
- package/dist/src/json.spec.d.ts +2 -0
- package/dist/src/json.spec.d.ts.map +1 -0
- package/dist/src/json.spec.js +49 -0
- package/dist/src/json.spec.js.map +1 -0
- package/dist/src/mfs.spec.d.ts +2 -0
- package/dist/src/mfs.spec.d.ts.map +1 -0
- package/dist/src/mfs.spec.js +85 -0
- package/dist/src/mfs.spec.js.map +1 -0
- package/dist/src/strings.spec.d.ts +2 -0
- package/dist/src/strings.spec.d.ts.map +1 -0
- package/dist/src/strings.spec.js +51 -0
- package/dist/src/strings.spec.js.map +1 -0
- package/dist/src/unixfs-bitswap.spec.d.ts +2 -0
- package/dist/src/unixfs-bitswap.spec.d.ts.map +1 -0
- package/dist/src/unixfs-bitswap.spec.js +65 -0
- package/dist/src/unixfs-bitswap.spec.js.map +1 -0
- package/dist/src/unixfs-files.spec.d.ts +2 -0
- package/dist/src/unixfs-files.spec.d.ts.map +1 -0
- package/dist/src/unixfs-files.spec.js +69 -0
- package/dist/src/unixfs-files.spec.js.map +1 -0
- package/package.json +33 -20
- package/src/bin.ts +25 -0
- package/src/car.spec.ts +102 -0
- package/src/dag-cbor.spec.ts +65 -0
- package/src/dag-json.spec.ts +65 -0
- package/src/fixtures/connect.ts +19 -0
- package/src/fixtures/create-helia-http.ts +8 -0
- package/src/fixtures/create-helia.browser.ts +68 -0
- package/src/fixtures/create-helia.ts +55 -0
- package/src/fixtures/create-kubo.browser.ts +30 -0
- package/src/fixtures/create-kubo.ts +32 -0
- package/src/fixtures/create-peer-ids.ts +46 -0
- package/src/fixtures/key-types.ts +7 -0
- package/src/fixtures/memory-car.ts +33 -0
- package/src/fixtures/wait-for.ts +26 -0
- package/src/helia-blockstore.spec.ts +59 -0
- package/src/helia-hashes.spec.ts +61 -0
- package/src/helia-pins.spec.ts +64 -0
- package/src/index.ts +13 -0
- package/src/ipns-http.spec.ts +68 -0
- package/src/ipns-pubsub.spec.ts +187 -0
- package/src/ipns.spec.ts +183 -0
- package/src/json.spec.ts +65 -0
- package/src/mfs.spec.ts +105 -0
- package/src/strings.spec.ts +67 -0
- package/src/unixfs-bitswap.spec.ts +86 -0
- package/src/unixfs-files.spec.ts +89 -0
package/.aegir.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import getPort from 'aegir/get-port'
|
|
2
|
+
import { createServer } from 'ipfsd-ctl'
|
|
3
|
+
import * as kuboRpcClient from 'kubo-rpc-client'
|
|
4
|
+
|
|
5
|
+
/** @type {import('aegir').PartialOptions} */
|
|
6
|
+
export default {
|
|
7
|
+
test: {
|
|
8
|
+
files: './dist/src/*.spec.js',
|
|
9
|
+
before: async (options) => {
|
|
10
|
+
if (options.runner !== 'node') {
|
|
11
|
+
const ipfsdPort = await getPort()
|
|
12
|
+
const ipfsdServer = await createServer({
|
|
13
|
+
host: '127.0.0.1',
|
|
14
|
+
port: ipfsdPort
|
|
15
|
+
}, {
|
|
16
|
+
ipfsBin: (await import('kubo')).default.path(),
|
|
17
|
+
kuboRpcModule: kuboRpcClient,
|
|
18
|
+
ipfsOptions: {
|
|
19
|
+
config: {
|
|
20
|
+
Addresses: {
|
|
21
|
+
Swarm: [
|
|
22
|
+
"/ip4/0.0.0.0/tcp/0",
|
|
23
|
+
"/ip4/0.0.0.0/tcp/0/ws"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}).start()
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
env: {
|
|
32
|
+
IPFSD_SERVER: `http://127.0.0.1:${ipfsdPort}`
|
|
33
|
+
},
|
|
34
|
+
ipfsdServer
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return {}
|
|
39
|
+
},
|
|
40
|
+
after: async (options, beforeResult) => {
|
|
41
|
+
if (options.runner !== 'node') {
|
|
42
|
+
await beforeResult.ipfsdServer.stop()
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
package/README.md
CHANGED
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
|
|
12
12
|
> Interop tests for Helia
|
|
13
13
|
|
|
14
|
+
# About
|
|
15
|
+
|
|
16
|
+
Runs interop tests between Helia and Kubo.
|
|
17
|
+
|
|
18
|
+
## Example - Testing a new Kubo release
|
|
19
|
+
|
|
20
|
+
```console
|
|
21
|
+
$ npm i @helia/interop
|
|
22
|
+
$ KUBO_BINARY=/path/to/kubo helia-interop
|
|
23
|
+
```
|
|
24
|
+
|
|
14
25
|
# Install
|
|
15
26
|
|
|
16
27
|
```console
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/src/bin.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
import { spawn } from 'node:child_process';
|
|
4
|
+
import { dirname, resolve } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
// aegir should be run from `node_modules/@helia/interop`
|
|
7
|
+
const cwd = resolve(dirname(fileURLToPath(import.meta.url)), '../../');
|
|
8
|
+
const test = spawn('npx', ['aegir', 'test'], {
|
|
9
|
+
cwd
|
|
10
|
+
});
|
|
11
|
+
test.stdout.on('data', (data) => {
|
|
12
|
+
process.stdout.write(data);
|
|
13
|
+
});
|
|
14
|
+
test.stderr.on('data', (data) => {
|
|
15
|
+
process.stderr.write(data);
|
|
16
|
+
});
|
|
17
|
+
test.on('close', (code) => {
|
|
18
|
+
process.exit(code ?? 0);
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":";AACA,+BAA+B;AAE/B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AAEnC,yDAAyD;AACzD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;AAEtE,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;IAC3C,GAAG;CACJ,CAAC,CAAA;AAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;IACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;AACzB,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"car.spec.d.ts","sourceRoot":"","sources":["../../src/car.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
import { car } from '@helia/car';
|
|
3
|
+
import { unixfs } from '@helia/unixfs';
|
|
4
|
+
import { CarReader } from '@ipld/car';
|
|
5
|
+
import { expect } from 'aegir/chai';
|
|
6
|
+
import drain from 'it-drain';
|
|
7
|
+
import toBuffer from 'it-to-buffer';
|
|
8
|
+
import { CID } from 'multiformats/cid';
|
|
9
|
+
import { createHeliaNode } from './fixtures/create-helia.js';
|
|
10
|
+
import { createKuboNode } from './fixtures/create-kubo.js';
|
|
11
|
+
import { memoryCarWriter } from './fixtures/memory-car.js';
|
|
12
|
+
describe('@helia/car', () => {
|
|
13
|
+
let helia;
|
|
14
|
+
let c;
|
|
15
|
+
let u;
|
|
16
|
+
let kubo;
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
helia = await createHeliaNode();
|
|
19
|
+
c = car(helia);
|
|
20
|
+
u = unixfs(helia);
|
|
21
|
+
kubo = await createKuboNode();
|
|
22
|
+
// connect helia to kubo
|
|
23
|
+
await helia.libp2p.dial(kubo.peer.addresses);
|
|
24
|
+
});
|
|
25
|
+
afterEach(async () => {
|
|
26
|
+
if (helia != null) {
|
|
27
|
+
await helia.stop();
|
|
28
|
+
}
|
|
29
|
+
if (kubo != null) {
|
|
30
|
+
await kubo.stop();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it('should export a car from Helia, import and read the contents from kubo', async () => {
|
|
34
|
+
const chunkSize = 1024 * 1024;
|
|
35
|
+
const size = chunkSize * 10;
|
|
36
|
+
const input = [];
|
|
37
|
+
const candidate = {
|
|
38
|
+
content: (async function* () {
|
|
39
|
+
for (let i = 0; i < size; i += chunkSize) {
|
|
40
|
+
const buf = new Uint8Array(chunkSize);
|
|
41
|
+
input.push(buf);
|
|
42
|
+
yield buf;
|
|
43
|
+
}
|
|
44
|
+
}())
|
|
45
|
+
};
|
|
46
|
+
const cid = await u.addFile(candidate);
|
|
47
|
+
const writer = memoryCarWriter(cid);
|
|
48
|
+
await c.export(cid, writer);
|
|
49
|
+
const buf = await writer.bytes();
|
|
50
|
+
await drain(kubo.api.dag.import([buf]));
|
|
51
|
+
const output = [];
|
|
52
|
+
for await (const b of kubo.api.cat(cid)) {
|
|
53
|
+
output.push(b);
|
|
54
|
+
}
|
|
55
|
+
expect(toBuffer(output)).to.equalBytes(toBuffer(input));
|
|
56
|
+
});
|
|
57
|
+
it('should export a car from kubo, import and read the contents from Helia', async () => {
|
|
58
|
+
const chunkSize = 1024 * 1024;
|
|
59
|
+
const size = chunkSize * 10;
|
|
60
|
+
const input = [];
|
|
61
|
+
const candidate = {
|
|
62
|
+
content: (async function* () {
|
|
63
|
+
for (let i = 0; i < size; i += chunkSize) {
|
|
64
|
+
const buf = new Uint8Array(chunkSize);
|
|
65
|
+
input.push(buf);
|
|
66
|
+
yield buf;
|
|
67
|
+
}
|
|
68
|
+
}())
|
|
69
|
+
};
|
|
70
|
+
const { cid } = await kubo.api.add(candidate.content);
|
|
71
|
+
const bytes = await toBuffer(kubo.api.dag.export(cid));
|
|
72
|
+
const reader = await CarReader.fromBytes(bytes);
|
|
73
|
+
await c.import(reader);
|
|
74
|
+
expect(await toBuffer(u.cat(CID.parse(cid.toString())))).to.equalBytes(toBuffer(input));
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=car.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"car.spec.js","sourceRoot":"","sources":["../../src/car.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-cbor.spec.d.ts","sourceRoot":"","sources":["../../src/dag-cbor.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
import { dagCbor } from '@helia/dag-cbor';
|
|
3
|
+
import * as codec from '@ipld/dag-cbor';
|
|
4
|
+
import { expect } from 'aegir/chai';
|
|
5
|
+
import { CID } from 'multiformats/cid';
|
|
6
|
+
import { createHeliaNode } from './fixtures/create-helia.js';
|
|
7
|
+
import { createKuboNode } from './fixtures/create-kubo.js';
|
|
8
|
+
describe('@helia/dag-cbor', () => {
|
|
9
|
+
let helia;
|
|
10
|
+
let d;
|
|
11
|
+
let kubo;
|
|
12
|
+
async function expectSameCid(data, heliaOpts = {}, kuboOpts = {}) {
|
|
13
|
+
const heliaCid = await d.add(data(), heliaOpts);
|
|
14
|
+
const kuboCid = await kubo.api.dag.put(data(), kuboOpts);
|
|
15
|
+
expect(heliaCid.toString()).to.equal(kuboCid.toString());
|
|
16
|
+
}
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
helia = await createHeliaNode();
|
|
19
|
+
d = dagCbor(helia);
|
|
20
|
+
kubo = await createKuboNode();
|
|
21
|
+
await helia.libp2p.dial((await (kubo.api.id())).addresses);
|
|
22
|
+
});
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
if (helia != null) {
|
|
25
|
+
await helia.stop();
|
|
26
|
+
}
|
|
27
|
+
if (kubo != null) {
|
|
28
|
+
await kubo.stop();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it('should create the same CID for a string', async () => {
|
|
32
|
+
const candidate = () => ({ hello: 'world' });
|
|
33
|
+
await expectSameCid(candidate);
|
|
34
|
+
});
|
|
35
|
+
it('should add to helia and fetch from kubo', async () => {
|
|
36
|
+
const input = { hello: 'world' };
|
|
37
|
+
const cid = await d.add(input);
|
|
38
|
+
const block = await kubo.api.block.get(cid);
|
|
39
|
+
const output = codec.decode(block);
|
|
40
|
+
expect(output).to.deep.equal(input);
|
|
41
|
+
});
|
|
42
|
+
it('should add to kubo and fetch from helia', async () => {
|
|
43
|
+
const input = { hello: 'world' };
|
|
44
|
+
const cid = await kubo.api.block.put(codec.encode(input));
|
|
45
|
+
const output = await d.get(CID.parse(cid.toString()));
|
|
46
|
+
expect(output).to.deep.equal(input);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=dag-cbor.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-cbor.spec.js","sourceRoot":"","sources":["../../src/dag-cbor.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-json.spec.d.ts","sourceRoot":"","sources":["../../src/dag-json.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* eslint-env mocha */
|
|
2
|
+
import { dagJson } from '@helia/dag-json';
|
|
3
|
+
import { expect } from 'aegir/chai';
|
|
4
|
+
import { CID } from 'multiformats/cid';
|
|
5
|
+
import * as codec from 'multiformats/codecs/json';
|
|
6
|
+
import { createHeliaNode } from './fixtures/create-helia.js';
|
|
7
|
+
import { createKuboNode } from './fixtures/create-kubo.js';
|
|
8
|
+
describe('@helia/dag-json', () => {
|
|
9
|
+
let helia;
|
|
10
|
+
let d;
|
|
11
|
+
let kubo;
|
|
12
|
+
async function expectSameCid(data, heliaOpts = {}, kuboOpts = { format: 'dag-json' }) {
|
|
13
|
+
const heliaCid = await d.add(data(), heliaOpts);
|
|
14
|
+
const kuboCid = await kubo.api.block.put(codec.encode(data()), kuboOpts);
|
|
15
|
+
expect(heliaCid.toString()).to.equal(kuboCid.toString());
|
|
16
|
+
}
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
helia = await createHeliaNode();
|
|
19
|
+
d = dagJson(helia);
|
|
20
|
+
kubo = await createKuboNode();
|
|
21
|
+
await helia.libp2p.dial((await (kubo.api.id())).addresses);
|
|
22
|
+
});
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
if (helia != null) {
|
|
25
|
+
await helia.stop();
|
|
26
|
+
}
|
|
27
|
+
if (kubo != null) {
|
|
28
|
+
await kubo.stop();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
it('should create the same CID for a string', async () => {
|
|
32
|
+
const candidate = () => ({ hello: 'world' });
|
|
33
|
+
await expectSameCid(candidate);
|
|
34
|
+
});
|
|
35
|
+
it('should add to helia and fetch from kubo', async () => {
|
|
36
|
+
const input = { hello: 'world' };
|
|
37
|
+
const cid = await d.add(input);
|
|
38
|
+
const block = await kubo.api.block.get(cid);
|
|
39
|
+
const output = codec.decode(block);
|
|
40
|
+
expect(output).to.deep.equal(input);
|
|
41
|
+
});
|
|
42
|
+
it('should add to kubo and fetch from helia', async () => {
|
|
43
|
+
const input = { hello: 'world' };
|
|
44
|
+
const cid = await kubo.api.block.put(codec.encode(input));
|
|
45
|
+
const output = await d.get(CID.parse(cid.toString()));
|
|
46
|
+
expect(output).to.deep.equal(input);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=dag-json.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dag-json.spec.js","sourceRoot":"","sources":["../../src/dag-json.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HeliaLibp2p } from 'helia';
|
|
2
|
+
import type { Controller } from 'ipfsd-ctl';
|
|
3
|
+
/**
|
|
4
|
+
* Connect the two nodes by dialing a protocol stream
|
|
5
|
+
*/
|
|
6
|
+
export declare function connect(helia: HeliaLibp2p<any>, kubo: Controller, protocol: string): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/fixtures/connect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAE3C;;GAEG;AACH,wBAAsB,OAAO,CAAE,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWzG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { expect } from 'aegir/chai';
|
|
2
|
+
/**
|
|
3
|
+
* Connect the two nodes by dialing a protocol stream
|
|
4
|
+
*/
|
|
5
|
+
export async function connect(helia, kubo, protocol) {
|
|
6
|
+
let connected = false;
|
|
7
|
+
for (const addr of kubo.peer.addresses) {
|
|
8
|
+
try {
|
|
9
|
+
await helia.libp2p.dialProtocol(addr, protocol);
|
|
10
|
+
connected = true;
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
}
|
|
15
|
+
expect(connected).to.be.true('could not connect Helia to Kubo');
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/fixtures/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAInC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAE,KAAuB,EAAE,IAAgB,EAAE,QAAgB;IACxF,IAAI,SAAS,GAAG,KAAK,CAAA;IACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;YAC/C,SAAS,GAAG,IAAI,CAAA;YAChB,MAAK;QACP,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;IACb,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-helia-http.d.ts","sourceRoot":"","sources":["../../../src/fixtures/create-helia-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAE7C,wBAAsB,eAAe,CAAE,IAAI,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAIxF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-helia-http.js","sourceRoot":"","sources":["../../../src/fixtures/create-helia-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,WAAW,EAAsB,MAAM,aAAa,CAAA;AAGhF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAE,OAA+B,EAAE;IACtE,OAAO,WAAW,CAAC;QACjB,GAAG,IAAI;KACR,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Libp2p } from '@libp2p/interface';
|
|
2
|
+
import type { DefaultLibp2pServices, HeliaLibp2p } from 'helia';
|
|
3
|
+
import type { Libp2pOptions } from 'libp2p';
|
|
4
|
+
export declare function createHeliaNode(): Promise<HeliaLibp2p<Libp2p<DefaultLibp2pServices>>>;
|
|
5
|
+
export declare function createHeliaNode<Services extends Record<string, unknown>>(libp2pOptions: Libp2pOptions<Services>): Promise<HeliaLibp2p<Libp2p<Services & DefaultLibp2pServices>>>;
|
|
6
|
+
//# sourceMappingURL=create-helia.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-helia.browser.d.ts","sourceRoot":"","sources":["../../../src/fixtures/create-helia.browser.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAE3C,wBAAsB,eAAe,IAAK,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;AAC7F,wBAAsB,eAAe,CAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAG,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { bitswap } from '@helia/block-brokers';
|
|
2
|
+
import { ipnsValidator, ipnsSelector } from '@helia/ipns';
|
|
3
|
+
import { kadDHT, removePublicAddressesMapper } from '@libp2p/kad-dht';
|
|
4
|
+
import { webSockets } from '@libp2p/websockets';
|
|
5
|
+
import { all } from '@libp2p/websockets/filters';
|
|
6
|
+
import { sha3512 } from '@multiformats/sha3';
|
|
7
|
+
import { createHelia, libp2pDefaults } from 'helia';
|
|
8
|
+
export async function createHeliaNode(libp2pOptions) {
|
|
9
|
+
const defaults = libp2pDefaults();
|
|
10
|
+
// allow dialing insecure WebSockets
|
|
11
|
+
defaults.transports?.pop();
|
|
12
|
+
defaults.transports = [
|
|
13
|
+
...(defaults.transports ?? []),
|
|
14
|
+
webSockets({
|
|
15
|
+
filter: all
|
|
16
|
+
})
|
|
17
|
+
];
|
|
18
|
+
// allow dialing loopback
|
|
19
|
+
defaults.connectionGater = {
|
|
20
|
+
denyDialMultiaddr: () => false
|
|
21
|
+
};
|
|
22
|
+
// use LAN DHT
|
|
23
|
+
defaults.services = {
|
|
24
|
+
...(defaults.services ?? {}),
|
|
25
|
+
...(libp2pOptions?.services ?? {}),
|
|
26
|
+
dht: kadDHT({
|
|
27
|
+
validators: {
|
|
28
|
+
ipns: ipnsValidator
|
|
29
|
+
},
|
|
30
|
+
selectors: {
|
|
31
|
+
ipns: ipnsSelector
|
|
32
|
+
},
|
|
33
|
+
// skips waiting for the initial self-query to find peers
|
|
34
|
+
allowQueryWithZeroPeers: true,
|
|
35
|
+
protocol: '/ipfs/lan/kad/1.0.0',
|
|
36
|
+
peerInfoMapper: removePublicAddressesMapper,
|
|
37
|
+
clientMode: false
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
// remove bootstrappers
|
|
41
|
+
defaults.peerDiscovery = [];
|
|
42
|
+
// remove services that are not used in tests
|
|
43
|
+
delete defaults.services.autoNAT;
|
|
44
|
+
delete defaults.services.dcutr;
|
|
45
|
+
delete defaults.services.delegatedRouting;
|
|
46
|
+
return createHelia({
|
|
47
|
+
blockBrokers: [
|
|
48
|
+
bitswap()
|
|
49
|
+
],
|
|
50
|
+
libp2p: defaults,
|
|
51
|
+
hashers: [
|
|
52
|
+
sha3512
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=create-helia.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-helia.browser.js","sourceRoot":"","sources":["../../../src/fixtures/create-helia.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,4BAA4B,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAOnD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAE,aAA6B;IAClE,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAA;IAEjC,oCAAoC;IACpC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAA;IAC1B,QAAQ,CAAC,UAAU,GAAG;QACpB,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC;QAC9B,UAAU,CAAC;YACT,MAAM,EAAE,GAAG;SACZ,CAAC;KACH,CAAA;IAED,yBAAyB;IACzB,QAAQ,CAAC,eAAe,GAAG;QACzB,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;KAC/B,CAAA;IAED,cAAc;IACd,QAAQ,CAAC,QAAQ,GAAG;QAClB,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,aAAa,EAAE,QAAQ,IAAI,EAAE,CAAC;QAClC,GAAG,EAAE,MAAM,CAAC;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,aAAa;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,YAAY;aACnB;YACD,yDAAyD;YACzD,uBAAuB,EAAE,IAAI;YAE7B,QAAQ,EAAE,qBAAqB;YAC/B,cAAc,EAAE,2BAA2B;YAC3C,UAAU,EAAE,KAAK;SAClB,CAAC;KACH,CAAA;IAED,uBAAuB;IACvB,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAA;IAE3B,6CAA6C;IAC7C,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAA;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAA;IAC9B,OAAO,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAA;IAEzC,OAAO,WAAW,CAAgC;QAChD,YAAY,EAAE;YACZ,OAAO,EAAE;SACV;QACD,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,OAAO;SACR;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Libp2p } from '@libp2p/interface';
|
|
2
|
+
import type { DefaultLibp2pServices, HeliaLibp2p } from 'helia';
|
|
3
|
+
import type { Libp2pOptions } from 'libp2p';
|
|
4
|
+
export declare function createHeliaNode(): Promise<HeliaLibp2p<Libp2p<DefaultLibp2pServices>>>;
|
|
5
|
+
export declare function createHeliaNode<Services extends Record<string, unknown>>(libp2pOptions: Libp2pOptions<Services>): Promise<HeliaLibp2p<Libp2p<Services & DefaultLibp2pServices>>>;
|
|
6
|
+
//# sourceMappingURL=create-helia.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-helia.d.ts","sourceRoot":"","sources":["../../../src/fixtures/create-helia.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AAE3C,wBAAsB,eAAe,IAAK,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;AAC7F,wBAAsB,eAAe,CAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAG,aAAa,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { bitswap } from '@helia/block-brokers';
|
|
2
|
+
import { ipnsValidator, ipnsSelector } from '@helia/ipns';
|
|
3
|
+
import { kadDHT, removePublicAddressesMapper } from '@libp2p/kad-dht';
|
|
4
|
+
import { sha3512 } from '@multiformats/sha3';
|
|
5
|
+
import { createHelia, libp2pDefaults } from 'helia';
|
|
6
|
+
export async function createHeliaNode(libp2pOptions) {
|
|
7
|
+
const defaults = libp2pDefaults();
|
|
8
|
+
defaults.addresses = {
|
|
9
|
+
listen: [
|
|
10
|
+
'/ip4/0.0.0.0/tcp/0'
|
|
11
|
+
]
|
|
12
|
+
};
|
|
13
|
+
defaults.services = {
|
|
14
|
+
...(defaults.services ?? {}),
|
|
15
|
+
...(libp2pOptions?.services ?? {}),
|
|
16
|
+
dht: kadDHT({
|
|
17
|
+
validators: {
|
|
18
|
+
ipns: ipnsValidator
|
|
19
|
+
},
|
|
20
|
+
selectors: {
|
|
21
|
+
ipns: ipnsSelector
|
|
22
|
+
},
|
|
23
|
+
// skips waiting for the initial self-query to find peers
|
|
24
|
+
allowQueryWithZeroPeers: true,
|
|
25
|
+
protocol: '/ipfs/lan/kad/1.0.0',
|
|
26
|
+
peerInfoMapper: removePublicAddressesMapper,
|
|
27
|
+
clientMode: false
|
|
28
|
+
})
|
|
29
|
+
};
|
|
30
|
+
// remove bootstrappers, mdns, etc
|
|
31
|
+
defaults.peerDiscovery = [];
|
|
32
|
+
// remove services that are not used in tests
|
|
33
|
+
delete defaults.services.autoNAT;
|
|
34
|
+
delete defaults.services.dcutr;
|
|
35
|
+
delete defaults.services.delegatedRouting;
|
|
36
|
+
return createHelia({
|
|
37
|
+
blockBrokers: [
|
|
38
|
+
bitswap()
|
|
39
|
+
],
|
|
40
|
+
libp2p: defaults,
|
|
41
|
+
hashers: [
|
|
42
|
+
sha3512
|
|
43
|
+
]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=create-helia.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-helia.js","sourceRoot":"","sources":["../../../src/fixtures/create-helia.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAOnD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAE,aAA6B;IAClE,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAA;IACjC,QAAQ,CAAC,SAAS,GAAG;QACnB,MAAM,EAAE;YACN,oBAAoB;SACrB;KACF,CAAA;IACD,QAAQ,CAAC,QAAQ,GAAG;QAClB,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5B,GAAG,CAAC,aAAa,EAAE,QAAQ,IAAI,EAAE,CAAC;QAClC,GAAG,EAAE,MAAM,CAAC;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,aAAa;aACpB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,YAAY;aACnB;YACD,yDAAyD;YACzD,uBAAuB,EAAE,IAAI;YAE7B,QAAQ,EAAE,qBAAqB;YAC/B,cAAc,EAAE,2BAA2B;YAC3C,UAAU,EAAE,KAAK;SAClB,CAAC;KACH,CAAA;IAED,kCAAkC;IAClC,QAAQ,CAAC,aAAa,GAAG,EAAE,CAAA;IAE3B,6CAA6C;IAC7C,OAAO,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAA;IAChC,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAA;IAC9B,OAAO,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAA;IAEzC,OAAO,WAAW,CAAgC;QAChD,YAAY,EAAE;YACZ,OAAO,EAAE;SACV;QACD,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE;YACP,OAAO;SACR;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-kubo.browser.d.ts","sourceRoot":"","sources":["../../../src/fixtures/create-kubo.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,WAAW,CAAA;AAG7D,wBAAsB,cAAc,IAAK,OAAO,CAAC,UAAU,CAAC,CA0B3D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createController } from 'ipfsd-ctl';
|
|
2
|
+
import * as kuboRpcClient from 'kubo-rpc-client';
|
|
3
|
+
export async function createKuboNode() {
|
|
4
|
+
return createController({
|
|
5
|
+
kuboRpcModule: kuboRpcClient,
|
|
6
|
+
test: true,
|
|
7
|
+
endpoint: process.env.IPFSD_SERVER,
|
|
8
|
+
ipfsOptions: {
|
|
9
|
+
config: {
|
|
10
|
+
Addresses: {
|
|
11
|
+
Swarm: [
|
|
12
|
+
'/ip4/0.0.0.0/tcp/0',
|
|
13
|
+
'/ip4/0.0.0.0/tcp/0/ws'
|
|
14
|
+
],
|
|
15
|
+
Gateway: '/ip4/127.0.0.1/tcp/8180'
|
|
16
|
+
},
|
|
17
|
+
Gateway: {
|
|
18
|
+
NoFetch: true,
|
|
19
|
+
ExposeRoutingAPI: true,
|
|
20
|
+
HTTPHeaders: {
|
|
21
|
+
'Access-Control-Allow-Origin': ['*'],
|
|
22
|
+
'Access-Control-Allow-Methods': ['GET', 'POST', 'PUT', 'OPTIONS']
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
args: ['--enable-pubsub-experiment', '--enable-namesys-pubsub']
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=create-kubo.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-kubo.browser.js","sourceRoot":"","sources":["../../../src/fixtures/create-kubo.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,gBAAgB,CAAC;QACtB,aAAa,EAAE,aAAa;QAC5B,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;QAClC,WAAW,EAAE;YACX,MAAM,EAAE;gBACN,SAAS,EAAE;oBACT,KAAK,EAAE;wBACL,oBAAoB;wBACpB,uBAAuB;qBACxB;oBACD,OAAO,EAAE,yBAAyB;iBACnC;gBACD,OAAO,EAAE;oBACP,OAAO,EAAE,IAAI;oBACb,gBAAgB,EAAE,IAAI;oBACtB,WAAW,EAAE;wBACX,6BAA6B,EAAE,CAAC,GAAG,CAAC;wBACpC,8BAA8B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;qBAClE;iBACF;aACF;SACF;QACD,IAAI,EAAE,CAAC,4BAA4B,EAAE,yBAAyB,CAAC;KAChE,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-kubo.d.ts","sourceRoot":"","sources":["../../../src/fixtures/create-kubo.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAA;AAI7D,wBAAsB,cAAc,IAAK,OAAO,CAAC,UAAU,CAAC,CA0B3D"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-ts-comment,@typescript-eslint/prefer-ts-expect-error */
|
|
2
|
+
import { createController } from 'ipfsd-ctl';
|
|
3
|
+
import { path as kuboPath } from 'kubo';
|
|
4
|
+
import * as kuboRpcClient from 'kubo-rpc-client';
|
|
5
|
+
export async function createKuboNode() {
|
|
6
|
+
return createController({
|
|
7
|
+
kuboRpcModule: kuboRpcClient,
|
|
8
|
+
ipfsBin: kuboPath(),
|
|
9
|
+
test: true,
|
|
10
|
+
ipfsOptions: {
|
|
11
|
+
config: {
|
|
12
|
+
Addresses: {
|
|
13
|
+
Swarm: [
|
|
14
|
+
'/ip4/0.0.0.0/tcp/4001',
|
|
15
|
+
'/ip4/0.0.0.0/tcp/4002/ws'
|
|
16
|
+
],
|
|
17
|
+
Gateway: '/ip4/127.0.0.1/tcp/8180'
|
|
18
|
+
},
|
|
19
|
+
Gateway: {
|
|
20
|
+
NoFetch: true,
|
|
21
|
+
ExposeRoutingAPI: true,
|
|
22
|
+
HTTPHeaders: {
|
|
23
|
+
'Access-Control-Allow-Origin': ['*'],
|
|
24
|
+
'Access-Control-Allow-Methods': ['GET', 'POST', 'PUT', 'OPTIONS']
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
args: ['--enable-pubsub-experiment', '--enable-namesys-pubsub']
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=create-kubo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-kubo.js","sourceRoot":"","sources":["../../../src/fixtures/create-kubo.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,EAAE,gBAAgB,EAAmB,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,MAAM,CAAA;AACvC,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAA;AAEhD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,gBAAgB,CAAC;QACtB,aAAa,EAAE,aAAa;QAC5B,OAAO,EAAE,QAAQ,EAAE;QACnB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE;YACX,MAAM,EAAE;gBACN,SAAS,EAAE;oBACT,KAAK,EAAE;wBACL,uBAAuB;wBACvB,0BAA0B;qBAC3B;oBACD,OAAO,EAAE,yBAAyB;iBACnC;gBACD,OAAO,EAAE;oBACP,OAAO,EAAE,IAAI;oBACb,gBAAgB,EAAE,IAAI;oBACtB,WAAW,EAAE;wBACX,6BAA6B,EAAE,CAAC,GAAG,CAAC;wBACpC,8BAA8B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;qBAClE;iBACF;aACF;SACF;QACD,IAAI,EAAE,CAAC,4BAA4B,EAAE,yBAAyB,CAAC;KAChE,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PeerId } from '@libp2p/interface';
|
|
2
|
+
/**
|
|
3
|
+
* Sort peers by distance to the KadID of the passed buffer
|
|
4
|
+
*/
|
|
5
|
+
export declare function sortClosestPeers(buf: Uint8Array, peers: PeerId[]): Promise<PeerId[]>;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a DHT ID by hashing a Peer ID
|
|
8
|
+
*/
|
|
9
|
+
export declare function convertPeerId(peerId: PeerId): Promise<Uint8Array>;
|
|
10
|
+
/**
|
|
11
|
+
* Creates a DHT ID by hashing a given Uint8Array
|
|
12
|
+
*/
|
|
13
|
+
export declare function convertBuffer(buf: Uint8Array): Promise<Uint8Array>;
|
|
14
|
+
//# sourceMappingURL=create-peer-ids.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-peer-ids.d.ts","sourceRoot":"","sources":["../../../src/fixtures/create-peer-ids.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;GAEG;AACH,wBAAsB,gBAAgB,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAmB3F;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAExE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAIzE"}
|