Files
rss-nostr-lambda/index.mjs
T
2023-11-24 08:56:41 -05:00

82 lines
2.1 KiB
JavaScript

import 'websocket-polyfill'
import { extract } from '@extractus/feed-extractor'
import NDK, { NDKEvent, NDKPrivateKeySigner } from '@nostr-dev-kit/ndk'
import bech32 from 'bech32-buffer'
const toHexString = nsec => {
let buffer = bech32.decode(nsec).data
return buffer.reduce((s, byte) => {
let hex = byte.toString(16);
if (hex.length === 1) hex = '0' + hex;
return s + hex;
}, '');
}
export const handler = async (event) => {
const region = process.env.AWS_REGION || "us-east-1"
const feed = event.feedUrl
const privkey = toHexString(event.nostrNsec)
const since = event.since
if (feed === "") {
console.error("feedUrl was not set.")
return {
statusCode: 400,
body: "feedUrl must be provided in payload."
}
}
let response = {
totalItems: 0,
successes: 0,
errors: []
}
const ndk = new NDK({
signer: new NDKPrivateKeySigner(privkey),
explicitRelayUrls: [
"wss://nostr.mom",
"wss://nostr.snort.social",
"wss://nostr.lol"
]
})
const user = await ndk.signer.user()
await ndk.connect(6000).catch(err => {
console.error(err)
response.errors.push ("failed to connect to relay", err)
})
let rss = await extract(feed)
.catch(err => {
console.error(err.error);
return response
})
let filtered = rss.entries.filter(item => Date.parse(item.published) >= Date.parse(since))
response.totalItems = filtered.length
for (let item of filtered) {
let ndkEvent = new NDKEvent(ndk, {
kind: 1,
pubkey: user.hexpubkey,
content: item.title,
created_at: Math.floor(Date.now() / 1000),
})
try {
const published = await ndkEvent.publish()
if (published) {
response.successes++
}
} catch(e) {
console.error(e)
response.errors.push(e)
}
}
return response
}