Skip to content

Commit

Permalink
Merge pull request #42 from snow-actions/refactoring
Browse files Browse the repository at this point in the history
Refactoring
  • Loading branch information
SnowCait authored Jul 8, 2023
2 parents d1d366a + 0ff3ffa commit e1318b9
Show file tree
Hide file tree
Showing 12 changed files with 9,085 additions and 4,687 deletions.
13,098 changes: 8,477 additions & 4,621 deletions dist/index.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dist/index.js.map

Large diffs are not rendered by default.

409 changes: 395 additions & 14 deletions dist/licenses.txt

Large diffs are not rendered by default.

Binary file added dist/prebuilds/linux-x64/node.napi.node
Binary file not shown.
Binary file added dist/prebuilds/linux-x64/node.napi1.node
Binary file not shown.
Binary file added dist/prebuilds/win32-x64/node.napi.node
Binary file not shown.
Binary file added dist/prebuilds/win32-x64/node.napi1.node
Binary file not shown.
8 changes: 3 additions & 5 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
const core = require('@actions/core');
const { createMessage, postMessage } = require('./nostr');
const { createEvent, publishEvent } = require('./nostr');

async function run() {
try {
Expand All @@ -8,10 +8,8 @@ async function run() {
const privateKey = core.getInput('private-key');
const content = core.getInput('content');
core.setSecret(privateKey);
const message = await createMessage(privateKey, content);
for (const relay of relays) {
await postMessage(relay, message);
}
const event = createEvent(privateKey, content);
await publishEvent(relays, event);
} catch (error) {
core.setFailed(error.message);
}
Expand Down
72 changes: 36 additions & 36 deletions nostr.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
const { nip19, getPublicKey, getEventHash, signEvent } = require('nostr-tools');
require('websocket-polyfill');
const { nip19, getPublicKey, getEventHash, signEvent, SimplePool } = require('nostr-tools');
const { setTimeout } = require('node:timers/promises');
const WebSocket = require('ws');

/**
* @param {string} privateKey
* @param {string} content
*/
module.exports.createMessage = async (privateKey, content) => {
module.exports.createEvent = (privateKey, content) => {
if (privateKey.startsWith('nsec')) {
privateKey = nip19.decode(privateKey).data;
}
Expand All @@ -21,51 +21,51 @@ module.exports.createMessage = async (privateKey, content) => {
content,
pubkey: getPublicKey(privateKey),
};
console.log(event);
event.id = getEventHash(event);
event.sig = signEvent(event, privateKey);

const message = JSON.stringify([
'EVENT',
event,
]);
console.info(message);
console.log('[event]', event);

return message;
return event;
};

/**
* @param {string} relay
* @param {object} message
* @param {string[]} relays
* @param {Event} event
*/
module.exports.postMessage = (relay, message) => {
console.info(`Connect to ${relay}`);
module.exports.publishEvent = (relays, event) => {
console.log('[publish]', relays, event);

return new Promise((resolve, reject) => {
// Timeout in 3 seconds
return new Promise((resolve) => {
const pool = new SimplePool();
const publishedRelays = [];
const close = () => {
console.log('[close]');
pool.close(relays);
resolve();
}
const closeIfCompleted = () => {
console.log('[ok | failed]', relays.length, publishedRelays.length);
if (relays.length === publishedRelays.length) {
close()
}
};
setTimeout(() => {
reject('Timed out');
}, 3000);
console.warn('[timeout]', relays, publishedRelays);
close();
}, 5000);

const ws = new WebSocket(relay);
ws.on('error', data => {
console.error('Error');
reject(data);
});
ws.on('open', () => {
console.info('Opened');
ws.send(message);
const start = Date.now();
const pub = pool.publish(relays, event);
pub.on('ok', relay => {
console.info('[ok]', relay, `${Date.now() - start}ms`);
publishedRelays.push(relay);
closeIfCompleted();
});
ws.on('message', json => {
console.info('Message');
const data = JSON.parse(json);
console.info(data);
const [ messageType ] = data;
if (messageType !== 'OK') {
reject(json);
}
ws.close();
resolve();
pub.on('failed', relay => {
console.warn('[failed]', relay, `${Date.now() - start}ms`);
publishedRelays.push(relay);
closeIfCompleted();
});
});
};
18 changes: 8 additions & 10 deletions nostr.test.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
const { createMessage, postMessage } = require('./nostr');
const { createEvent, publishEvent } = require('./nostr');
require('dotenv').config();

test('test createMessage', async () => {
test('createEvent', async () => {
const privateKey = process.env.NOSTR_PRIVATE_KEY;
const content = 'test';
const message = await createMessage(privateKey, content);
const [ type, event ] = JSON.parse(message);
expect(type).toBe('EVENT');
const event = createEvent(privateKey, content);
expect(event).toHaveProperty('id');
expect(event).toHaveProperty('pubkey');
expect(event).toHaveProperty('created_at');
Expand All @@ -17,12 +15,12 @@ test('test createMessage', async () => {
expect(event.content).toBe(content);
});

test('test', async () => {
test('publishEvent', async () => {
const relays = process.env.NOSTR_RELAYS.split("\n").map(x => x.trim()).filter(x => x.startsWith('wss://'));
const privateKey = process.env.NOSTR_PRIVATE_KEY;
expect(privateKey).toBeDefined();
expect(privateKey).not.toBe('');
const content = 'test';
const message = await createMessage(privateKey, content);
for (const relay of relays) {
await postMessage(relay, message);
}
const event = createEvent(privateKey, content);
await publishEvent(relays, event);
});
Loading

0 comments on commit e1318b9

Please sign in to comment.