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/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
+ })
@@ -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")
@@ -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
@@ -10,6 +10,7 @@ let {
10
10
  db = ".cache",
11
11
  hb,
12
12
  } = yargs(process.argv.slice(2)).argv
13
+
13
14
  db = memory ? null : resolve(process.cwd(), db)
14
15
  if (reset) {
15
16
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wao",
3
- "version": "0.19.0",
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": "^1.20.3",
39
+ "body-parser": "^2.2.0",
40
40
  "buffer": "^6.0.3",
41
41
  "cors": "^2.8.5",
42
- "express": "^4.21.2",
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",