i2pseeds 0.1.1

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) 2025 labofsahil
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 ADDED
@@ -0,0 +1,21 @@
1
+ # su3
2
+
3
+ i2pseeds
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ bunx su3 netdb
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { greet } from 'su3';
15
+
16
+ console.log(greet('World')); // Hello, World!
17
+ ```
18
+
19
+ ## License
20
+
21
+ MIT
package/dist/cli.js ADDED
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ extractNetDb,
4
+ refreshSeeds
5
+ } from "./shared/chunk-2mehkkf3.js";
6
+
7
+ // src/cli.ts
8
+ import fs from "node:fs/promises";
9
+ import os from "node:os";
10
+ import path from "node:path";
11
+ import { fileURLToPath } from "node:url";
12
+ var __dirname2 = path.dirname(fileURLToPath(import.meta.url));
13
+ async function main() {
14
+ const args = process.argv.slice(2);
15
+ const command = args[0];
16
+ if (command !== "netdb") {
17
+ console.error("Usage: su3 netdb [--refresh]");
18
+ process.exit(1);
19
+ }
20
+ const doRefresh = args.includes("--refresh");
21
+ const bundledSeedsDir = path.join(__dirname2, "data/seeds");
22
+ const targetDir = path.join(process.cwd(), "netdb");
23
+ try {
24
+ const reseedJsonPath = path.join(__dirname2, "data/reseed.json");
25
+ let servers;
26
+ try {
27
+ servers = JSON.parse(await fs.readFile(reseedJsonPath, "utf8"));
28
+ } catch {
29
+ const fallback = path.join(__dirname2, "../src/reseed.json");
30
+ servers = JSON.parse(await fs.readFile(fallback, "utf8"));
31
+ }
32
+ let seedsDir;
33
+ if (doRefresh) {
34
+ seedsDir = await fs.mkdtemp(path.join(os.tmpdir(), "su3-refresh-"));
35
+ console.log("Downloading fresh seeds from reseed servers...");
36
+ const saved = await refreshSeeds(servers, seedsDir);
37
+ if (saved.length === 0) {
38
+ console.error("Could not download any fresh seeds. Falling back to bundled seeds.");
39
+ seedsDir = bundledSeedsDir;
40
+ } else {
41
+ console.log(`Downloaded ${saved.length} fresh .su3 files`);
42
+ }
43
+ } else {
44
+ seedsDir = bundledSeedsDir;
45
+ }
46
+ let crtDir;
47
+ try {
48
+ crtDir = path.join(__dirname2, "crt");
49
+ await fs.access(crtDir);
50
+ } catch {
51
+ crtDir = path.join(__dirname2, "../src/crt");
52
+ }
53
+ const result = await extractNetDb(seedsDir, targetDir, crtDir, servers);
54
+ console.log(`Successfully extracted ${result.count} router entries into ./netdb`);
55
+ } catch (error) {
56
+ if (error.code === "ENOENT") {
57
+ console.error("Could not find the seeds directory. Please make sure the package was installed correctly.");
58
+ } else {
59
+ console.error("Error:", error.message);
60
+ }
61
+ process.exit(1);
62
+ }
63
+ }
64
+ main().catch((error) => {
65
+ console.error(error);
66
+ process.exit(1);
67
+ });
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ 3ZUnv2ipo2fpr69NtuBnutK6gw==
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIF1zCCA7+gAwIBAgIRAMDqFR09Xuj8ZUu+oetSvAEwDQYJKoZIhvcNAQELBQAw
3
+ dTELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEeMBwGA1UE
4
+ ChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxHjAcBgNVBAMM
5
+ FWFkbWluQHN0b3JteWNsb3VkLm9yZzAeFw0yNDAxMjUxNDE1MzBaFw0zNDAxMjUx
6
+ NDE1MzBaMHUxCzAJBgNVBAYTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UECRMCWFgx
7
+ HjAcBgNVBAoTFUkyUCBBbm9ueW1vdXMgTmV0d29yazEMMAoGA1UECxMDSTJQMR4w
8
+ HAYDVQQDDBVhZG1pbkBzdG9ybXljbG91ZC5vcmcwggIiMA0GCSqGSIb3DQEBAQUA
9
+ A4ICDwAwggIKAoICAQDbGX+GikPzQXr9zvkrhfO9g0l49KHLNQhUKYqd6T+PfnGo
10
+ Fm0d3ZZVVQZ045vWgroOXDGGZZWxUIlb2inRaR2DF1TxN3pPYt59RgY9ZQ9+TL7o
11
+ isY91krCRygY8EcAmHIjlfZQ9dBVcL7CfyT0MYZA5Efee9+NDHSewTfQP9T2faIE
12
+ 83Fcyd93a2mIHYjKUbJnojng/wgsy8srbsEuuTok4MIQmDj+B5nz+za2FgI0/ydh
13
+ srlMt4aGJF4/DIem9z9d0zBCOkwrmtFIzjNF1mOSA8ES4m5YnKA/y9rZlRidLPGu
14
+ prbXhPVnqHeOnHMz2QCw1wbVo504kl0bMqyEz2tVWsO9ep7iZoQs2xkFAEaegYNT
15
+ QLUpwVGlyuq3wXXwopFRffOSimGSazICwWI6j+K0pOtgefNJaWrqKYvtkj1SbK2L
16
+ LBNUIENz6VnB7KPRckuX6zxC8PpOiBK9BcftfO+xAz/wC6qq3riBPw30KKSym0nC
17
+ Zp5KciDn4Phtw9PGq8Bkl8SyWl0jtFnfTB1tzJkisf2qKcNHaFTEe2JW763YLbh/
18
+ AU+8X8evFu40qLgvOgKoyy5DLy6i8zetX+3t9K0Fxt9+Vzzq6lm5V/RS8iIPPn+M
19
+ q1/3Z5kD0KQBG9h/Gl8BH+lB71ZxPAOZ3SMu8DJZcxBLVmDWqQPCr5CKnoz0swID
20
+ AQABo2IwYDAOBgNVHQ8BAf8EBAMCAoQwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsG
21
+ AQUFBwMBMA8GA1UdEwEB/wQFMAMBAf8wHgYDVR0OBBcEFWFkbWluQHN0b3JteWNs
22
+ b3VkLm9yZzANBgkqhkiG9w0BAQsFAAOCAgEARWOJ69vTHMneSXYscha+4Ytjg0RM
23
+ faewJNEGj8qy/Qvh9si2bWYNPRK6BlbHFS7pRYBLAnhaeLBGVv1CCR6GUMMe74zQ
24
+ UuMeAoWU6qMDmB3GfYoZJh8sIxpwHqyJeTdeccRbZ4sX4F6u3IHPXYiU/AgbYqH7
25
+ pYXQg2lCjXZYaDFAlEf5SlYUDOhhXe5kR8Edhlrsu32/JzA1DQK0JjxKCBp+DQmA
26
+ ltdOpQtAg03fHP4ssdj7VvjIDl28iIlATwBvHrdNm7T0tYWn6TWhvxbRqvfTxfaH
27
+ MvxnPdIJwNP4/9TyQkwjwHb1h+ucho3CnxI/AxspdOvT1ElMhP6Ce6rcS9pk11Rl
28
+ x0ChsqpWwDg7KYpg0qZFSKCTBp4zBq9xoMJ6BQcgMfyl736WbsCzFTEyfifp8beg
29
+ NxUa/Qk7w7cuSPGyMIKNOmOR7FLlFbtocy8sXVsUQdqnp/edelufdNe39U9uNtY6
30
+ yoXI9//Tc6NgOwy2Oyia0slZ5qHRkB7e4USXMRzJ3p4q9eCVKjAJs81Utp7O2U+9
31
+ vhbhwWP8CAnNTT1E5WS6EKtfrdqF7wjkV+noPGLDGmrXi01J1fSMAjMfVO+7/LOL
32
+ UN+G4ybKWnEhhOO27yidN8Xx6UrCS23DBlPPQAeA74dTsTExiOxf1o1EXzcQiMyO
33
+ LAj3/Ojbi1xkWhI=
34
+ -----END CERTIFICATE-----
@@ -0,0 +1,35 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
34
+ Hz8KWVkHZg==
35
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIF5jCCA86gAwIBAgIRAJS8WCPfx/2FIHXvCu2sMJEwDQYJKoZIhvcNAQELBQAw
3
+ ejELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEeMBwGA1UE
4
+ ChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxIzAhBgNVBAMM
5
+ GmRpeWFyY2lmdGNpQHByb3Rvbm1haWwuY29tMB4XDTI1MTEwODExMDAxNVoXDTM1
6
+ MTEwODExMDAxNVowejELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJ
7
+ EwJYWDEeMBwGA1UEChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJ
8
+ MlAxIzAhBgNVBAMMGmRpeWFyY2lmdGNpQHByb3Rvbm1haWwuY29tMIICIjANBgkq
9
+ hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4b1wK851e3+iJ9Efrwa0W5YdaNZfrQg/
10
+ EgMnADSDzmEbNDS/7jSSMNA3u7kuJutcVzJpRdmR4+TZOdDde3CmGSw55GnROREO
11
+ jgaJqmFPpMv1yzA1oK2yfqPoclXBgOe1lIrGAAYM8UeumV5MtuG6Vh8VOjYoO+C7
12
+ /nbkOk0kJ+kG5iXntPQeb/eXwRQwIR++t7Av6DgSjL4+KMWlUIp7WFQH7XNNfu7q
13
+ 9JOJ5YHX7CYBaCgNbwAglvyE3YSO73CJnVZUxdAfTxJe0Vn31r1FO+qMw6qa41kl
14
+ WZqULWCMTBgeynex30AGMmzFEBVb/QMMzscqTF033WM48g+DvzvxAf8qaEWwrNrH
15
+ ILCmxc8U8BHOyRzcthkCRopubQjEwd6hSHkkF67L5MNqd980u6JayAcUQxTl80vm
16
+ HLT1SzURt86qtNN7WJ9NAT20WJcHkTKodovYToDMU4v2VD/xB98VTW4+04WhL0b2
17
+ sobFglgW1TSpQP01OfUFMZYABo3I4qL8kGf0XQUW1xCu/1CB7GLmYzt3wGnwL6+5
18
+ yv/0Z69hU/23Q4yz++87Osq54xnG9fCBIUmgBXcAq15aZucadrFX5YDct56jYhDR
19
+ DnW0G7p2/qdJkUaf/tgB4t2fSq9cPTLaIqJzOpOazctT35y9NjUTNTIwyNhr3+wH
20
+ EiuZFSqZnDkCAwEAAaNnMGUwDgYDVR0PAQH/BAQDAgKEMB0GA1UdJQQWMBQGCCsG
21
+ AQUFBwMCBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCMGA1UdDgQcBBpkaXlh
22
+ cmNpZnRjaUBwcm90b25tYWlsLmNvbTANBgkqhkiG9w0BAQsFAAOCAgEAjcD4sOhq
23
+ CHuA3+ZgAsRi3mTX0+LDfa8l+cTuODlL0IsecC4y7QUu9Feq4GZ5Y1DAYrLERnmO
24
+ OkqrbN9uv4IA0mEFbcTTvIYPYvqCbSoshUgkcDpem5Zl4PIQBcMjxa6LcO+Yuff2
25
+ 6JaZJ44EsV3zq8CfqEY+wUTK54XxwBUaUqWR0E5j+jPkZflJbG2jZzAlrzEo3w18
26
+ eJSfOHXw22PZmjp5pwmEvqPguWSxGyP/BOVa7SNUlxU/VpoOhN63D6hWKHAxCGhR
27
+ hpEevBslcuN1/e8wxiATmdodrZUA2ie1Y38jmahgQKY8nB6IoGEsJAaLBiAA9KNS
28
+ uWkMncDyIMYUQaRki5WXIsthXn+pVQI6xkTWVXdLQpEhfIsBgRkXf35SqS1adIip
29
+ Mp9Yhjt0Fpfp/p9QjTYvrqgT0Mg0ch8SBSejXStJcFSt1sN6utLp1saQjKyWyIOi
30
+ vfpd+YjFRtT4tkYD4lCynEgUEmu5H4m8W16I3oSfdGeNw4j/5wy0zBP8ctwTkTyT
31
+ PUJCtBcJ13V4lmUMGFU17AaKKAL+Jyw+ibl2Blc/P3H4SQ7PlYAGrulMYYEwkk70
32
+ Uz+NAXNBatCDR/0pwaAJ8WwpBFTdBYaWPDFZDsuphd/sYdI8gkzHJ1L+2dn06hhp
33
+ jN8mFgn9cnJz2/ZgnFGEMHLFL7WctYzMhdg=
34
+ -----END CERTIFICATE-----
@@ -0,0 +1,33 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ CCOJyu3XtyzFf+tAeixOnuQ=
34
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFzTCCA7WgAwIBAgIQeUqFi0fHNQopg6BZlBLhVzANBgkqhkiG9w0BAQsFADBy
3
+ MQswCQYDVQQGEwJYWDELMAkGA1UEBxMCWFgxCzAJBgNVBAkTAlhYMR4wHAYDVQQK
4
+ ExVJMlAgQW5vbnltb3VzIE5ldHdvcmsxDDAKBgNVBAsTA0kyUDEbMBkGA1UEAwwS
5
+ aTJwLXJlc2VlZEBtazE2LmRlMB4XDTIyMDIwNTE3MzkzM1oXDTMyMDIwNTE3Mzkz
6
+ M1owcjELMAkGA1UEBhMCWFgxCzAJBgNVBAcTAlhYMQswCQYDVQQJEwJYWDEeMBwG
7
+ A1UEChMVSTJQIEFub255bW91cyBOZXR3b3JrMQwwCgYDVQQLEwNJMlAxGzAZBgNV
8
+ BAMMEmkycC1yZXNlZWRAbWsxNi5kZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
9
+ AgoCggIBAMYxs2D2xpN/8blGawvAlU9DemHIxApOEwaLNfh8aAvqEdB41NTqcx4U
10
+ H8VchSormCfkCvezuMHO+K2HX7ihEZ1v6tbr6aX6hY9UZUyDDYsKmJoB1oKEhddv
11
+ 5UYfcWPE2eSykdFsWgTQD6Z+cRQWHEoCzb7qc+Jrw6KcnHMD0VrmBrEQPzTBxMHW
12
+ 4HC97PVkSLJTDArnS6ZiX4IbWRPw/mbpJT6EoVZo8J/it0pdn/X4KodEXDcnEMSe
13
+ VRulfZH/nSmOOvKhoHPckmgz/u66BlnuSYXEIB0KfDIcAlSYiPDxGnAemTozJYXA
14
+ UVMeFMs+YE5wiPgzzu+vpC31xtZLq0gyaCfgEi1P9j2ES/8pH3Gw6W2OH4kBx+jO
15
+ TBsfI+ph6qFZ3WWT23MRVyl3ATuI/GHdczTxD9JaOn74lLI+Hnu8wXnyztVWkTMB
16
+ 4sAnzjdeHkvNDyQ10vSaN0HnGfg6zuAuUSqFQujFF8Vg8ZCcsh8GouWfzYDvi9mj
17
+ 9pfxx8v6UCC719I4J9CgFjWnn2Hqez3fO8fFulY61VPyCCZp4gKWbI2SIQP/n5gz
18
+ ecYJRrJoem+rYfEQ/fwxROsvm3fCO4D6dt7ILRuX286GDIw2qSvP1zZVAioMwSj3
19
+ 9CAjKLwD/BhTRiMOlpaVv6IWqjtevbiaIKvbHTnoxvkGsDqe3gJhAgMBAAGjXzBd
20
+ MA4GA1UdDwEB/wQEAwIChDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEw
21
+ DwYDVR0TAQH/BAUwAwEB/zAbBgNVHQ4EFAQSaTJwLXJlc2VlZEBtazE2LmRlMA0G
22
+ CSqGSIb3DQEBCwUAA4ICAQAb+x6XpJdjpVYw2bvWIUbatQJwq0YaEW5W61xGLgIG
23
+ a37oll3YZbSY9Vk+N1cE0f61L3ya4Ioz6zlH/MO2zUG/dEk8vqdgIPUYJvyF7wwF
24
+ w3/G4VMaDKOJx4bAZNmaiRFGYNhCOhCnZx6uZGrLNIJ2Dc+mflrGmGwYphtXVV3e
25
+ Iv+ki3gSRgfXuMfKi4B5bLPnz7XDe4TSmwZZSRac4ly4KqmZUyntqbilRxaGTej3
26
+ VYJ1tac8yppyk5N3VopMQNmBarNZG16wSOTD7CtKgn382jgRW8cR7BMeqhORivp0
27
+ ZnPJFhzh4uthdlPdXXo6lxfvZjfiwlDPytvEu2QBz3urTgopGqRLcTBnLucWg9li
28
+ OSy9z7hNEnIN3iIJJAwI1wBdDa7K0h3PFBbIUa7X2ybn81VeNSfO25Lo8YTZEKsc
29
+ wcThJrNV6qOQv8rM/7aXugi6+VzPlCR+18iKRbebCnlqGR2dT1zFtj3negtOkrjo
30
+ LH4H6VUr3q2Ie56IubS2hUKiUkDm0ckP3Vum35GGntyEAzl6uyog0hJFOJb3aq30
31
+ YQLzyVEOz8NnA+32oMRzJJdDxQ7pqG5fgq7EF4d++YSgEfdVXxvfgXQ6m3jAyC7Z
32
+ p/gX4rlxNsjeGU3Ds51wkmhH4IB1aSQr52PE6RaBhhh3SmADEv6S/3eGvE4F4MN5
33
+ 2Q==
34
+ -----END CERTIFICATE-----
@@ -0,0 +1,33 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ +g==
34
+ -----END CERTIFICATE-----
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ zc+BrVZOdcYPqu9iLXyRQ9JwwA==
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ gfvIm7v+cELj8a53EQY0LafzZqNC5kQAp916coU=
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,33 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ -----END CERTIFICATE-----
@@ -0,0 +1,34 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
33
+ LD8d2z2Lgg==
34
+ -----END CERTIFICATE-----
@@ -0,0 +1,32 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ DsltQfUYMT3CbQAD7ugw
32
+ -----END CERTIFICATE-----
@@ -0,0 +1,50 @@
1
+ [
2
+ {
3
+ "url": "https://reseed.sahil.world/",
4
+ "crt_file": "sahil_at_mail.i2p.crt"
5
+ },
6
+ {
7
+ "url": "https://i2p.diyarciftci.xyz/",
8
+ "crt_file": "diyarciftci_at_protonmail.com.crt"
9
+ },
10
+ {
11
+ "url": "https://coconut.incognet.io/",
12
+ "crt_file": "rambler_at_mail.i2p.crt"
13
+ },
14
+ {
15
+ "url": "https://reseed.stormycloud.org/",
16
+ "crt_file": "admin_at_stormycloud.org.crt"
17
+ },
18
+ {
19
+ "url": "https://reseed-pl.i2pd.xyz/",
20
+ "crt_file": "r4sas-reseed_at_mail.i2p.crt"
21
+ },
22
+ {
23
+ "url": "https://reseed-fr.i2pd.xyz/",
24
+ "crt_file": "r4sas-reseed_at_mail.i2p.crt"
25
+ },
26
+ {
27
+ "url": "https://www2.mk16.de/",
28
+ "crt_file": "i2p-reseed_at_mk16.de.crt"
29
+ },
30
+ {
31
+ "url": "https://reseed2.i2p.net/",
32
+ "crt_file": "echelon3_at_mail.i2p.crt"
33
+ },
34
+ {
35
+ "url": "https://reseed.diva.exchange/",
36
+ "crt_file": "reseed_at_diva.exchange.crt"
37
+ },
38
+ {
39
+ "url": "https://reseed.i2pgit.org/",
40
+ "crt_file": "hankhill19580_at_gmail.com.crt"
41
+ },
42
+ {
43
+ "url": "https://i2p.novg.net/",
44
+ "crt_file": "igor_at_novg.net.crt"
45
+ },
46
+ {
47
+ "url": "https://reseed.onion.im/",
48
+ "crt_file": "lazygravy_at_mail.i2p"
49
+ }
50
+ ]
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE HTML>
2
+ <html>
3
+ <head>
4
+ <title>coconut.incognet.io</title>
5
+ <style type="text/css">
6
+ :root{--coconut:url(data:image/webp;base64,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)}
7
+ html,body{margin:0;height:100%;overflow:hidden;background:#95877d}
8
+ body{background:var(--coconut) no-repeat center center / 200px, radial-gradient(circle at center, rgba(0,0,0,0), #95877d 45%), repeating-linear-gradient(to bottom, rgba(0,0,0,.05) 2px, rgba(255,255,255,.2) 4px), radial-gradient(circle at center, #afa49d, #776c5e);animation: ease radiate .3s 120s alternate infinite}
9
+ @keyframes radiate{from{background: var(--coconut) no-repeat center center / 200px,radial-gradient(circle at center, rgba(0,0,0,0), #95877d 45%),repeating-linear-gradient(to bottom, rgba(0,0,0,.05) 2px, rgba(255,255,255,.2) 4px), radial-gradient(circle at center, #afa49d, #776c5e)}to{background: var(--coconut) no-repeat center center / 240px,radial-gradient(circle at center, rgba(0,0,0,0), #95877d 30%),repeating-linear-gradient(to bottom, rgba(0,0,0,.05) 2px, rgba(255,255,255,.2) 4px),radial-gradient(circle at center, #afa49d, #776c5e)}}</style>
10
+ <link rel=icon href=favicon.svg>
11
+ </head>
12
+ </html>
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The magic bytes that mark the start of a ZIP file inside an SU3 container.
3
+ */
4
+ declare const ZIP_MAGIC: Buffer;
5
+ interface Su3Header {
6
+ sigType: number;
7
+ sigLength: number;
8
+ versionLength: number;
9
+ signerIdLength: number;
10
+ contentLength: number;
11
+ fileType: number;
12
+ contentType: number;
13
+ version: string;
14
+ signerId: string;
15
+ }
16
+ /**
17
+ * Parse the SU3 header from a raw buffer.
18
+ * Returns null if the buffer doesn't start with the I2Psu3 magic.
19
+ */
20
+ declare function parseSu3Header(buf: Buffer): Su3Header | null;
21
+ /**
22
+ * Maps a signer ID like "sahil@mail.i2p" to cert filename "sahil_at_mail.i2p.crt"
23
+ */
24
+ declare function signerIdToCertFile(signerId: string): string;
25
+ /**
26
+ * Verify the cryptographic signature of an SU3 file against a PEM certificate.
27
+ * Returns true if valid, false otherwise.
28
+ */
29
+ declare function verifySu3Signature(su3Buffer: Buffer, certPem: string): boolean;
30
+ /**
31
+ * Strips the SU3 header from a raw buffer and returns just the ZIP payload.
32
+ * Returns `null` if no ZIP header is found.
33
+ */
34
+ declare function extractZipFromSu3(su3Buffer: Buffer): Buffer | null;
35
+ interface ExtractResult {
36
+ /** Total number of `.dat` entries written */
37
+ count: number;
38
+ /** Base-names of the files that were written */
39
+ files: string[];
40
+ }
41
+ /**
42
+ * Extract all `routerInfo-*.dat` entries from every `.su3` file found in
43
+ * `seedsDir` into `targetDir`. When `crtDir` and `servers` are provided,
44
+ * verifies each SU3 against the cert mapped in reseed.json.
45
+ * Returns the count and list of files written.
46
+ */
47
+ declare function extractNetDb(seedsDir: string, targetDir: string, crtDir?: string, servers?: ReseedServer[]): Promise<ExtractResult>;
48
+ interface ReseedServer {
49
+ url: string;
50
+ crt_file: string;
51
+ }
52
+ /**
53
+ * Download fresh `.su3` files from reseed servers into `outputDir`.
54
+ * Uses the built-in reseed.json list or a user-supplied one.
55
+ */
56
+ declare function refreshSeeds(servers: ReseedServer[], outputDir: string, timeoutMs?: number): Promise<string[]>;
57
+ export { verifySu3Signature, signerIdToCertFile, refreshSeeds, parseSu3Header, extractZipFromSu3, extractNetDb, ZIP_MAGIC, Su3Header, ReseedServer, ExtractResult };
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ import {
2
+ ZIP_MAGIC,
3
+ extractNetDb,
4
+ extractZipFromSu3,
5
+ parseSu3Header,
6
+ refreshSeeds,
7
+ signerIdToCertFile,
8
+ verifySu3Signature
9
+ } from "./shared/chunk-2mehkkf3.js";
10
+ export {
11
+ verifySu3Signature,
12
+ signerIdToCertFile,
13
+ refreshSeeds,
14
+ parseSu3Header,
15
+ extractZipFromSu3,
16
+ extractNetDb,
17
+ ZIP_MAGIC
18
+ };
@@ -0,0 +1,174 @@
1
+ // src/index.ts
2
+ import crypto from "node:crypto";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import AdmZip from "adm-zip";
6
+ var ZIP_MAGIC = Buffer.from([80, 75, 3, 4]);
7
+ var SIG_ALGORITHMS = {
8
+ 3: "SHA256",
9
+ 4: "SHA256",
10
+ 5: "SHA384",
11
+ 6: "SHA512",
12
+ 8: "SHA512"
13
+ };
14
+ function parseSu3Header(buf) {
15
+ if (buf.length < 40)
16
+ return null;
17
+ const magic = buf.subarray(0, 6).toString("ascii");
18
+ if (magic !== "I2Psu3")
19
+ return null;
20
+ const sigType = buf.readUInt16BE(8);
21
+ const sigLength = buf.readUInt16BE(10);
22
+ const versionLength = buf[13] ?? 0;
23
+ const signerIdLength = buf[15] ?? 0;
24
+ const contentLength = buf.readUInt32BE(16) * 4294967296 + buf.readUInt32BE(20);
25
+ const fileType = buf[25] ?? 0;
26
+ const contentType = buf[27] ?? 0;
27
+ const headerEnd = 40;
28
+ const version = buf.subarray(headerEnd, headerEnd + versionLength).toString("ascii").replace(/\0/g, "");
29
+ const signerId = buf.subarray(headerEnd + versionLength, headerEnd + versionLength + signerIdLength).toString("ascii");
30
+ return {
31
+ sigType,
32
+ sigLength,
33
+ versionLength,
34
+ signerIdLength,
35
+ contentLength,
36
+ fileType,
37
+ contentType,
38
+ version,
39
+ signerId
40
+ };
41
+ }
42
+ function signerIdToCertFile(signerId) {
43
+ return `${signerId.replace("@", "_at_")}.crt`;
44
+ }
45
+ function verifySu3Signature(su3Buffer, certPem) {
46
+ const header = parseSu3Header(su3Buffer);
47
+ if (!header)
48
+ return false;
49
+ const algo = SIG_ALGORITHMS[header.sigType];
50
+ if (!algo) {
51
+ console.error(`Unknown SU3 signature type: ${header.sigType}`);
52
+ return false;
53
+ }
54
+ const contentStart = 40 + header.versionLength + header.signerIdLength;
55
+ const signedDataEnd = contentStart + header.contentLength;
56
+ const signedData = su3Buffer.subarray(0, signedDataEnd);
57
+ const signature = su3Buffer.subarray(signedDataEnd, signedDataEnd + header.sigLength);
58
+ try {
59
+ const verifier = crypto.createVerify(algo);
60
+ verifier.update(signedData);
61
+ return verifier.verify(certPem, signature);
62
+ } catch (err) {
63
+ console.error("Signature verification error:", err);
64
+ return false;
65
+ }
66
+ }
67
+ function extractZipFromSu3(su3Buffer) {
68
+ const idx = su3Buffer.indexOf(ZIP_MAGIC);
69
+ if (idx === -1)
70
+ return null;
71
+ return su3Buffer.subarray(idx);
72
+ }
73
+ async function extractNetDb(seedsDir, targetDir, crtDir, servers) {
74
+ const dirEntries = await fs.readdir(seedsDir);
75
+ const su3Files = dirEntries.filter((f) => f.endsWith(".su3"));
76
+ if (su3Files.length === 0) {
77
+ throw new Error("No seed .su3 files found in the seeds directory.");
78
+ }
79
+ await fs.mkdir(targetDir, { recursive: true });
80
+ const written = [];
81
+ for (const su3File of su3Files) {
82
+ const raw = await fs.readFile(path.join(seedsDir, su3File));
83
+ if (crtDir && servers) {
84
+ const header = parseSu3Header(raw);
85
+ if (!header) {
86
+ console.error(`Skipping ${su3File}: invalid SU3 header`);
87
+ continue;
88
+ }
89
+ const hostname = su3File.replace(/\.su3$/, "");
90
+ const server = servers.find((s) => {
91
+ try {
92
+ return new URL(s.url).hostname === hostname;
93
+ } catch {
94
+ return false;
95
+ }
96
+ });
97
+ let certFileName;
98
+ if (server) {
99
+ certFileName = server.crt_file;
100
+ if (!certFileName.endsWith(".crt")) {
101
+ certFileName = `${certFileName}.crt`;
102
+ }
103
+ } else {
104
+ certFileName = signerIdToCertFile(header.signerId);
105
+ }
106
+ let certPem;
107
+ try {
108
+ certPem = await fs.readFile(path.join(crtDir, certFileName), "utf8");
109
+ } catch {
110
+ console.error(`Skipping ${su3File}: cert not found (${certFileName})`);
111
+ continue;
112
+ }
113
+ const sigValid = verifySu3Signature(raw, certPem);
114
+ if (sigValid) {
115
+ console.log(`✓ ${su3File} verified (signer: ${header.signerId})`);
116
+ } else {
117
+ console.warn(`⚠ ${su3File}: signature mismatch (signer: ${header.signerId}) — cert may have rotated, proceeding`);
118
+ }
119
+ }
120
+ const zipPayload = extractZipFromSu3(raw);
121
+ if (!zipPayload) {
122
+ console.error(`Skipping ${su3File}: no ZIP payload found`);
123
+ continue;
124
+ }
125
+ const zip = new AdmZip(zipPayload);
126
+ for (const entry of zip.getEntries()) {
127
+ if (!entry.isDirectory && entry.entryName.endsWith(".dat")) {
128
+ const name = path.basename(entry.entryName);
129
+ const hashStart = name.indexOf("-");
130
+ const hashChar = hashStart !== -1 ? name[hashStart + 1] : undefined;
131
+ const subDir = hashChar ? `r${hashChar}` : "r0";
132
+ const fullDir = path.join(targetDir, subDir);
133
+ await fs.mkdir(fullDir, { recursive: true });
134
+ await fs.writeFile(path.join(fullDir, name), entry.getData());
135
+ written.push(path.join(subDir, name));
136
+ }
137
+ }
138
+ }
139
+ return { count: written.length, files: written };
140
+ }
141
+ async function refreshSeeds(servers, outputDir, timeoutMs = 1e4) {
142
+ await fs.mkdir(outputDir, { recursive: true });
143
+ const saved = [];
144
+ for (const { url } of servers) {
145
+ try {
146
+ const fullUrl = new URL("i2pseeds.su3", url).toString();
147
+ console.log(`Downloading ${fullUrl}...`);
148
+ const controller = new AbortController;
149
+ const timeout = setTimeout(() => {
150
+ controller.abort();
151
+ }, timeoutMs);
152
+ const response = await fetch(fullUrl, {
153
+ headers: { "User-Agent": "Wget/1.21.2" },
154
+ signal: controller.signal
155
+ });
156
+ clearTimeout(timeout);
157
+ if (!response.ok) {
158
+ console.error(`Failed to download from ${fullUrl}: ${response.statusText}`);
159
+ continue;
160
+ }
161
+ const buffer = Buffer.from(await response.arrayBuffer());
162
+ const hostname = new URL(url).hostname;
163
+ const outFile = path.join(outputDir, `${hostname}.su3`);
164
+ await fs.writeFile(outFile, buffer);
165
+ saved.push(outFile);
166
+ console.log(`Saved ${outFile}`);
167
+ } catch (error) {
168
+ console.error(`Error processing ${url}:`, error);
169
+ }
170
+ }
171
+ return saved;
172
+ }
173
+
174
+ export { ZIP_MAGIC, parseSu3Header, signerIdToCertFile, verifySu3Signature, extractZipFromSu3, extractNetDb, refreshSeeds };
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "i2pseeds",
3
+ "version": "0.1.1",
4
+ "description": "i2pseeds",
5
+ "homepage": "https://github.com/labofsahil/su3#readme",
6
+ "bugs": {
7
+ "url": "https://github.com/labofsahil/su3/issues"
8
+ },
9
+ "license": "MIT",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/labofsahil/su3.git"
16
+ },
17
+ "scripts": {
18
+ "prebuild": "bun run scripts/fetch-seeds.ts",
19
+ "build": "bunup src/index.ts src/cli.ts && cp -r data dist/data && cp -r src/crt dist/crt && cp src/reseed.json dist/data/reseed.json",
20
+ "dev": "bunup src/index.ts src/cli.ts --watch",
21
+ "lint": "biome check .",
22
+ "lint:fix": "biome check --write .",
23
+ "prepare": "bun simple-git-hooks",
24
+ "release": "bumpp --commit --push --tag",
25
+ "test": "bun test",
26
+ "test:coverage": "bun test --coverage",
27
+ "test:watch": "bun test --watch",
28
+ "type-check": "tsc --noEmit",
29
+ "migrate": "biome migrate --write"
30
+ },
31
+ "devDependencies": {
32
+ "@biomejs/biome": "^2.4.4",
33
+ "@types/adm-zip": "^0.5.7",
34
+ "@types/bun": "^1.3.9",
35
+ "@types/node": "^25.3.0",
36
+ "bumpp": "^10.4.1",
37
+ "bunup": "^0.16.29",
38
+ "simple-git-hooks": "^2.13.1",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "peerDependencies": {
42
+ "typescript": ">=4.5.0"
43
+ },
44
+ "peerDependenciesMeta": {
45
+ "typescript": {
46
+ "optional": true
47
+ }
48
+ },
49
+ "type": "module",
50
+ "bin": {
51
+ "su3": "./dist/cli.js"
52
+ },
53
+ "exports": {
54
+ ".": {
55
+ "import": {
56
+ "types": "./dist/index.d.ts",
57
+ "default": "./dist/index.js"
58
+ }
59
+ },
60
+ "./package.json": "./package.json"
61
+ },
62
+ "module": "./dist/index.js",
63
+ "simple-git-hooks": {
64
+ "pre-commit": "bun run lint && bun run type-check"
65
+ },
66
+ "types": "./dist/index.d.ts",
67
+ "dependencies": {
68
+ "adm-zip": "^0.5.16"
69
+ }
70
+ }