@peerbit/server 1.1.2 → 3.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/lib/esm/cli.js +518 -144
- package/lib/esm/cli.js.map +1 -1
- package/lib/esm/client.d.ts +11 -3
- package/lib/esm/client.js +61 -27
- package/lib/esm/client.js.map +1 -1
- package/lib/esm/config.d.ts +8 -5
- package/lib/esm/config.js +44 -19
- package/lib/esm/config.js.map +1 -1
- package/lib/esm/peerbit.d.ts +4 -0
- package/lib/esm/peerbit.js +15 -2
- package/lib/esm/peerbit.js.map +1 -1
- package/lib/esm/remotes.browser.d.ts +0 -0
- package/lib/esm/remotes.browser.js +3 -0
- package/lib/esm/remotes.browser.js.map +1 -0
- package/lib/esm/remotes.d.ts +16 -0
- package/lib/esm/remotes.js +51 -0
- package/lib/esm/remotes.js.map +1 -0
- package/lib/esm/routes.d.ts +3 -0
- package/lib/esm/routes.js +3 -0
- package/lib/esm/routes.js.map +1 -1
- package/lib/esm/server.d.ts +14 -4
- package/lib/esm/server.js +297 -144
- package/lib/esm/server.js.map +1 -1
- package/lib/esm/session.d.ts +19 -0
- package/lib/esm/session.js +49 -0
- package/lib/esm/session.js.map +1 -0
- package/lib/esm/signes-request.d.ts +5 -0
- package/lib/esm/signes-request.js +54 -0
- package/lib/esm/signes-request.js.map +1 -0
- package/lib/esm/trust.browser.d.ts +0 -0
- package/lib/esm/trust.browser.js +3 -0
- package/lib/esm/trust.browser.js.map +1 -0
- package/lib/esm/trust.d.ts +9 -0
- package/lib/esm/trust.js +36 -0
- package/lib/esm/trust.js.map +1 -0
- package/lib/esm/types.d.ts +10 -0
- package/lib/ui/assets/index-cac7195d.js +77 -0
- package/lib/ui/index.html +1 -1
- package/package.json +9 -5
- package/src/cli.ts +705 -271
- package/src/client.ts +105 -30
- package/src/config.ts +52 -25
- package/src/peerbit.ts +27 -3
- package/src/remotes.browser.ts +1 -0
- package/src/remotes.ts +63 -0
- package/src/routes.ts +3 -1
- package/src/server.ts +381 -190
- package/src/session.ts +69 -0
- package/src/signes-request.ts +84 -0
- package/src/trust.browser.ts +1 -0
- package/src/trust.ts +39 -0
- package/src/types.ts +13 -0
- package/lib/ui/assets/config.browser-4ed993c7.js +0 -1
- package/lib/ui/assets/index-a8188422.js +0 -53
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { AbstractLevel } from "abstract-level";
|
|
3
|
+
export declare class Session {
|
|
4
|
+
readonly level: AbstractLevel<string | Buffer | Uint8Array, string, Uint8Array>;
|
|
5
|
+
programs: KV;
|
|
6
|
+
imports: KV;
|
|
7
|
+
constructor(level: AbstractLevel<string | Buffer | Uint8Array, string, Uint8Array>);
|
|
8
|
+
clear(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export declare class KV {
|
|
11
|
+
readonly level: AbstractLevel<string | Buffer | Uint8Array, string, Uint8Array>;
|
|
12
|
+
constructor(level: AbstractLevel<string | Buffer | Uint8Array, string, Uint8Array>);
|
|
13
|
+
add(key: string, arg: Uint8Array): Promise<void>;
|
|
14
|
+
remove(key: string): Promise<void>;
|
|
15
|
+
all(): Promise<[string, Uint8Array][]>;
|
|
16
|
+
open(): Promise<void>;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
clear(): Promise<void>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export class Session {
|
|
2
|
+
level;
|
|
3
|
+
programs;
|
|
4
|
+
imports;
|
|
5
|
+
constructor(level) {
|
|
6
|
+
this.level = level;
|
|
7
|
+
this.imports = new KV(this.level.sublevel("imports", {
|
|
8
|
+
keyEncoding: "utf8",
|
|
9
|
+
valueEncoding: "view",
|
|
10
|
+
}));
|
|
11
|
+
this.programs = new KV(this.level.sublevel("programs", {
|
|
12
|
+
keyEncoding: "utf8",
|
|
13
|
+
valueEncoding: "view",
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
async clear() {
|
|
17
|
+
await this.imports.clear();
|
|
18
|
+
await this.programs.clear();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class KV {
|
|
22
|
+
level;
|
|
23
|
+
constructor(level) {
|
|
24
|
+
this.level = level;
|
|
25
|
+
}
|
|
26
|
+
add(key, arg) {
|
|
27
|
+
return this.level.put(key, arg);
|
|
28
|
+
}
|
|
29
|
+
remove(key) {
|
|
30
|
+
return this.level.del(key);
|
|
31
|
+
}
|
|
32
|
+
async all() {
|
|
33
|
+
const res = [];
|
|
34
|
+
for await (const [key, value] of this.level.iterator()) {
|
|
35
|
+
res.push([key, value]);
|
|
36
|
+
}
|
|
37
|
+
return res;
|
|
38
|
+
}
|
|
39
|
+
async open() {
|
|
40
|
+
await this.level.open();
|
|
41
|
+
}
|
|
42
|
+
async close() {
|
|
43
|
+
await this.level.close();
|
|
44
|
+
}
|
|
45
|
+
async clear() {
|
|
46
|
+
await this.level.clear();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,OAAO;IAIT;IAHV,QAAQ,CAAK;IACb,OAAO,CAAK;IACZ,YACU,KAIR;QAJQ,UAAK,GAAL,KAAK,CAIb;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CACpB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAqB,SAAS,EAAE;YAClD,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,MAAM;SACrB,CAAC,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,CACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAqB,UAAU,EAAE;YACnD,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,MAAM;SACrB,CAAC,CACF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACD;AAED,MAAM,OAAO,EAAE;IAEJ;IADV,YACU,KAIR;QAJQ,UAAK,GAAL,KAAK,CAIb;IACC,CAAC;IAEJ,GAAG,CAAC,GAAW,EAAE,GAAe;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG;QACR,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,IAAI,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE;YACvD,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;SACvB;QACD,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,IAAI;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK;QACV,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Identity, PublicSignKey, Ed25519PublicKey } from "@peerbit/crypto";
|
|
2
|
+
import http from "http";
|
|
3
|
+
export declare const signRequest: (headers: Record<string, string>, method: string, path: string, data: string | undefined, keypair: Identity<Ed25519PublicKey>) => Promise<void>;
|
|
4
|
+
export declare const getBody: (req: http.IncomingMessage) => Promise<string>;
|
|
5
|
+
export declare const verifyRequest: (headers: Record<string, string | string[] | undefined>, method: string, path: string, body?: string) => Promise<PublicSignKey>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SignatureWithKey, fromBase64, toBase64, verify, } from "@peerbit/crypto";
|
|
2
|
+
import { deserialize, serialize, BinaryWriter } from "@dao-xyz/borsh";
|
|
3
|
+
const SIGNATURE_KEY = "X-Peerbit-Signature";
|
|
4
|
+
const SIGNATURE_TIME_KEY = "X-Peerbit-Signature-Time";
|
|
5
|
+
export const signRequest = async (headers, method, path, data, keypair) => {
|
|
6
|
+
const sigTimestamp = Math.round(new Date().getTime() / 1000).toString();
|
|
7
|
+
const write = new BinaryWriter();
|
|
8
|
+
if (!method) {
|
|
9
|
+
throw new Error("Expecting method");
|
|
10
|
+
}
|
|
11
|
+
if (!path) {
|
|
12
|
+
throw new Error("Expecting path");
|
|
13
|
+
}
|
|
14
|
+
write.string(method.toLowerCase() + path.toLowerCase() + sigTimestamp + (data || ""));
|
|
15
|
+
const signature = await keypair.sign(write.finalize());
|
|
16
|
+
headers[SIGNATURE_TIME_KEY] = sigTimestamp;
|
|
17
|
+
headers[SIGNATURE_KEY] = toBase64(serialize(signature));
|
|
18
|
+
};
|
|
19
|
+
export const getBody = (req) => {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
let body = "";
|
|
22
|
+
req.on("data", (d) => {
|
|
23
|
+
body += d;
|
|
24
|
+
});
|
|
25
|
+
req.on("end", () => {
|
|
26
|
+
resolve(body);
|
|
27
|
+
});
|
|
28
|
+
req.on("error", (e) => reject(e));
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
export const verifyRequest = async (headers, method, path, body = "") => {
|
|
32
|
+
const timestamp = headers[SIGNATURE_TIME_KEY] || headers[SIGNATURE_TIME_KEY.toLowerCase()];
|
|
33
|
+
if (typeof timestamp !== "string") {
|
|
34
|
+
throw new Error("Unexpected timestamp type: " + typeof timestamp);
|
|
35
|
+
}
|
|
36
|
+
const write = new BinaryWriter();
|
|
37
|
+
if (!method) {
|
|
38
|
+
throw new Error("Expecting method");
|
|
39
|
+
}
|
|
40
|
+
if (!path) {
|
|
41
|
+
throw new Error("Expecting path");
|
|
42
|
+
}
|
|
43
|
+
write.string(method.toLowerCase() + path.toLowerCase() + timestamp + body);
|
|
44
|
+
const signature = headers[SIGNATURE_KEY] || headers[SIGNATURE_KEY.toLowerCase()];
|
|
45
|
+
if (typeof signature !== "string") {
|
|
46
|
+
throw new Error("Unexpected signature type: " + typeof signature);
|
|
47
|
+
}
|
|
48
|
+
const signatureWithKey = deserialize(fromBase64(signature), SignatureWithKey);
|
|
49
|
+
if (await verify(signatureWithKey, write.finalize())) {
|
|
50
|
+
return signatureWithKey.publicKey;
|
|
51
|
+
}
|
|
52
|
+
throw new Error("Invalid signature");
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=signes-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signes-request.js","sourceRoot":"","sources":["../../src/signes-request.ts"],"names":[],"mappings":"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"}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.browser.js","sourceRoot":"","sources":["../../src/trust.browser.ts"],"names":[],"mappings":";AAAA,gBAAgB"}
|
package/lib/esm/trust.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
export class Trust {
|
|
3
|
+
path;
|
|
4
|
+
trusted;
|
|
5
|
+
constructor(path) {
|
|
6
|
+
this.path = path;
|
|
7
|
+
if (fs.existsSync(path)) {
|
|
8
|
+
this.trusted = JSON.parse(fs.readFileSync(path).toString("utf-8"));
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
this.trusted = [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
save() {
|
|
15
|
+
fs.writeFileSync(this.path, JSON.stringify(this.trusted));
|
|
16
|
+
}
|
|
17
|
+
isTrusted(hashcode) {
|
|
18
|
+
return this.trusted.includes(hashcode);
|
|
19
|
+
}
|
|
20
|
+
add(key) {
|
|
21
|
+
if (this.isTrusted(key)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
this.trusted.push(key);
|
|
25
|
+
this.save();
|
|
26
|
+
}
|
|
27
|
+
remove(hashcode) {
|
|
28
|
+
const existing = this.trusted.findIndex((x) => (x = hashcode));
|
|
29
|
+
if (existing >= 0) {
|
|
30
|
+
this.trusted.splice(existing, 1);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/trust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,OAAO,KAAK;IAEI;IADb,OAAO,CAAW;IAC1B,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC3B,CAAC;SACd;aAAM;YACN,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;SAClB;IACF,CAAC;IAED,IAAI;QACH,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,SAAS,CAAC,QAAgB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,CAAC,GAAW;QACd,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;YACxB,OAAO;SACP;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,MAAM,CAAC,QAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,QAAQ,IAAI,CAAC,EAAE;YAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|
package/lib/esm/types.d.ts
CHANGED
|
@@ -5,3 +5,13 @@ export interface StartByBase64 {
|
|
|
5
5
|
base64: string;
|
|
6
6
|
}
|
|
7
7
|
export type StartProgram = StartByVariant | StartByBase64;
|
|
8
|
+
export interface InstallWithTGZ {
|
|
9
|
+
type: "tgz";
|
|
10
|
+
name: string;
|
|
11
|
+
base64: string;
|
|
12
|
+
}
|
|
13
|
+
export interface InstallWithNPM {
|
|
14
|
+
type: "npm";
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
export type InstallDependency = InstallWithTGZ | InstallWithNPM;
|