wao 0.19.0 → 0.19.2
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/cjs/cli.js +30 -8
- package/cjs/hub/bundler.js +236 -0
- package/cjs/hub/cu.js +138 -0
- package/cjs/hub/fs.js +150 -0
- package/cjs/hub/index.js +100 -0
- package/cjs/hub/utils.js +66 -0
- package/cjs/hub/ws-proxy.js +138 -0
- package/esm/cli.js +16 -1
- package/esm/hub/bundler.js +123 -0
- package/esm/hub/cu.js +74 -0
- package/esm/hub/fs.js +155 -0
- package/esm/hub/index.js +84 -0
- package/esm/hub/utils.js +64 -0
- package/esm/hub/ws-proxy.js +67 -0
- package/esm/run.js +1 -0
- package/package.json +5 -4
package/esm/hub/fs.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import chokidar from "chokidar"
|
|
2
|
+
import { generateId } from "./utils.js"
|
|
3
|
+
import WebSocket from "ws"
|
|
4
|
+
const ws_server = new WebSocket.Server({ port: 9090 })
|
|
5
|
+
import { keys, omit, isNil, mergeLeft } from "ramda"
|
|
6
|
+
import { resolve } from "path"
|
|
7
|
+
import { writeFileSync, readFileSync } from "fs"
|
|
8
|
+
const _dir = process.argv[2] ?? "./"
|
|
9
|
+
let sus = {}
|
|
10
|
+
let cbs = {}
|
|
11
|
+
let dir = null
|
|
12
|
+
let _socket = null
|
|
13
|
+
const cwd = process.cwd()
|
|
14
|
+
ws_server.on("connection", socket => {
|
|
15
|
+
_socket = socket
|
|
16
|
+
const clientId = generateId()
|
|
17
|
+
console.log("new ws:", clientId)
|
|
18
|
+
sus[clientId] = {
|
|
19
|
+
socket,
|
|
20
|
+
su: false,
|
|
21
|
+
connections: {},
|
|
22
|
+
address: null,
|
|
23
|
+
}
|
|
24
|
+
socket.send(JSON.stringify({ type: "registered", id: clientId, dir }))
|
|
25
|
+
socket.on("message", message => {
|
|
26
|
+
const data = JSON.parse(message)
|
|
27
|
+
if (data.type === "save") {
|
|
28
|
+
writeFileSync(
|
|
29
|
+
resolve(cwd, _dir, data.path.replace(/^\//, "")),
|
|
30
|
+
data.content
|
|
31
|
+
)
|
|
32
|
+
} else if (data.type === "data") {
|
|
33
|
+
const content = readFileSync(
|
|
34
|
+
resolve(cwd, _dir, data.path.replace(/^\//, "")),
|
|
35
|
+
"utf8"
|
|
36
|
+
)
|
|
37
|
+
socket.send(
|
|
38
|
+
JSON.stringify({
|
|
39
|
+
content,
|
|
40
|
+
type: "msg",
|
|
41
|
+
path: data.path,
|
|
42
|
+
subtype: "content",
|
|
43
|
+
})
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
socket.on("close", () => {
|
|
49
|
+
console.log("ws disconnected", clientId)
|
|
50
|
+
delete sus[clientId]
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
const sendDir = () => {
|
|
54
|
+
if (_socket) {
|
|
55
|
+
_socket.send(
|
|
56
|
+
JSON.stringify({ type: "msg", subtype: "dir_change", dir: dir })
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const sendContent = (content, path) => {
|
|
61
|
+
if (_socket) {
|
|
62
|
+
_socket.send(
|
|
63
|
+
JSON.stringify({
|
|
64
|
+
content,
|
|
65
|
+
type: "msg",
|
|
66
|
+
path,
|
|
67
|
+
subtype: "content",
|
|
68
|
+
})
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
console.log("WAO FS running on port 9090")
|
|
74
|
+
const wd = resolve(cwd, _dir)
|
|
75
|
+
console.log("Directory:", wd)
|
|
76
|
+
chokidar
|
|
77
|
+
.watch(wd, {
|
|
78
|
+
ignored: (e, stats) => {
|
|
79
|
+
const _e = resolve(cwd, e)
|
|
80
|
+
return new RegExp(wd + "/node_modules").test(_e)
|
|
81
|
+
},
|
|
82
|
+
})
|
|
83
|
+
.on("change", (e, p) => {
|
|
84
|
+
const _e = resolve(cwd, e)
|
|
85
|
+
const rel = _e.replace(new RegExp(wd + "/"), "")
|
|
86
|
+
let paths = rel.split("/")
|
|
87
|
+
let _dir = dir
|
|
88
|
+
const content = readFileSync(resolve(cwd, _dir, _e), "utf8")
|
|
89
|
+
sendContent(content, e.replace(wd, ""))
|
|
90
|
+
})
|
|
91
|
+
.on("add", (e, p) => {
|
|
92
|
+
const _e = resolve(cwd, e)
|
|
93
|
+
const rel = _e.replace(new RegExp(wd + "/"), "")
|
|
94
|
+
let paths = rel.split("/")
|
|
95
|
+
let _dir = dir
|
|
96
|
+
while (paths.length > 0) {
|
|
97
|
+
const p = paths.shift()
|
|
98
|
+
if (paths.length === 0) {
|
|
99
|
+
_dir[p] = Date.now()
|
|
100
|
+
} else {
|
|
101
|
+
_dir = _dir[p]
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
sendDir()
|
|
105
|
+
})
|
|
106
|
+
.on("addDir", (e, p) => {
|
|
107
|
+
const _e = resolve(cwd, e)
|
|
108
|
+
if (_e === wd) {
|
|
109
|
+
dir = {}
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
const rel = _e.replace(new RegExp(wd + "/"), "")
|
|
113
|
+
let paths = rel.split("/")
|
|
114
|
+
let _dir = dir
|
|
115
|
+
while (paths.length > 0) {
|
|
116
|
+
const p = paths.shift()
|
|
117
|
+
_dir[p] ??= {}
|
|
118
|
+
_dir = _dir[p]
|
|
119
|
+
}
|
|
120
|
+
sendDir()
|
|
121
|
+
})
|
|
122
|
+
.on("unlink", (e, p) => {
|
|
123
|
+
const _e = resolve(cwd, e)
|
|
124
|
+
const rel = _e.replace(new RegExp(wd + "/"), "")
|
|
125
|
+
let paths = rel.split("/")
|
|
126
|
+
let _dir = dir
|
|
127
|
+
while (paths.length > 0) {
|
|
128
|
+
const p = paths.shift()
|
|
129
|
+
if (paths.length === 0) {
|
|
130
|
+
delete _dir[p]
|
|
131
|
+
} else {
|
|
132
|
+
_dir = _dir[p]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
sendDir()
|
|
136
|
+
})
|
|
137
|
+
.on("unlinkDir", (e, p) => {
|
|
138
|
+
const _e = resolve(cwd, e)
|
|
139
|
+
if (_e === wd) {
|
|
140
|
+
dir = null
|
|
141
|
+
return null
|
|
142
|
+
}
|
|
143
|
+
const rel = _e.replace(new RegExp(wd + "/"), "")
|
|
144
|
+
let paths = rel.split("/")
|
|
145
|
+
let _dir = dir
|
|
146
|
+
while (paths.length > 0) {
|
|
147
|
+
const p = paths.shift()
|
|
148
|
+
if (paths.length === 0) {
|
|
149
|
+
delete _dir[p]
|
|
150
|
+
} else {
|
|
151
|
+
_dir = _dir[p]
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
sendDir()
|
|
155
|
+
})
|
package/esm/hub/index.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import express from "express"
|
|
2
|
+
import cors from "cors"
|
|
3
|
+
import bodyParser from "body-parser"
|
|
4
|
+
import { keys, omit, isNil, mergeLeft } from "ramda"
|
|
5
|
+
import { generateId, toANS104Request, parseSignatureInput } from "./utils.js"
|
|
6
|
+
import bundler from "./bundler.js"
|
|
7
|
+
import cu from "./cu.js"
|
|
8
|
+
|
|
9
|
+
import WebSocket from "ws"
|
|
10
|
+
const ws_server = new WebSocket.Server({ port: 8080 })
|
|
11
|
+
|
|
12
|
+
let sus = {}
|
|
13
|
+
let cbs = {}
|
|
14
|
+
let hbs = {
|
|
15
|
+
O74OhzD1O_zE0uaKbaTQD1rfgTZEGMeXQ6M6M60TW_o: { update: Date.now() },
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
bundler(sus, cbs, hbs)
|
|
19
|
+
cu(sus, cbs, hbs)
|
|
20
|
+
|
|
21
|
+
ws_server.on("connection", socket => {
|
|
22
|
+
const clientId = generateId()
|
|
23
|
+
console.log("new ws:", clientId)
|
|
24
|
+
sus[clientId] = {
|
|
25
|
+
socket,
|
|
26
|
+
su: false,
|
|
27
|
+
connections: {},
|
|
28
|
+
address: null,
|
|
29
|
+
accept: {
|
|
30
|
+
pid: {},
|
|
31
|
+
hb: {},
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
socket.send(JSON.stringify({ type: "registered", id: clientId }))
|
|
35
|
+
socket.on("message", message => {
|
|
36
|
+
const data = JSON.parse(message)
|
|
37
|
+
if (data.type === "list") {
|
|
38
|
+
if (data.target === "hb") {
|
|
39
|
+
let hb = []
|
|
40
|
+
for (const k in hbs) {
|
|
41
|
+
hb.push({ address: k, update: hbs[k].update })
|
|
42
|
+
}
|
|
43
|
+
socket.send(JSON.stringify({ hb, type: "list" }))
|
|
44
|
+
} else {
|
|
45
|
+
socket.send(JSON.stringify({ error: "unknown target" }))
|
|
46
|
+
}
|
|
47
|
+
} else if (data.type === "subscribe") {
|
|
48
|
+
sus[clientId].accept = mergeLeft(data.accept, sus[clientId].accept)
|
|
49
|
+
socket.send(
|
|
50
|
+
JSON.stringify({ type: "subscribe", accept: sus[clientId].accept })
|
|
51
|
+
)
|
|
52
|
+
} else if (data.type === "msg") {
|
|
53
|
+
if (cbs[data.id]) {
|
|
54
|
+
cbs[data.id].status(data.status).send(data.msg)
|
|
55
|
+
delete cbs[data.id]
|
|
56
|
+
}
|
|
57
|
+
} else if (data.type === "register") {
|
|
58
|
+
sus[clientId].su = true
|
|
59
|
+
} else if (data.type === "sus") {
|
|
60
|
+
let keys = []
|
|
61
|
+
for (let k in sus) if (sus[k].su) keys.push(k)
|
|
62
|
+
socket.send(JSON.stringify({ type: "sus", ids: keys }))
|
|
63
|
+
} else if (data.type === "offer") {
|
|
64
|
+
sus[data.su].socket.send(
|
|
65
|
+
JSON.stringify({ type: "offer", id: clientId, offer: data.offer })
|
|
66
|
+
)
|
|
67
|
+
} else if (data.type === "answer") {
|
|
68
|
+
sus[data.client].socket.send(
|
|
69
|
+
JSON.stringify({
|
|
70
|
+
type: "answer",
|
|
71
|
+
id: data.clientId,
|
|
72
|
+
answer: data.answer,
|
|
73
|
+
})
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
socket.on("close", () => {
|
|
79
|
+
console.log("ws disconnected", clientId)
|
|
80
|
+
delete sus[clientId]
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
console.log("WAO hub running on port 8080")
|
package/esm/hub/utils.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { keys, omit, isNil } from "ramda"
|
|
2
|
+
|
|
3
|
+
function generateId() {
|
|
4
|
+
return Math.random().toString(36).substring(2, 15)
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
function toANS104Request(fields) {
|
|
8
|
+
const dataItem = {
|
|
9
|
+
target: fields.target,
|
|
10
|
+
anchor: fields.anchor ?? "",
|
|
11
|
+
tags: keys(
|
|
12
|
+
omit(
|
|
13
|
+
[
|
|
14
|
+
"Target",
|
|
15
|
+
"target",
|
|
16
|
+
"Anchor",
|
|
17
|
+
"anchor",
|
|
18
|
+
"Data",
|
|
19
|
+
"data",
|
|
20
|
+
"data-protocol",
|
|
21
|
+
"Data-Protocol",
|
|
22
|
+
"variant",
|
|
23
|
+
"Variant",
|
|
24
|
+
"dryrun",
|
|
25
|
+
"Dryrun",
|
|
26
|
+
"Type",
|
|
27
|
+
"type",
|
|
28
|
+
"path",
|
|
29
|
+
"method",
|
|
30
|
+
],
|
|
31
|
+
fields
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
.map(function (key) {
|
|
35
|
+
return { name: key, value: fields[key] }
|
|
36
|
+
}, fields)
|
|
37
|
+
.concat([
|
|
38
|
+
{ name: "Data-Protocol", value: "ao" },
|
|
39
|
+
{ name: "Type", value: fields.Type ?? "Message" },
|
|
40
|
+
{ name: "Variant", value: fields.Variant ?? "ao.N.1" },
|
|
41
|
+
]),
|
|
42
|
+
data: fields?.data || "",
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
headers: {
|
|
46
|
+
"Content-Type": "application/ans104",
|
|
47
|
+
"codec-device": "ans104@1.0",
|
|
48
|
+
},
|
|
49
|
+
item: dataItem,
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function parseSignatureInput(input) {
|
|
54
|
+
const match = input.match(
|
|
55
|
+
/^([^=]+)=\(([^)]+)\);alg="([^"]+)";keyid="([^"]+)"$/
|
|
56
|
+
)
|
|
57
|
+
if (!match) throw new Error("Invalid signature-input format")
|
|
58
|
+
|
|
59
|
+
const [, label, fieldsStr, alg, keyid] = match
|
|
60
|
+
const fields = fieldsStr.split('" "').map(f => f.replace(/"/g, ""))
|
|
61
|
+
return { label, fields, alg, keyid }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { toANS104Request, parseSignatureInput, generateId }
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import yargs from "yargs"
|
|
2
|
+
let { port = 7000 } = yargs(process.argv.slice(2)).argv
|
|
3
|
+
import { Server } from "../test.js"
|
|
4
|
+
import { generateId } from "./utils.js"
|
|
5
|
+
import WebSocket from "ws"
|
|
6
|
+
const ws_server = new WebSocket.Server({ port: 7070 })
|
|
7
|
+
import { keys, omit, isNil, mergeLeft } from "ramda"
|
|
8
|
+
import { resolve } from "path"
|
|
9
|
+
import { writeFileSync, readFileSync } from "fs"
|
|
10
|
+
let sus = {}
|
|
11
|
+
let cbs = {}
|
|
12
|
+
let _socket = null
|
|
13
|
+
|
|
14
|
+
ws_server.on("connection", socket => {
|
|
15
|
+
_socket = socket
|
|
16
|
+
const clientId = generateId()
|
|
17
|
+
console.log("new ws:", clientId)
|
|
18
|
+
sus[clientId] = {
|
|
19
|
+
socket,
|
|
20
|
+
su: false,
|
|
21
|
+
connections: {},
|
|
22
|
+
address: null,
|
|
23
|
+
}
|
|
24
|
+
socket.send(JSON.stringify({ type: "registered", id: clientId }))
|
|
25
|
+
socket.on("message", message => {
|
|
26
|
+
const data = JSON.parse(message)
|
|
27
|
+
if (data.type === "msg") {
|
|
28
|
+
if (cbs[data.id]) {
|
|
29
|
+
cbs[data.id](data.res)
|
|
30
|
+
delete cbs[data.id]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
socket.on("close", () => {
|
|
36
|
+
console.log("ws disconnected", clientId)
|
|
37
|
+
delete sus[clientId]
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
console.log("WAO FS running on port 7070")
|
|
42
|
+
class Adaptor {
|
|
43
|
+
constructor({ hb_url, aoconnect, log = false, db } = {}) {}
|
|
44
|
+
async get(req, res) {
|
|
45
|
+
try {
|
|
46
|
+
if (_socket) {
|
|
47
|
+
const id = generateId()
|
|
48
|
+
cbs[id] = res
|
|
49
|
+
_socket.send(JSON.stringify({ type: "msg", req, id }))
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
if (cbs[id]) {
|
|
52
|
+
res({ status: 404, error: "error" })
|
|
53
|
+
delete cbs[id]
|
|
54
|
+
}
|
|
55
|
+
}, 3000)
|
|
56
|
+
} else {
|
|
57
|
+
res({ status: 404, error: "connection not found" })
|
|
58
|
+
}
|
|
59
|
+
} catch (e) {
|
|
60
|
+
res({ status: 404, error: "connection not found" })
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const main = async () => new Server({ log: true, port, adaptor: new Adaptor() })
|
|
66
|
+
|
|
67
|
+
main()
|
package/esm/run.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wao",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.2",
|
|
4
4
|
"bin": {
|
|
5
5
|
"wao": "./cjs/cli.js",
|
|
6
6
|
"wao-esm": "./esm/cli.js"
|
|
@@ -36,10 +36,10 @@
|
|
|
36
36
|
"arjson": "^0.0.2",
|
|
37
37
|
"arweave": "^1.15.1",
|
|
38
38
|
"base64url": "^3.0.1",
|
|
39
|
-
"body-parser": "^
|
|
39
|
+
"body-parser": "^2.2.0",
|
|
40
40
|
"buffer": "^6.0.3",
|
|
41
41
|
"cors": "^2.8.5",
|
|
42
|
-
"express": "^
|
|
42
|
+
"express": "^5.1.0",
|
|
43
43
|
"graphql": "^16.10.0",
|
|
44
44
|
"http-message-signatures": "^1.0.4",
|
|
45
45
|
"lmdb": "^3.2.2",
|
|
@@ -49,7 +49,8 @@
|
|
|
49
49
|
"pm2": "^5.4.3",
|
|
50
50
|
"ramda": "^0.30.1",
|
|
51
51
|
"wasm-brotli": "^2.0.2",
|
|
52
|
-
"yargs": "^17.7.2"
|
|
52
|
+
"yargs": "^17.7.2",
|
|
53
|
+
"chokidar": "^4.0.3"
|
|
53
54
|
},
|
|
54
55
|
"devDependencies": {
|
|
55
56
|
"@babel/cli": "^7.24.8",
|