Compare commits

..

5 Commits

Author SHA1 Message Date
lamp 40e1735b82 don't log message object
it even breaks older node.js
2026-04-10 14:50:14 -07:00
lamp a049005fd1 Download videos via chat 2026-04-10 14:21:03 -07:00
lamp b1d675ad45 limit recursion 2025-04-08 15:40:58 -07:00
lamp 5da60912be support quoted video post, quote+video post, from own or parent post; support did:web 2025-04-08 15:29:13 -07:00
lamp a8552b8e20 show the error message 2025-04-08 12:53:28 -07:00
5 changed files with 507 additions and 137 deletions
+1
View File
@@ -1,2 +1,3 @@
node_modules node_modules
.env .env
session.json
+39
View File
@@ -0,0 +1,39 @@
<!DOCTYPE html><html style="background-color:black;color:white"><head>
<title>Video Download Helper</title>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<style>
video {max-width: 100%}
</style>
</head><body>
<noscript>need javascript bruh</noscript>
<div id="txt" style="white-space:pre"></div>
<script>
var params = new URLSearchParams(location.search);
var url = params.get("url");
if (url) {
var filename = params.get("filename") || "download.mp4";
txt.innerText = "downloading video blob, please wait...";
fetch(url).then(res => res.blob()).then(blob => {
var burl = URL.createObjectURL(blob);
var a = document.createElement("a");
a.href = burl;
a.download = filename;
a.innerText = "click or tap to save video";
txt.replaceWith(a);
a.click();
/*var video = document.createElement("video");
video.controls = true;
var source = document.createElement("source");
source.src = burl;
source.type = "video/mp4";
video.appendChild(source);
document.body.appendChild(video);*/
}).catch(error => {
txt.innerText = error.stack;
txt.style.color = "red";
});
}
</script>
</body></html>
+115 -33
View File
@@ -1,50 +1,132 @@
import "dotenv/config"; import "dotenv/config";
import {Bot, RichText} from "@skyware/bot"; import {Bot, RichText, Post, IncomingChatPreference} from "@skyware/bot";
import {DidResolver} from "@atproto/identity";
import {readFile,writeFile} from "fs/promises";
var bot = new Bot(); var didres = new DidResolver({});
await bot.login({ var getServiceEndpoint = async did => (await didres.resolve(did)).service.find(s => s.id == "#atproto_pds")?.serviceEndpoint;
identifier: process.env.IDENTIFIER,
password: process.env.PASSWORD var bot = new Bot({emitChatEvents: true});
});
bot.on("error", console.error); bot.on("error", console.error);
bot.on("mention", async mention => { try {
//console.log({mention}); var sessionData = JSON.parse(await readFile("session.json", "utf8"));
var parent = mention.replyRef?.parent; await bot.resumeSession(sessionData);
if (!parent) return; console.log("resumed session");
//console.log({parent}); } catch(error) {
try { console.log(error.message);
var parentPost = await bot.getPost(parent.uri); var sessionData = await bot.login({
//console.log({parentPost}); identifier: process.env.IDENTIFIER,
password: process.env.PASSWORD
});
console.log("new session:", sessionData);
await writeFile("session.json", JSON.stringify(sessionData));
}
var embed = parentPost.embed; await bot.setChatPreference(IncomingChatPreference.All);
if (!embed || !embed.isVideo()) {
//await mention.reply({text: "Sorry, it doesn't seem that this post has a video."})
bot.on("mention", async post => {
try {
var responsePayload = await processRequest(post);
if (responsePayload) await post.reply(responsePayload);
} catch (error) {
console.error(error);
await post.reply({text: String(error.message?.substring(0,300))});
}
});
bot.on("message", async (message) => {
try {
console.log(`chat: ${JSON.stringify({id: message.id, senderDid: message.senderDid, sentAt: message.sentAt, text: message.text, facets: message.facets, embed: message.embed})}`);
var conversationId = message.conversationId;
if (!conversationId) {
console.warn("missing conversationId");
return; return;
} }
var did = parentPost.author.did; if (message.embed) {
var cid = embed.cid; var uri = message.embed.uri;
var url = `${await getServiceEndpoint(did)}/xrpc/com.atproto.sync.getBlob?did=${did}&cid=${cid}`; } else {
url = `https://avps.owo69.me/download.html?filename=${cid}.mp4&url=${encodeURIComponent(url)}`; var uri = findLinkedBlueskyPosts(message.facets)[0]; //todo support multiple
if (!uri) {
await bot.sendMessage({conversationId, text: "Send me a Bluesky post with a video to get a download link!"});
return;
}
}
var text = new RichText().addLink("Click or touch here to download this video", url); try {
await mention.reply({text}); var post = await bot.getPost(uri);
} catch (error) {
console.error(error);
await bot.sendMessage({conversationId, text: error.message});
return;
}
var responsePayload = await processRequest(post);
if (!responsePayload) {
responsePayload = {text: "This post does not have a video :("};
};
await bot.sendMessage({conversationId, ...responsePayload});
} catch (error) { } catch (error) {
console.error(error); console.error(error);
await mention.reply({text: "error"});
} }
}); });
async function processRequest(post) {
// video in mentioning post or quoted post
var vid = await findVideoInPost(post);
async function getServiceEndpoint(did) { // ignore original posts without video
//try { if (!vid && !post.replyRef) return;
var doc = await fetch(`https://plc.directory/${did}`).then(res => res.json());
var {serviceEndpoint} = doc.service.find(s => s.id == "#atproto_pds"); // video in replied post or quoted in replied post
return serviceEndpoint; if (!vid) {
//} catch (error) { var parentPost = await bot.getPost(post.replyRef.parent.uri);
// console.error(error); vid = await findVideoInPost(parentPost);
// return `https://bsky.network`; }
//}
// video in original post or quoted in original post
if (!vid) {
var rootPost = await bot.getPost(post.replyRef.root.uri);
vid = await findVideoInPost(rootPost);
}
if (!vid) {
return {text: "Could not find Bluesky video in replied post, quoted post, or parent post"};
}
var url = `${await getServiceEndpoint(vid.did)}/xrpc/com.atproto.sync.getBlob?did=${vid.did}&cid=${vid.cid}`;
// pdes don't set a suitable Content-Disposition header
var url2 = `https://avps.owo69.me/download.html?filename=${vid.cid}.mp4&url=${encodeURIComponent(url)}`;
var text = new RichText().addLink("Click or touch here to download this video.", url2).addText("\n\nOr right click ").addLink("here", url).addText(` to “Save Link As…”`);
return {text};
}
async function findVideoInPost(post, b) {
if (!post.embed) return;
if (post.embed.isVideo())
return {did: post.author.did, cid: post.embed.cid};
if (post.embed.isRecordWithMedia() && post.embed.media.isVideo())
return {did: post.author.did, cid: post.embed.media.cid};
if (post.embed.isRecord() && post.embed.record instanceof Post && !b) {
// post.embed.record.embed is undefined
let quotedPost = await bot.getPost(post.embed.record.uri);
return await findVideoInPost(quotedPost, true);
}
}
function findLinkedBlueskyPosts(facets) {
var uris = [];
if (facets) for (var facet of facets) if (facet.features) for (var feature of facet.features) if (feature.$type == "app.bsky.richtext.facet#link" && feature.uri) {
var match = feature.uri.match(/https?:\/\/bsky\.app\/profile\/([^\/]+)\/post\/([^\/]+)/);
if (match) uris.push(`at://${match[1]}/app.bsky.feed.post/${match[2]}`);
}
return uris;
} }
+348 -101
View File
@@ -1,130 +1,320 @@
{ {
"name": "bsky video download bot", "name": "bsky-video-download-bot",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"dependencies": { "dependencies": {
"@skyware/bot": "^0.3.7", "@atproto/identity": "^0.4.12",
"dotenv": "^16.4.5" "@skyware/bot": "^0.4.1",
"dotenv": "^17.4.1"
} }
}, },
"node_modules/@atcute/base32": { "node_modules/@atcute/atproto": {
"version": "1.0.0", "version": "3.1.11",
"resolved": "https://registry.npmjs.org/@atcute/base32/-/base32-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@atcute/atproto/-/atproto-3.1.11.tgz",
"integrity": "sha512-Mbjsv6kd/ymvDMGjCoh9eqhlpFsoJ6zYguU6xtKxqh1wGhe5rvBOfMRXsEqcp7srn8Bfp8QhevqLgmwrWvzqrA==", "integrity": "sha512-yh+ASvA+iHHQij6UeHEKp2+rwvFvQR8A6/5Dk/xvqDslIikWEFx9VlprNwm/clQIPl2bLuQg+LHS8uY9o5nFTA==",
"optional": true "license": "0BSD",
"dependencies": {
"@atcute/lexicons": "^1.2.10"
}
}, },
"node_modules/@atcute/bluesky": { "node_modules/@atcute/bluesky": {
"version": "1.0.7", "version": "3.3.2",
"resolved": "https://registry.npmjs.org/@atcute/bluesky/-/bluesky-1.0.7.tgz", "resolved": "https://registry.npmjs.org/@atcute/bluesky/-/bluesky-3.3.2.tgz",
"integrity": "sha512-2jPHzl7WbcqRtcAXanJy4Lp638ujqnoGmPCPmBlmpEDP34D7EVKQqjN/mlvglb5n539dThA9xlSgIS8yOxwzDA==", "integrity": "sha512-BqVXghoNFbBm38hveWqPQQ25VZxHXmqYk5h0NG8YFiwNLrI8Ww1nXHAJzS65zyHwV5QeSA6EDFaTrQwm+7cCFQ==",
"peerDependencies": { "license": "0BSD",
"@atcute/client": "^1.0.0 || ^2.0.0" "dependencies": {
"@atcute/atproto": "^3.1.11",
"@atcute/lexicons": "^1.3.0"
} }
}, },
"node_modules/@atcute/bluesky-richtext-builder": { "node_modules/@atcute/bluesky-richtext-builder": {
"version": "1.0.1", "version": "2.0.5",
"resolved": "https://registry.npmjs.org/@atcute/bluesky-richtext-builder/-/bluesky-richtext-builder-1.0.1.tgz", "resolved": "https://registry.npmjs.org/@atcute/bluesky-richtext-builder/-/bluesky-richtext-builder-2.0.5.tgz",
"integrity": "sha512-msyKHZa47id7Oe2zHpgPSuL+l9vLQXmKfi6uyMOS5yw6nLpNd5Tdb96wcgwscMmyH8UR4EoM+2oYLvyH89DcEQ==", "integrity": "sha512-74VcYnq0MIWb9GegSYmxfFMYWSDn4fqh0R3d9ofzgav0gVFGPmXDm4Hf4cuOYGv9pz0/4sdJDqb0gamzxvOXGQ==",
"peerDependencies": { "license": "0BSD",
"@atcute/bluesky": "^1.0.0", "dependencies": {
"@atcute/client": "^1.0.0 || ^2.0.0" "@atcute/bluesky": "^3.2.17",
"@atcute/lexicons": "^1.2.9",
"@atcute/uint8array": "^1.1.1"
} }
}, },
"node_modules/@atcute/car": { "node_modules/@atcute/car": {
"version": "1.1.0", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/@atcute/car/-/car-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@atcute/car/-/car-3.1.3.tgz",
"integrity": "sha512-Ayi8gilzgMMYZ1sqbHqqP52OOJlxrbsAxgAB3Kgz/NJvl9StlYKKlUQN580gZebsG0B+EYbhToQJYoCs3ioW+A==", "integrity": "sha512-WJ13bAEt7TjDMVi09ubjLtvhdljbWInGm9Kfy7Y6NhrmiyC/aZYaA/zHX/bHI6xv1c/h3SQduWqxOr4ae49eqA==",
"license": "0BSD",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@atcute/cbor": "^1.0.2", "@atcute/cbor": "^2.2.7",
"@atcute/cid": "^1.0.1", "@atcute/cid": "^2.2.5",
"@atcute/varint": "^1.0.0" "@atcute/uint8array": "^1.0.5",
"@atcute/varint": "^1.0.3",
"yocto-queue": "^1.2.1"
} }
}, },
"node_modules/@atcute/cbor": { "node_modules/@atcute/cbor": {
"version": "1.0.5", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/@atcute/cbor/-/cbor-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@atcute/cbor/-/cbor-2.3.2.tgz",
"integrity": "sha512-ckWn+ZErzeTgKBuklQfUpsOb5+uAtSJi68Z7+1wJMMEP7iO/V90IIlyTm+19ACuGEuY8SGrfUIWyZvBjhgCTYw==", "integrity": "sha512-xP2SORSau/VVI00x2V4BjwIkHr6EQ7l/MXEOPaa4LGYtePFc4gnD4L1yN10dT5NEuUnvGEuCh6arLB7gz1smVQ==",
"license": "0BSD",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@atcute/base32": "^1.0.0", "@atcute/cid": "^2.4.1",
"@atcute/cid": "^1.0.1" "@atcute/multibase": "^1.1.8",
"@atcute/uint8array": "^1.1.1"
} }
}, },
"node_modules/@atcute/cid": { "node_modules/@atcute/cid": {
"version": "1.0.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/@atcute/cid/-/cid-1.0.1.tgz", "resolved": "https://registry.npmjs.org/@atcute/cid/-/cid-2.4.1.tgz",
"integrity": "sha512-92Cor2ruS7y+/wdFutp2qFDjJj4mTcO7HdZ/BhTQRg/nzWdAnTann5DAmYjD+IWRaXd5SYk4dOZnDt4lsGofzg==", "integrity": "sha512-bwhna69RCv7yetXudtj+2qrMPYvhhIQqvJz6YUpUS98v7OdF3X2dnye9Nig2NDrklZcuyOsu7sQo7GOykJXRLQ==",
"license": "0BSD",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@atcute/base32": "^1.0.0", "@atcute/multibase": "^1.1.8",
"@atcute/varint": "^1.0.0" "@atcute/uint8array": "^1.1.1"
} }
}, },
"node_modules/@atcute/client": { "node_modules/@atcute/client": {
"version": "2.0.3", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/@atcute/client/-/client-2.0.3.tgz", "resolved": "https://registry.npmjs.org/@atcute/client/-/client-4.2.1.tgz",
"integrity": "sha512-j9GryA5l+4F0BTQWa6/1XmsuSPSq+bqNCY3mrHUGD592hMqUZxgpYDLgRWL+719V287AW/56AwvFYlbjlENp7A==" "integrity": "sha512-ZBFM2pW075JtgGFu5g7HHZBecrClhlcNH8GVP9Zz1aViWR+cjjBsTpeE63rJs+FCOHFYlirUyo5L8SGZ4kMINw==",
"license": "0BSD",
"dependencies": {
"@atcute/identity": "^1.1.3",
"@atcute/lexicons": "^1.2.6"
}
},
"node_modules/@atcute/identity": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-1.1.4.tgz",
"integrity": "sha512-RCw1IqflfuSYCxK5m0lZCm0UnvIzcUnuhngiBhJEJb9a9Mc2SEf1xP3H8N5r8pvEH1LoAYd6/zrvCNU+uy9esw==",
"license": "0BSD",
"dependencies": {
"@atcute/lexicons": "^1.2.9",
"@badrap/valita": "^0.4.6"
}
},
"node_modules/@atcute/lexicons": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@atcute/lexicons/-/lexicons-1.3.0.tgz",
"integrity": "sha512-Eq5y+9onnCXNVUlNiMf31beSXHKqptB7lUo/68YbhlmxdaR7ooywHmahya9goP5AsmlYEA1z+dRPXIDAa9O7cg==",
"license": "0BSD",
"dependencies": {
"@atcute/uint8array": "^1.1.1",
"@atcute/util-text": "^1.2.0",
"@standard-schema/spec": "^1.1.0",
"esm-env": "^1.2.2"
}
},
"node_modules/@atcute/multibase": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@atcute/multibase/-/multibase-1.2.0.tgz",
"integrity": "sha512-ZK2GRra+qIYq9nNuQB52m2ul0hOmCQEtPobGfTSUxm7pF0OGEkWGkWHugFhNEDVzHzTwPxHp6VGotdZFue4lYQ==",
"license": "0BSD",
"optional": true,
"dependencies": {
"@atcute/uint8array": "^1.1.1"
}
}, },
"node_modules/@atcute/ozone": { "node_modules/@atcute/ozone": {
"version": "1.0.5", "version": "3.1.14",
"resolved": "https://registry.npmjs.org/@atcute/ozone/-/ozone-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@atcute/ozone/-/ozone-3.1.14.tgz",
"integrity": "sha512-53+KoRlvzinv1NUESFOHPPK2kF/CFoQc9um1xH3OPhe29x7RP3PNEBXSc53mnbsAg80dTuh83xqwTrpdJ3o33g==", "integrity": "sha512-v0Z/W2f5Aa8rwEw6kNEd1nl+a9SbtflCzXqJUmuQbwlesfpRN/T5dCk+WNT55EN7wfYx03JwYrSSJlh5N9oZvA==",
"peerDependencies": { "license": "0BSD",
"@atcute/bluesky": "^1.0.0", "dependencies": {
"@atcute/client": "^1.0.0 || ^2.0.0" "@atcute/atproto": "^3.1.11",
"@atcute/bluesky": "^3.3.1",
"@atcute/lexicons": "^1.2.10"
}
},
"node_modules/@atcute/uint8array": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@atcute/uint8array/-/uint8array-1.1.1.tgz",
"integrity": "sha512-3LsC8XB8TKe9q/5hOA5sFuzGaIFdJZJNewC5OKa3o/eU6+K7JR6see9Zy2JbQERNVnRl11EzbNov1efgLMAs4g==",
"license": "0BSD"
},
"node_modules/@atcute/util-text": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@atcute/util-text/-/util-text-1.2.0.tgz",
"integrity": "sha512-b8WSh+Z7K601eUFFmTFj8QPKDO8Ic0VDDj63sdKzpkm+ySQKsYT5nXekViGqFVKbyKj1V5FyvZvgXad6/aI4QQ==",
"license": "0BSD",
"dependencies": {
"unicode-segmenter": "^0.14.5"
} }
}, },
"node_modules/@atcute/varint": { "node_modules/@atcute/varint": {
"version": "1.0.0", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/@atcute/varint/-/varint-1.0.0.tgz", "resolved": "https://registry.npmjs.org/@atcute/varint/-/varint-1.0.4.tgz",
"integrity": "sha512-NEBOGkdaDY8cjlDg49kefIsRM7iv/4oReEnOr3bN4tF3IxBGdc6Io1NCJz1xNBNdUL+3VDG3CKHiRji91HXaTg==", "integrity": "sha512-0nGBaRyJLoxVvCHTSLGwPZKs64PPi/0lDA4viF3I5zxsRmVPsXaE92J8VQj3KoZfk0+Z+liXklG1Onw7G9S4oQ==",
"license": "0BSD",
"optional": true "optional": true
}, },
"node_modules/@skyware/bot": { "node_modules/@atproto/common-web": {
"version": "0.3.7", "version": "0.4.20",
"resolved": "https://registry.npmjs.org/@skyware/bot/-/bot-0.3.7.tgz", "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.4.20.tgz",
"integrity": "sha512-27k7r4/YA+h8FobXokMa3iv8fm/850a7NmajOHP3/CaMbCYicXXBDnAIY4kIPP58Zl/A/JvdcFLpQBpfFkiQHQ==", "integrity": "sha512-RcsYT28yQgVi/Glb/hHPGpqpzIlKrbMLeldEd7PmmMLWDaJL2j3lb92qytvxjl1yhi2Ssq2TEuMZ2NlWaAbpow==",
"license": "MIT",
"dependencies": { "dependencies": {
"@atcute/bluesky": "^1.0.7", "@atproto/lex-data": "^0.0.15",
"@atcute/bluesky-richtext-builder": "^1.0.1", "@atproto/lex-json": "^0.0.15",
"@atcute/client": "^2.0.3", "@atproto/syntax": "^0.5.3",
"@atcute/ozone": "^1.0.5", "zod": "^3.23.8"
}
},
"node_modules/@atproto/crypto": {
"version": "0.4.5",
"resolved": "https://registry.npmjs.org/@atproto/crypto/-/crypto-0.4.5.tgz",
"integrity": "sha512-n40aKkMoCatP0u9Yvhrdk6fXyOHFDDbkdm4h4HCyWW+KlKl8iXfD5iV+ECq+w5BM+QH25aIpt3/j6EUNerhLxw==",
"license": "MIT",
"dependencies": {
"@noble/curves": "^1.7.0",
"@noble/hashes": "^1.6.1",
"uint8arrays": "3.0.0"
},
"engines": {
"node": ">=18.7.0"
}
},
"node_modules/@atproto/identity": {
"version": "0.4.12",
"resolved": "https://registry.npmjs.org/@atproto/identity/-/identity-0.4.12.tgz",
"integrity": "sha512-P+Jn0HvKhIh1tps5n3xGrCxt+XiFWzp4kdgloyFhFmVLwjDU547DQkWx4r5Vhuiah7fRZGVSlk39R4U6SPrACg==",
"license": "MIT",
"dependencies": {
"@atproto/common-web": "^0.4.17",
"@atproto/crypto": "^0.4.5"
},
"engines": {
"node": ">=18.7.0"
}
},
"node_modules/@atproto/lex-data": {
"version": "0.0.15",
"resolved": "https://registry.npmjs.org/@atproto/lex-data/-/lex-data-0.0.15.tgz",
"integrity": "sha512-ZsbGiaM5S3CnGrcTMbDGON3bLZzCi/Mx9UvcMREKSRujnF68eHgMiXxJqvykP7+QpOX6tYCK93axZkuJVhtSEw==",
"license": "MIT",
"dependencies": {
"multiformats": "^9.9.0",
"tslib": "^2.8.1",
"uint8arrays": "3.0.0",
"unicode-segmenter": "^0.14.0"
}
},
"node_modules/@atproto/lex-json": {
"version": "0.0.15",
"resolved": "https://registry.npmjs.org/@atproto/lex-json/-/lex-json-0.0.15.tgz",
"integrity": "sha512-kCLdP629H6GhgPjBTpZibUoqlpmW0hnVfZVwcD4s4Jch1KAqY/QcfL24Ih8wrW0Ok1YvtMIhjk98evdTA2OJcw==",
"license": "MIT",
"dependencies": {
"@atproto/lex-data": "^0.0.15",
"tslib": "^2.8.1"
}
},
"node_modules/@atproto/syntax": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.5.3.tgz",
"integrity": "sha512-gzhlHOJHm5KXdCc17fXi1fXM81ccs5jJfNgCui84ay9JGvczxegpYHNqdMlv+iBuhtBzFIjgx6ChjRxN/kO8kQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.8.1"
}
},
"node_modules/@badrap/valita": {
"version": "0.4.6",
"resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.4.6.tgz",
"integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==",
"license": "MIT",
"engines": {
"node": ">= 18"
}
},
"node_modules/@noble/curves": {
"version": "1.9.7",
"resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.7.tgz",
"integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==",
"license": "MIT",
"dependencies": {
"@noble/hashes": "1.8.0"
},
"engines": {
"node": "^14.21.3 || >=16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@noble/hashes": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
"integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
"license": "MIT",
"engines": {
"node": "^14.21.3 || >=16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@skyware/bot": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/@skyware/bot/-/bot-0.4.1.tgz",
"integrity": "sha512-s4+n02sVSRXebjaV4Grea4tpYCvpijje+/8UnmrVcfD/A26+O769NtjP7LlISGZvGL9FL3TpcEaJWBoa2roq/g==",
"license": "MPL-2.0",
"dependencies": {
"@atcute/atproto": "^3.1.1",
"@atcute/bluesky": "^3.2.0",
"@atcute/bluesky-richtext-builder": "^2.0.3",
"@atcute/client": "^4.0.3",
"@atcute/lexicons": "^1.1.0",
"@atcute/ozone": "^3.1.3",
"quick-lru": "^7.0.0", "quick-lru": "^7.0.0",
"rate-limit-threshold": "^0.1.5" "rate-limit-threshold": "^0.1.5"
}, },
"optionalDependencies": { "optionalDependencies": {
"@skyware/firehose": "^0.3.2", "@skyware/firehose": "^0.5.2",
"@skyware/jetstream": "^0.1.9" "@skyware/jetstream": "^0.2.5"
} }
}, },
"node_modules/@skyware/firehose": { "node_modules/@skyware/firehose": {
"version": "0.3.2", "version": "0.5.2",
"resolved": "https://registry.npmjs.org/@skyware/firehose/-/firehose-0.3.2.tgz", "resolved": "https://registry.npmjs.org/@skyware/firehose/-/firehose-0.5.2.tgz",
"integrity": "sha512-CmRaw3lFPEd9euFGV+K/n/TF/o0Rre87oJP5pswC8IExj/qQnWVoncIulAJbL3keUCm5mlt49jCiiqfQXVjigg==", "integrity": "sha512-Ayg/cF0BkakBNQVA51ClDka0+nC96WiARNrGElMQxfqbwao0PBaCXkunfr8qS4DWS3TqLnR6hA9mvm1vAYlxJQ==",
"license": "MPL-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@atcute/car": "^1.1.0", "@atcute/car": "^3.0.3",
"@atcute/cbor": "^1.0.3", "@atcute/cbor": "^2.2.2",
"ws": "^8.16.0" "nanoevents": "^9.1.0"
} }
}, },
"node_modules/@skyware/jetstream": { "node_modules/@skyware/jetstream": {
"version": "0.1.9", "version": "0.2.5",
"resolved": "https://registry.npmjs.org/@skyware/jetstream/-/jetstream-0.1.9.tgz", "resolved": "https://registry.npmjs.org/@skyware/jetstream/-/jetstream-0.2.5.tgz",
"integrity": "sha512-87NGqRSmEYmvEuVY0DKZ2ZRbL72tExtDuV+PDvywYqukSp3F/it+9wnU5Xb/Is/pf+KSbd6lWvrnE31HgxJpJg==", "integrity": "sha512-fM/zs03DLwqRyzZZJFWN20e76KrdqIp97Tlm8Cek+vxn96+tu5d/fx79V6H85L0QN6HvGiX2l9A8hWFqHvYlOA==",
"license": "MPL-2.0",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"@atcute/bluesky": "^1.0.6", "@atcute/atproto": "^3.1.0",
"partysocket": "^1.0.2" "@atcute/bluesky": "^3.1.4",
"@atcute/lexicons": "^1.1.0",
"partysocket": "^1.1.3",
"tiny-emitter": "^2.1.0"
} }
}, },
"node_modules/@standard-schema/spec": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
"license": "MIT"
},
"node_modules/dotenv": { "node_modules/dotenv": {
"version": "16.4.5", "version": "17.4.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.1.tgz",
"integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "integrity": "sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==",
"license": "BSD-2-Clause",
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@@ -132,31 +322,58 @@
"url": "https://dotenvx.com" "url": "https://dotenvx.com"
} }
}, },
"node_modules/event-target-shim": { "node_modules/esm-env": {
"version": "6.0.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-6.0.2.tgz", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
"integrity": "sha512-8q3LsZjRezbFZ2PN+uP+Q7pnHUMmAOziU2vA2OwoFaKIXxlxl38IylhSSgUorWu/rf4er67w0ikBqjBFk/pomA==", "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
"license": "MIT"
},
"node_modules/event-target-polyfill": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/event-target-polyfill/-/event-target-polyfill-0.0.4.tgz",
"integrity": "sha512-Gs6RLjzlLRdT8X9ZipJdIZI/Y6/HhRLyq9RdDlCsnpxr/+Nn6bU2EFGuC94GjxqhM+Nmij2Vcq98yoHrU8uNFQ==",
"license": "MIT",
"optional": true
},
"node_modules/multiformats": {
"version": "9.9.0",
"resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz",
"integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==",
"license": "(Apache-2.0 AND MIT)"
},
"node_modules/nanoevents": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/nanoevents/-/nanoevents-9.1.0.tgz",
"integrity": "sha512-Jd0fILWG44a9luj8v5kED4WI+zfkkgwKyRQKItTtlPfEsh7Lznfi1kr8/iZ+XAIss4Qq5GqRB0qtWbaz9ceO/A==",
"license": "MIT",
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=10.13.0" "node": "^18.0.0 || >=20.0.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
} }
}, },
"node_modules/partysocket": { "node_modules/partysocket": {
"version": "1.0.2", "version": "1.1.16",
"resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.0.2.tgz", "resolved": "https://registry.npmjs.org/partysocket/-/partysocket-1.1.16.tgz",
"integrity": "sha512-rAFOUKImaq+VBk2B+2RTBsWEvlnarEP53nchoUHzpVs8V6fG2/estihOTslTQUWHVuHEKDL5k8htG8K3TngyFA==", "integrity": "sha512-d7xFv+ZC7x0p/DAHWJ5FhxQhimIx+ucyZY+kxL0cKddLBmK9c4p2tEA/L+dOOrWm6EYrRwrBjKQV0uSzOY9x1w==",
"license": "MIT",
"optional": true, "optional": true,
"dependencies": { "dependencies": {
"event-target-shim": "^6.0.2" "event-target-polyfill": "^0.0.4"
},
"peerDependencies": {
"react": ">=17"
},
"peerDependenciesMeta": {
"react": {
"optional": true
}
} }
}, },
"node_modules/quick-lru": { "node_modules/quick-lru": {
"version": "7.0.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.0.0.tgz", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.3.0.tgz",
"integrity": "sha512-MX8gB7cVYTrYcFfAnfLlhRd0+Toyl8yX8uBx1MrX7K0jegiz9TumwOK27ldXrgDlHRdVi+MqU9Ssw6dr4BNreg==", "integrity": "sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==",
"license": "MIT",
"engines": { "engines": {
"node": ">=18" "node": ">=18"
}, },
@@ -168,29 +385,59 @@
"version": "0.1.5", "version": "0.1.5",
"resolved": "https://registry.npmjs.org/rate-limit-threshold/-/rate-limit-threshold-0.1.5.tgz", "resolved": "https://registry.npmjs.org/rate-limit-threshold/-/rate-limit-threshold-0.1.5.tgz",
"integrity": "sha512-75vpvXC/ZqQJrFDp0dVtfoXZi8kxQP2eBuxVYFvGDfnHhcgE+ZG870u4ItQhWQh54Y6nNwOaaq5g3AL9n27lTg==", "integrity": "sha512-75vpvXC/ZqQJrFDp0dVtfoXZi8kxQP2eBuxVYFvGDfnHhcgE+ZG870u4ItQhWQh54Y6nNwOaaq5g3AL9n27lTg==",
"license": "MIT",
"engines": { "engines": {
"node": "^14.13.1 || >=16.0.0" "node": "^14.13.1 || >=16.0.0"
} }
}, },
"node_modules/ws": { "node_modules/tiny-emitter": {
"version": "8.18.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
"license": "MIT",
"optional": true
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/uint8arrays": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz",
"integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==",
"license": "MIT",
"dependencies": {
"multiformats": "^9.4.2"
}
},
"node_modules/unicode-segmenter": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/unicode-segmenter/-/unicode-segmenter-0.14.5.tgz",
"integrity": "sha512-jHGmj2LUuqDcX3hqY12Ql+uhUTn8huuxNZGq7GvtF6bSybzH3aFgedYu/KTzQStEgt1Ra2F3HxadNXsNjb3m3g==",
"license": "MIT"
},
"node_modules/yocto-queue": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
"integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
"license": "MIT",
"optional": true, "optional": true,
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=12.20"
}, },
"peerDependencies": { "funding": {
"bufferutil": "^4.0.1", "url": "https://github.com/sponsors/sindresorhus"
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
} }
},
"node_modules/zod": {
"version": "3.25.76",
"resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
"integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
} }
} }
} }
+3 -2
View File
@@ -1,6 +1,7 @@
{ {
"dependencies": { "dependencies": {
"@skyware/bot": "^0.3.7", "@atproto/identity": "^0.4.12",
"dotenv": "^16.4.5" "@skyware/bot": "^0.4.1",
"dotenv": "^17.4.1"
} }
} }