Ugrade to Deno 2.0

This commit is contained in:
Alex Gleason 2024-09-22 17:35:04 -05:00
parent cccb3ad8d7
commit cd66234af7
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7
6 changed files with 12 additions and 137 deletions

View file

@ -1,4 +1,4 @@
image: denoland/deno:1.46.3 image: denoland/deno:2.0.0-rc.4
default: default:
interruptible: true interruptible: true

View file

@ -102,7 +102,7 @@ async function exportEvents(args: ExportFilter) {
let filter: NostrFilter = {}; let filter: NostrFilter = {};
try { try {
filter = buildFilter(args); filter = buildFilter(args);
} catch (e) { } catch (e: any) {
die(1, e.message || e.toString()); die(1, e.message || e.toString());
} }

View file

@ -1,125 +0,0 @@
import { assertEquals } from '@std/assert';
import { generateSecretKey } from 'nostr-tools';
import { createTestDB, genEvent } from '@/test.ts';
import { handleZaps } from '@/pipeline.ts';
Deno.test('store one zap receipt in nostr_events; convert it into event_zaps table format and store it', async () => {
await using db = await createTestDB();
const kysely = db.kysely;
const sk = generateSecretKey();
const event = genEvent({
'id': '67b48a14fb66c60c8f9070bdeb37afdfcc3d08ad01989460448e4081eddda446',
'pubkey': '9630f464cca6a5147aa8a35f0bcdd3ce485324e732fd39e09233b1d848238f31',
'created_at': 1674164545,
'kind': 9735,
'tags': [
['p', '32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245'],
['P', '97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322'],
['e', '3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8'],
[
'bolt11',
'lnbc10u1p3unwfusp5t9r3yymhpfqculx78u027lxspgxcr2n2987mx2j55nnfs95nxnzqpp5jmrh92pfld78spqs78v9euf2385t83uvpwk9ldrlvf6ch7tpascqhp5zvkrmemgth3tufcvflmzjzfvjt023nazlhljz2n9hattj4f8jq8qxqyjw5qcqpjrzjqtc4fc44feggv7065fqe5m4ytjarg3repr5j9el35xhmtfexc42yczarjuqqfzqqqqqqqqlgqqqqqqgq9q9qxpqysgq079nkq507a5tw7xgttmj4u990j7wfggtrasah5gd4ywfr2pjcn29383tphp4t48gquelz9z78p4cq7ml3nrrphw5w6eckhjwmhezhnqpy6gyf0',
],
[
'description',
'{"pubkey":"97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322","content":"","id":"d9cc14d50fcb8c27539aacf776882942c1a11ea4472f8cdec1dea82fab66279d","created_at":1674164539,"sig":"77127f636577e9029276be060332ea565deaf89ff215a494ccff16ae3f757065e2bc59b2e8c113dd407917a010b3abd36c8d7ad84c0e3ab7dab3a0b0caa9835d","kind":9734,"tags":[["e","3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8"],["p","32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],["relays","wss://relay.damus.io","wss://nostr-relay.wlvs.space","wss://nostr.fmt.wiz.biz","wss://relay.nostr.bg","wss://nostr.oxtr.dev","wss://nostr.v0l.io","wss://brb.io","wss://nostr.bitcoiner.social","ws://monad.jb55.com:8080","wss://relay.snort.social"]]}',
],
['preimage', '5d006d2cf1e73c7148e7519a4c68adc81642ce0e25a432b2434c99f97344c15f'],
],
'content': '',
}, sk);
await db.store.event(event);
await handleZaps(kysely, event);
await handleZaps(kysely, event);
const zapReceipts = await db.store.query([{}]);
const customEventZaps = await kysely.selectFrom('event_zaps').selectAll().execute();
assertEquals(zapReceipts.length, 1); // basic check
assertEquals(customEventZaps.length, 1); // basic check
const expected = {
receipt_id: event.id,
target_event_id: '3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8',
sender_pubkey: '97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322',
amount_millisats: 1000000,
comment: '',
};
assertEquals(customEventZaps[0], expected);
});
// The function tests below only handle the edge cases and don't assert anything
// If no error happens = ok
Deno.test('zap receipt does not have a "description" tag', async () => {
await using db = await createTestDB();
const kysely = db.kysely;
const sk = generateSecretKey();
const event = genEvent({ kind: 9735 }, sk);
await handleZaps(kysely, event);
// no error happened = ok
});
Deno.test('zap receipt does not have a zap request stringified value in the "description" tag', async () => {
await using db = await createTestDB();
const kysely = db.kysely;
const sk = generateSecretKey();
const event = genEvent({ kind: 9735, tags: [['description', 'yolo']] }, sk);
await handleZaps(kysely, event);
// no error happened = ok
});
Deno.test('zap receipt does not have a "bolt11" tag', async () => {
await using db = await createTestDB();
const kysely = db.kysely;
const sk = generateSecretKey();
const event = genEvent({
kind: 9735,
tags: [[
'description',
'{"pubkey":"97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322","content":"","id":"d9cc14d50fcb8c27539aacf776882942c1a11ea4472f8cdec1dea82fab66279d","created_at":1674164539,"sig":"77127f636577e9029276be060332ea565deaf89ff215a494ccff16ae3f757065e2bc59b2e8c113dd407917a010b3abd36c8d7ad84c0e3ab7dab3a0b0caa9835d","kind":9734,"tags":[["e","3624762a1274dd9636e0c552b53086d70bc88c165bc4dc0f9e836a1eaf86c3b8"],["p","32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],["relays","wss://relay.damus.io","wss://nostr-relay.wlvs.space","wss://nostr.fmt.wiz.biz","wss://relay.nostr.bg","wss://nostr.oxtr.dev","wss://nostr.v0l.io","wss://brb.io","wss://nostr.bitcoiner.social","ws://monad.jb55.com:8080","wss://relay.snort.social"]]}',
]],
}, sk);
await handleZaps(kysely, event);
// no error happened = ok
});
Deno.test('zap request inside zap receipt does not have an "e" tag', async () => {
await using db = await createTestDB();
const kysely = db.kysely;
const sk = generateSecretKey();
const event = genEvent({
kind: 9735,
tags: [[
'bolt11',
'lnbc10u1p3unwfusp5t9r3yymhpfqculx78u027lxspgxcr2n2987mx2j55nnfs95nxnzqpp5jmrh92pfld78spqs78v9euf2385t83uvpwk9ldrlvf6ch7tpascqhp5zvkrmemgth3tufcvflmzjzfvjt023nazlhljz2n9hattj4f8jq8qxqyjw5qcqpjrzjqtc4fc44feggv7065fqe5m4ytjarg3repr5j9el35xhmtfexc42yczarjuqqfzqqqqqqqqlgqqqqqqgq9q9qxpqysgq079nkq507a5tw7xgttmj4u990j7wfggtrasah5gd4ywfr2pjcn29383tphp4t48gquelz9z78p4cq7ml3nrrphw5w6eckhjwmhezhnqpy6gyf0',
], [
'description',
'{"pubkey":"97c70a44366a6535c145b333f973ea86dfdc2d7a99da618c40c64705ad98e322","content":"","id":"d9cc14d50fcb8c27539aacf776882942c1a11ea4472f8cdec1dea82fab66279d","created_at":1674164539,"sig":"77127f636577e9029276be060332ea565deaf89ff215a494ccff16ae3f757065e2bc59b2e8c113dd407917a010b3abd36c8d7ad84c0e3ab7dab3a0b0caa9835d","kind":9734,"tags":[["p","32e1827635450ebb3c5a7d12c1f8e7b2b514439ac10a67eef3d9fd9c5c68e245"],["relays","wss://relay.damus.io","wss://nostr-relay.wlvs.space","wss://nostr.fmt.wiz.biz","wss://relay.nostr.bg","wss://nostr.oxtr.dev","wss://nostr.v0l.io","wss://brb.io","wss://nostr.bitcoiner.social","ws://monad.jb55.com:8080","wss://relay.snort.social"]]}',
]],
}, sk);
await handleZaps(kysely, event);
// no error happened = ok
});

View file

@ -59,7 +59,7 @@ class EventsDB extends NPostgres {
} }
/** Insert an event (and its tags) into the database. */ /** Insert an event (and its tags) into the database. */
async event(event: NostrEvent, opts: { signal?: AbortSignal; timeout?: number } = {}): Promise<void> { override async event(event: NostrEvent, opts: { signal?: AbortSignal; timeout?: number } = {}): Promise<void> {
event = purifyEvent(event); event = purifyEvent(event);
this.console.debug('EVENT', JSON.stringify(event)); this.console.debug('EVENT', JSON.stringify(event));
dbEventsCounter.inc({ kind: event.kind }); dbEventsCounter.inc({ kind: event.kind });
@ -72,7 +72,7 @@ class EventsDB extends NPostgres {
try { try {
await super.event(event, { ...opts, timeout: opts.timeout ?? this.opts.timeout }); await super.event(event, { ...opts, timeout: opts.timeout ?? this.opts.timeout });
} catch (e) { } catch (e: any) {
if (e.message === 'Cannot add a deleted event') { if (e.message === 'Cannot add a deleted event') {
throw new RelayError('blocked', 'event deleted by user'); throw new RelayError('blocked', 'event deleted by user');
} else if (e.message === 'Cannot replace an event with an older event') { } else if (e.message === 'Cannot replace an event with an older event') {
@ -144,7 +144,7 @@ class EventsDB extends NPostgres {
} }
} }
protected getFilterQuery(trx: Kysely<NPostgresSchema>, filter: NostrFilter) { protected override getFilterQuery(trx: Kysely<NPostgresSchema>, filter: NostrFilter) {
if (filter.search) { if (filter.search) {
const tokens = NIP50.parseInput(filter.search); const tokens = NIP50.parseInput(filter.search);
@ -172,7 +172,7 @@ class EventsDB extends NPostgres {
} }
/** Get events for filters from the database. */ /** Get events for filters from the database. */
async query( override async query(
filters: NostrFilter[], filters: NostrFilter[],
opts: { signal?: AbortSignal; timeout?: number; limit?: number } = {}, opts: { signal?: AbortSignal; timeout?: number; limit?: number } = {},
): Promise<NostrEvent[]> { ): Promise<NostrEvent[]> {
@ -200,13 +200,13 @@ class EventsDB extends NPostgres {
} }
/** Delete events based on filters from the database. */ /** Delete events based on filters from the database. */
async remove(filters: NostrFilter[], opts: { signal?: AbortSignal; timeout?: number } = {}): Promise<void> { override async remove(filters: NostrFilter[], opts: { signal?: AbortSignal; timeout?: number } = {}): Promise<void> {
this.console.debug('DELETE', JSON.stringify(filters)); this.console.debug('DELETE', JSON.stringify(filters));
return super.remove(filters, { ...opts, timeout: opts.timeout ?? this.opts.timeout }); return super.remove(filters, { ...opts, timeout: opts.timeout ?? this.opts.timeout });
} }
/** Get number of events that would be returned by filters. */ /** Get number of events that would be returned by filters. */
async count( override async count(
filters: NostrFilter[], filters: NostrFilter[],
opts: { signal?: AbortSignal; timeout?: number } = {}, opts: { signal?: AbortSignal; timeout?: number } = {},
): Promise<{ count: number; approximate: any }> { ): Promise<{ count: number; approximate: any }> {
@ -218,7 +218,7 @@ class EventsDB extends NPostgres {
} }
/** Return only the tags that should be indexed. */ /** Return only the tags that should be indexed. */
static indexTags(event: NostrEvent): string[][] { static override indexTags(event: NostrEvent): string[][] {
const tagCounts: Record<string, number> = {}; const tagCounts: Record<string, number> = {};
function getCount(name: string) { function getCount(name: string) {
@ -325,7 +325,7 @@ class EventsDB extends NPostgres {
return filters; return filters;
} }
async transaction(callback: (store: NPostgres, kysely: Kysely<any>) => Promise<void>): Promise<void> { override async transaction(callback: (store: NPostgres, kysely: Kysely<any>) => Promise<void>): Promise<void> {
return super.transaction((store, kysely) => callback(store, kysely as unknown as Kysely<DittoTables>)); return super.transaction((store, kysely) => callback(store, kysely as unknown as Kysely<DittoTables>));
} }
} }

View file

@ -31,7 +31,7 @@ try {
adminPubkey: Conf.pubkey, adminPubkey: Conf.pubkey,
}); });
console.debug(`Using custom policy: ${Conf.policy}`); console.debug(`Using custom policy: ${Conf.policy}`);
} catch (e) { } catch (e: any) {
if (e.message.includes('Module not found')) { if (e.message.includes('Module not found')) {
console.debug('Custom policy not found <https://docs.soapbox.pub/ditto/policies/>'); console.debug('Custom policy not found <https://docs.soapbox.pub/ditto/policies/>');
} else { } else {

View file

@ -45,7 +45,7 @@ export class CustomPolicy implements NPolicy {
try { try {
const Policy = (await import(path)).default; const Policy = (await import(path)).default;
this.policy = new Policy({ store }); this.policy = new Policy({ store });
} catch (e) { } catch (e: any) {
if (e.message.includes('Module not found')) { if (e.message.includes('Module not found')) {
this.policy = new NoOpPolicy(); this.policy = new NoOpPolicy();
} }