aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--index.js1
-rw-r--r--lib/nostr.js48
-rw-r--r--package.json2
-rw-r--r--pnpm-lock.yaml140
4 files changed, 190 insertions, 1 deletions
diff --git a/index.js b/index.js
index 759893dc..c4c6ebc6 100644
--- a/index.js
+++ b/index.js
@@ -15,6 +15,7 @@ import "./lib/sync";
import "./lib/rates";
import "./lib/notifications";
import "./lib/mail";
+import "./lib/nostr";
import "./routes/assets";
import "./routes/locations";
diff --git a/lib/nostr.js b/lib/nostr.js
new file mode 100644
index 00000000..b1b24b87
--- /dev/null
+++ b/lib/nostr.js
@@ -0,0 +1,48 @@
+import { Relay, RelayPool } from "nostr";
+import { got } from "got";
+import { broadcast } from "$lib/sockets";
+
+const { relays } = await got("https://nostr.watch/relays.json").json();
+const pool = RelayPool(relays);
+
+let coinos;
+pool.on("open", (relay) => {
+ if (relay.url.includes("coinos")) coinos = relay;
+ relay.subscribe("subid", { limit: 1 });
+});
+
+let seen = [];
+pool.on("event", (relay, sub_id, ev) => {
+ if (seen.includes(ev.id)) return;
+ if (Math.abs(Math.floor(Date.now()/1000) - ev.created_at) > 7200) return;
+ seen.push(ev.id);
+ seen.length > 1000 && seen.shift();
+
+ if (
+ coinos &&
+ ev.kind < 5 &&
+ !ev.content.startsWith("test") &&
+ !ev.content.startsWith("running branle")
+ ) {
+ let parsed;
+ try {
+ parsed = JSON.parse(ev.content);
+ } catch (e) {
+ parsed = ev.content;
+ }
+
+ coinos.send(["EVENT", ev]);
+ if (ev.kind === 1)
+ broadcast("event", ev);
+ }
+});
+
+function formatDate(date) {
+ var hours = date.getHours();
+ var minutes = date.getMinutes();
+ hours = hours % 12;
+ hours = hours ? hours : 12;
+ minutes = minutes < 10 ? "0" + minutes : minutes;
+ var strTime = hours + ":" + minutes;
+ return date.getMonth() + 1 + "/" + date.getDate() + " " + strTime;
+}
diff --git a/package.json b/package.json
index b868531e..1bca9dba 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
"express-session": "^1.16.2",
"fastify": "^4.5.3",
"file-type": "^18.0.0",
+ "got": "^12.5.3",
"http-proxy-middleware": "^0.20.0",
"imap": "^0.8.19",
"jsonwebtoken": "^8.5.1",
@@ -48,6 +49,7 @@
"mysql2": "^2.2.5",
"node-fetch": "^2.6.1",
"nodemon": "^2.0.7",
+ "nostr": "^0.2.7",
"otplib": "^12.0.1",
"passport-jwt": "^4.0.0",
"passport-local": "1.0.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 75af23d3..b6722b1d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -29,6 +29,7 @@ specifiers:
express-session: ^1.16.2
fastify: ^4.5.3
file-type: ^18.0.0
+ got: ^12.5.3
http-proxy-middleware: ^0.20.0
imap: ^0.8.19
jsonwebtoken: ^8.5.1
@@ -42,6 +43,7 @@ specifiers:
mysql2: ^2.2.5
node-fetch: ^2.6.1
nodemon: ^2.0.7
+ nostr: ^0.2.7
otplib: ^12.0.1
passport-jwt: ^4.0.0
passport-local: 1.0.0
@@ -91,6 +93,7 @@ dependencies:
express-session: 1.17.3
fastify: 4.8.1
file-type: 18.0.0
+ got: 12.5.3
http-proxy-middleware: 0.20.0
imap: 0.8.19
jsonwebtoken: 8.5.1
@@ -104,6 +107,7 @@ dependencies:
mysql2: 2.3.3
node-fetch: 2.6.7
nodemon: 2.0.20
+ nostr: 0.2.7
otplib: 12.0.1
passport-jwt: 4.0.0
passport-local: 1.0.0
@@ -412,6 +416,18 @@ packages:
- supports-color
dev: false
+ /@sindresorhus/is/5.3.0:
+ resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==}
+ engines: {node: '>=14.16'}
+ dev: false
+
+ /@szmarczak/http-timer/5.0.1:
+ resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ defer-to-connect: 2.0.1
+ dev: false
+
/@tokenizer/token/0.3.0:
resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
dev: false
@@ -438,6 +454,10 @@ packages:
resolution: {integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==}
dev: false
+ /@types/http-cache-semantics/4.0.1:
+ resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
+ dev: false
+
/@types/ms/0.7.31:
resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
dev: false
@@ -1011,6 +1031,24 @@ packages:
dev: false
optional: true
+ /cacheable-lookup/7.0.0:
+ resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
+ engines: {node: '>=14.16'}
+ dev: false
+
+ /cacheable-request/10.2.3:
+ resolution: {integrity: sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@types/http-cache-semantics': 4.0.1
+ get-stream: 6.0.1
+ http-cache-semantics: 4.1.0
+ keyv: 4.5.2
+ mimic-response: 4.0.0
+ normalize-url: 8.0.0
+ responselike: 3.0.0
+ dev: false
+
/call-bind/1.0.2:
resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
dependencies:
@@ -1359,6 +1397,11 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: false
+ /defer-to-connect/2.0.1:
+ resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==}
+ engines: {node: '>=10'}
+ dev: false
+
/degenerator/1.0.4:
resolution: {integrity: sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==}
dependencies:
@@ -1854,6 +1897,11 @@ packages:
optional: true
dev: false
+ /form-data-encoder/2.1.4:
+ resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
+ engines: {node: '>= 14.17'}
+ dev: false
+
/form-data/2.5.1:
resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==}
engines: {node: '>= 0.12'}
@@ -1962,6 +2010,11 @@ packages:
engines: {node: '>=8.0.0'}
dev: false
+ /get-stream/6.0.1:
+ resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+ engines: {node: '>=10'}
+ dev: false
+
/get-uri/2.0.4:
resolution: {integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==}
dependencies:
@@ -2012,6 +2065,23 @@ packages:
once: 1.4.0
dev: false
+ /got/12.5.3:
+ resolution: {integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ '@sindresorhus/is': 5.3.0
+ '@szmarczak/http-timer': 5.0.1
+ cacheable-lookup: 7.0.0
+ cacheable-request: 10.2.3
+ decompress-response: 6.0.0
+ form-data-encoder: 2.1.4
+ get-stream: 6.0.1
+ http2-wrapper: 2.2.0
+ lowercase-keys: 3.0.0
+ p-cancelable: 3.0.0
+ responselike: 3.0.0
+ dev: false
+
/graceful-fs/4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
dev: false
@@ -2082,7 +2152,6 @@ packages:
/http-cache-semantics/4.1.0:
resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==}
dev: false
- optional: true
/http-errors/1.7.2:
resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==}
@@ -2162,6 +2231,14 @@ packages:
- debug
dev: false
+ /http2-wrapper/2.2.0:
+ resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==}
+ engines: {node: '>=10.19.0'}
+ dependencies:
+ quick-lru: 5.1.1
+ resolve-alpn: 1.2.1
+ dev: false
+
/http_ece/1.1.0:
resolution: {integrity: sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==}
engines: {node: '>=4'}
@@ -2370,6 +2447,10 @@ packages:
engines: {node: '>=10'}
dev: false
+ /json-buffer/3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: false
+
/json-schema-traverse/1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
dev: false
@@ -2420,6 +2501,12 @@ packages:
safe-buffer: 5.2.1
dev: false
+ /keyv/4.5.2:
+ resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: false
+
/knex/2.3.0_miwdxfk6g3dfg4gj6dnwby2onu:
resolution: {integrity: sha512-WMizPaq9wRMkfnwKXKXgBZeZFOSHGdtoSz5SaLAVNs3WRDfawt9O89T4XyH52PETxjV8/kRk0Yf+8WBEP/zbYw==}
engines: {node: '>=12'}
@@ -2587,6 +2674,11 @@ packages:
resolution: {integrity: sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==}
dev: false
+ /lowercase-keys/3.0.0:
+ resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: false
+
/lru-cache/4.1.5:
resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
dependencies:
@@ -2724,6 +2816,11 @@ packages:
engines: {node: '>=10'}
dev: false
+ /mimic-response/4.0.0:
+ resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: false
+
/minimalistic-assert/1.0.1:
resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
dev: false
@@ -2902,6 +2999,11 @@ packages:
engines: {node: '>= 0.4.0'}
dev: false
+ /noble-secp256k1/1.2.14:
+ resolution: {integrity: sha512-GSCXyoZBUaaPwVWdYncMEmzlSUjF9J/YeEHpklYJCyg8wPuJP3NzDx0BkiwArzINkdX2HJHvUJhL6vVWPOQQcg==}
+ deprecated: Switch to namespaced @noble/secp256k1 for security and feature updates
+ dev: false
+
/node-abi/3.26.0:
resolution: {integrity: sha512-jRVtMFTChbi2i/jqo/i2iP9634KMe+7K1v35mIdj3Mn59i5q27ZYhn+sW6npISM/PQg7HrP2kwtRBMmh5Uvzdg==}
engines: {node: '>=10'}
@@ -2997,6 +3099,21 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
+ /normalize-url/8.0.0:
+ resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==}
+ engines: {node: '>=14.16'}
+ dev: false
+
+ /nostr/0.2.7:
+ resolution: {integrity: sha512-Yq5tkiCTJtohs7H7Fx+Ki83bR8b3xapdwYi17HunhW5EQfZ9rI0cIXFyihj2ZRkv/0YYvVBiCp/KIaLYt5LyfQ==}
+ dependencies:
+ noble-secp256k1: 1.2.14
+ ws: 8.9.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: false
+
/npmlog/5.0.1:
resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
dependencies:
@@ -3079,6 +3196,11 @@ packages:
'@otplib/preset-v11': 12.0.1
dev: false
+ /p-cancelable/3.0.0:
+ resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
+ engines: {node: '>=12.20'}
+ dev: false
+
/p-limit/3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
@@ -3442,6 +3564,11 @@ packages:
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
dev: false
+ /quick-lru/5.1.1:
+ resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+ engines: {node: '>=10'}
+ dev: false
+
/random-bytes/1.0.0:
resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==}
engines: {node: '>= 0.8'}
@@ -3578,6 +3705,10 @@ packages:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
dev: false
+ /resolve-alpn/1.2.1:
+ resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
+ dev: false
+
/resolve-from/5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
@@ -3592,6 +3723,13 @@ packages:
supports-preserve-symlinks-flag: 1.0.0
dev: false
+ /responselike/3.0.0:
+ resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
+ engines: {node: '>=14.16'}
+ dependencies:
+ lowercase-keys: 3.0.0
+ dev: false
+
/ret/0.2.2:
resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==}
engines: {node: '>=4'}