mirror of
https://gitlab.com/soapbox-pub/ditto.git
synced 2025-12-06 03:19:46 +00:00
Ugrade to Deno 2.0
This commit is contained in:
parent
cccb3ad8d7
commit
cd66234af7
6 changed files with 12 additions and 137 deletions
|
|
@ -1,4 +1,4 @@
|
|||
image: denoland/deno:1.46.3
|
||||
image: denoland/deno:2.0.0-rc.4
|
||||
|
||||
default:
|
||||
interruptible: true
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ async function exportEvents(args: ExportFilter) {
|
|||
let filter: NostrFilter = {};
|
||||
try {
|
||||
filter = buildFilter(args);
|
||||
} catch (e) {
|
||||
} catch (e: any) {
|
||||
die(1, e.message || e.toString());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
});
|
||||
|
|
@ -59,7 +59,7 @@ class EventsDB extends NPostgres {
|
|||
}
|
||||
|
||||
/** 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);
|
||||
this.console.debug('EVENT', JSON.stringify(event));
|
||||
dbEventsCounter.inc({ kind: event.kind });
|
||||
|
|
@ -72,7 +72,7 @@ class EventsDB extends NPostgres {
|
|||
|
||||
try {
|
||||
await super.event(event, { ...opts, timeout: opts.timeout ?? this.opts.timeout });
|
||||
} catch (e) {
|
||||
} catch (e: any) {
|
||||
if (e.message === 'Cannot add a deleted event') {
|
||||
throw new RelayError('blocked', 'event deleted by user');
|
||||
} 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) {
|
||||
const tokens = NIP50.parseInput(filter.search);
|
||||
|
||||
|
|
@ -172,7 +172,7 @@ class EventsDB extends NPostgres {
|
|||
}
|
||||
|
||||
/** Get events for filters from the database. */
|
||||
async query(
|
||||
override async query(
|
||||
filters: NostrFilter[],
|
||||
opts: { signal?: AbortSignal; timeout?: number; limit?: number } = {},
|
||||
): Promise<NostrEvent[]> {
|
||||
|
|
@ -200,13 +200,13 @@ class EventsDB extends NPostgres {
|
|||
}
|
||||
|
||||
/** 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));
|
||||
return super.remove(filters, { ...opts, timeout: opts.timeout ?? this.opts.timeout });
|
||||
}
|
||||
|
||||
/** Get number of events that would be returned by filters. */
|
||||
async count(
|
||||
override async count(
|
||||
filters: NostrFilter[],
|
||||
opts: { signal?: AbortSignal; timeout?: number } = {},
|
||||
): Promise<{ count: number; approximate: any }> {
|
||||
|
|
@ -218,7 +218,7 @@ class EventsDB extends NPostgres {
|
|||
}
|
||||
|
||||
/** Return only the tags that should be indexed. */
|
||||
static indexTags(event: NostrEvent): string[][] {
|
||||
static override indexTags(event: NostrEvent): string[][] {
|
||||
const tagCounts: Record<string, number> = {};
|
||||
|
||||
function getCount(name: string) {
|
||||
|
|
@ -325,7 +325,7 @@ class EventsDB extends NPostgres {
|
|||
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>));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ try {
|
|||
adminPubkey: Conf.pubkey,
|
||||
});
|
||||
console.debug(`Using custom policy: ${Conf.policy}`);
|
||||
} catch (e) {
|
||||
} catch (e: any) {
|
||||
if (e.message.includes('Module not found')) {
|
||||
console.debug('Custom policy not found <https://docs.soapbox.pub/ditto/policies/>');
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ export class CustomPolicy implements NPolicy {
|
|||
try {
|
||||
const Policy = (await import(path)).default;
|
||||
this.policy = new Policy({ store });
|
||||
} catch (e) {
|
||||
} catch (e: any) {
|
||||
if (e.message.includes('Module not found')) {
|
||||
this.policy = new NoOpPolicy();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue