@anodb/core 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/main.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@anodb/core",
3
- "version": "0.10.0",
4
- "description": "Absolutely No DB — a decentralized, local-first database over Nostr. Zero servers to run. Zero servers to trust.",
3
+ "version": "0.10.1",
4
+ "description": "Absolutely No DB \u2014 a decentralized, local-first database over Nostr. Zero servers to run. Zero servers to trust.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "show-ritz",
@@ -46,7 +46,7 @@
46
46
  ],
47
47
  "sideEffects": false,
48
48
  "scripts": {
49
- "build": "tsc -p tsconfig.build.json",
49
+ "build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.build.json",
50
50
  "typecheck": "tsc --noEmit",
51
51
  "test": "vitest run",
52
52
  "test:watch": "vitest",
@@ -1,31 +0,0 @@
1
- import type { ColumnType, EventTemplate, NostrEvent, SqlValue, TableDefinition } from './types.js';
2
- /** Marker stored on public table definitions (symbol, so it is not a column). */
3
- export declare const PUBLIC: unique symbol;
4
- export type PresetName = 'note' | 'profile' | 'follows' | 'reaction' | 'longForm';
5
- export type PublicRow = Record<string, SqlValue> & {
6
- id: string;
7
- author: string;
8
- };
9
- export interface Preset {
10
- readonly kind: number;
11
- readonly columns: Readonly<Record<string, ColumnType>>;
12
- /** How a newer event of the same author (and address) replaces older rows. */
13
- readonly replace: 'none' | 'author' | 'address';
14
- /** Rows represented by an event. */
15
- rows(e: NostrEvent): PublicRow[];
16
- /**
17
- * Event(s) to publish for a change of `row` (after the change), given all current rows of this
18
- * author in the table (`mine`, already reflecting the change). `deleted` = the row was deleted.
19
- */
20
- build(row: PublicRow, mine: PublicRow[], deleted: boolean): EventTemplate[];
21
- /** Address (for replace = 'address') of an event. */
22
- address?(e: NostrEvent): string;
23
- }
24
- export declare const presets: Record<PresetName, Preset>;
25
- /** Declare a table that mirrors standard Nostr events (readable/writable by any Nostr client). */
26
- export declare function publicTable<P extends PresetName>(preset: P): (typeof presets)[P]['columns'] & {
27
- readonly [PUBLIC]: P;
28
- };
29
- export declare function presetOf(def: TableDefinition | undefined): Preset | null;
30
- /** The value of `space` for rows of public tables. */
31
- export declare const PUBLIC_SPACE = "public";
@@ -1,186 +0,0 @@
1
- /** Marker stored on public table definitions (symbol, so it is not a column). */
2
- export const PUBLIC = Symbol.for('anodb.public');
3
- const now = () => Math.floor(Date.now() / 1000);
4
- const tagValue = (e, name) => e.tags.find((t) => t[0] === name)?.[1] ?? null;
5
- const str = (v) => (typeof v === 'string' ? v : null);
6
- const parseTags = (v) => {
7
- if (typeof v !== 'string')
8
- return [];
9
- try {
10
- const t = JSON.parse(v);
11
- return Array.isArray(t) ? t.filter((x) => Array.isArray(x) && x.every((y) => typeof y === 'string')) : [];
12
- }
13
- catch {
14
- return [];
15
- }
16
- };
17
- const deletion = (ids, addresses = [], kind) => ({
18
- kind: 5,
19
- created_at: now(),
20
- content: '',
21
- tags: [...ids.map((id) => ['e', id]), ...addresses.map((a) => ['a', a]), ...(kind !== undefined ? [['k', String(kind)]] : [])],
22
- });
23
- export const presets = {
24
- /** kind 1 short text note. */
25
- note: {
26
- kind: 1,
27
- columns: { author: 'text', content: 'text', tags: 'json', replyTo: 'text' },
28
- replace: 'none',
29
- rows: (e) => [
30
- {
31
- id: e.id,
32
- author: e.pubkey,
33
- content: e.content,
34
- tags: JSON.stringify(e.tags),
35
- replyTo: e.tags.find((t) => t[0] === 'e' && t[3] === 'reply')?.[1] ?? null,
36
- },
37
- ],
38
- build(row, _mine, deleted) {
39
- if (deleted)
40
- return [deletion([row.id], [], 1)];
41
- const tags = parseTags(row.tags).filter((t) => !(t[0] === 'e' && t[3] === 'reply'));
42
- const reply = str(row.replyTo);
43
- if (reply)
44
- tags.push(['e', reply, '', 'reply']);
45
- return [{ kind: 1, created_at: now(), content: str(row.content) ?? '', tags }];
46
- },
47
- },
48
- /** kind 0 profile (replaceable). One row per author; `id` = author pubkey. */
49
- profile: {
50
- kind: 0,
51
- columns: {
52
- author: 'text',
53
- name: 'text',
54
- displayName: 'text',
55
- about: 'text',
56
- picture: 'text',
57
- banner: 'text',
58
- website: 'text',
59
- nip05: 'text',
60
- lud16: 'text',
61
- },
62
- replace: 'author',
63
- rows(e) {
64
- let p = {};
65
- try {
66
- const x = JSON.parse(e.content);
67
- if (typeof x === 'object' && x !== null && !Array.isArray(x))
68
- p = x;
69
- }
70
- catch {
71
- /* invalid profile JSON: keep empty fields */
72
- }
73
- const s = (k) => (typeof p[k] === 'string' ? p[k] : null);
74
- return [
75
- {
76
- id: e.pubkey,
77
- author: e.pubkey,
78
- name: s('name'),
79
- displayName: s('display_name') ?? s('displayName'),
80
- about: s('about'),
81
- picture: s('picture'),
82
- banner: s('banner'),
83
- website: s('website'),
84
- nip05: s('nip05'),
85
- lud16: s('lud16'),
86
- },
87
- ];
88
- },
89
- build(row, _mine, deleted) {
90
- if (deleted)
91
- throw new Error('anoDB: a profile cannot be deleted; update its fields instead');
92
- const content = {};
93
- const map = { displayName: 'display_name' };
94
- for (const k of ['name', 'displayName', 'about', 'picture', 'banner', 'website', 'nip05', 'lud16']) {
95
- const v = str(row[k]);
96
- if (v !== null)
97
- content[map[k] ?? k] = v;
98
- }
99
- return [{ kind: 0, created_at: now(), content: JSON.stringify(content), tags: [] }];
100
- },
101
- },
102
- /** kind 3 follow list (replaceable). One row per followed pubkey; `id` = `${author}:${target}`. */
103
- follows: {
104
- kind: 3,
105
- columns: { author: 'text', target: 'text', relay: 'text', petname: 'text' },
106
- replace: 'author',
107
- rows: (e) => e.tags
108
- .filter((t) => t[0] === 'p' && /^[0-9a-f]{64}$/.test(t[1] ?? ''))
109
- .map((t) => ({ id: `${e.pubkey}:${t[1]}`, author: e.pubkey, target: t[1], relay: t[2] || null, petname: t[3] || null })),
110
- build(_row, mine) {
111
- const tags = mine.map((r) => {
112
- const t = ['p', String(r.target)];
113
- if (r.relay || r.petname)
114
- t.push(str(r.relay) ?? '');
115
- if (r.petname)
116
- t.push(String(r.petname));
117
- return t;
118
- });
119
- return [{ kind: 3, created_at: now(), content: '', tags }];
120
- },
121
- },
122
- /** kind 7 reaction. */
123
- reaction: {
124
- kind: 7,
125
- columns: { author: 'text', content: 'text', eventId: 'text', eventAuthor: 'text' },
126
- replace: 'none',
127
- rows: (e) => [{ id: e.id, author: e.pubkey, content: e.content, eventId: tagValue(e, 'e'), eventAuthor: tagValue(e, 'p') }],
128
- build(row, _mine, deleted) {
129
- if (deleted)
130
- return [deletion([row.id], [], 7)];
131
- const tags = [];
132
- if (str(row.eventId))
133
- tags.push(['e', String(row.eventId)]);
134
- if (str(row.eventAuthor))
135
- tags.push(['p', String(row.eventAuthor)]);
136
- return [{ kind: 7, created_at: now(), content: str(row.content) ?? '+', tags }];
137
- },
138
- },
139
- /** kind 30023 long-form article (addressable by `d`); `id` = `${author}:${d}`. */
140
- longForm: {
141
- kind: 30023,
142
- columns: { author: 'text', d: 'text', title: 'text', summary: 'text', image: 'text', content: 'text', publishedAt: 'integer', tags: 'json' },
143
- replace: 'address',
144
- address: (e) => `30023:${e.pubkey}:${tagValue(e, 'd') ?? ''}`,
145
- rows(e) {
146
- const d = tagValue(e, 'd') ?? '';
147
- const published = Number(tagValue(e, 'published_at'));
148
- return [
149
- {
150
- id: `${e.pubkey}:${d}`,
151
- author: e.pubkey,
152
- d,
153
- title: tagValue(e, 'title'),
154
- summary: tagValue(e, 'summary'),
155
- image: tagValue(e, 'image'),
156
- content: e.content,
157
- publishedAt: Number.isSafeInteger(published) ? published : null,
158
- tags: JSON.stringify(e.tags.filter((t) => !['d', 'title', 'summary', 'image', 'published_at'].includes(t[0]))),
159
- },
160
- ];
161
- },
162
- build(row, _mine, deleted) {
163
- const d = str(row.d) ?? '';
164
- if (deleted)
165
- return [deletion([], [`30023:${row.author}:${d}`], 30023)];
166
- const tags = [['d', d]];
167
- for (const k of ['title', 'summary', 'image'])
168
- if (str(row[k]))
169
- tags.push([k, String(row[k])]);
170
- tags.push(['published_at', String(typeof row.publishedAt === 'number' ? row.publishedAt : now())]);
171
- tags.push(...parseTags(row.tags));
172
- return [{ kind: 30023, created_at: now(), content: str(row.content) ?? '', tags }];
173
- },
174
- },
175
- };
176
- /** Declare a table that mirrors standard Nostr events (readable/writable by any Nostr client). */
177
- export function publicTable(preset) {
178
- return Object.assign({ ...presets[preset].columns }, { [PUBLIC]: preset });
179
- }
180
- export function presetOf(def) {
181
- const name = def ? def[PUBLIC] : undefined;
182
- return name ? presets[name] : null;
183
- }
184
- /** The value of `space` for rows of public tables. */
185
- export const PUBLIC_SPACE = 'public';
186
- //# sourceMappingURL=public-tables.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"public-tables.js","sourceRoot":"","sources":["../src/public-tables.ts"],"names":[],"mappings":"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"}
package/dist/public.d.ts DELETED
@@ -1,75 +0,0 @@
1
- import type { Signer } from './signer.js';
2
- import { type Filter, type RelayPool } from './relay-pool.js';
3
- import type { Store } from './store.js';
4
- import type { FetchStatus, NostrEvent } from './types.js';
5
- export declare const KIND_PROFILE = 0;
6
- export declare const KIND_NOTE = 1;
7
- export declare const KIND_RELAY_LIST = 10002;
8
- /** NIP-01 kind 0 metadata. Unknown fields are preserved. */
9
- export interface Profile {
10
- name?: string;
11
- display_name?: string;
12
- about?: string;
13
- picture?: string;
14
- banner?: string;
15
- website?: string;
16
- nip05?: string;
17
- lud16?: string;
18
- [key: string]: unknown;
19
- }
20
- export interface RelayList {
21
- read: string[];
22
- write: string[];
23
- }
24
- export interface Fetched<T> {
25
- value: T | null;
26
- event: NostrEvent | null;
27
- /** `synced`: fresh from relays. `stale`: relays unreachable/empty, cached copy returned. `unavailable`: nothing anywhere. */
28
- status: FetchStatus;
29
- /** When the cached copy was last confirmed (ms), or null. */
30
- fetchedAt: number | null;
31
- }
32
- export interface FetchOptions {
33
- /** Return the cache without asking relays if it is younger than this. Default 10 min. */
34
- maxAgeMs?: number;
35
- timeoutMs?: number;
36
- /** Extra relays to ask. */
37
- relays?: readonly string[];
38
- }
39
- interface Deps {
40
- store: Store;
41
- signer: () => Signer;
42
- pool: RelayPool | null;
43
- discoveryRelays: readonly string[] | undefined;
44
- now: () => number;
45
- enqueue: (event: NostrEvent) => void;
46
- }
47
- /**
48
- * Standard Nostr events (profiles, notes, NIP-65 relay lists): readable and writable by any
49
- * Nostr client. Fetched data is cached in the local SQLite so it is available offline.
50
- */
51
- export declare class PublicData {
52
- #private;
53
- constructor(deps: Deps);
54
- /** Cached kind 0 without touching the network. */
55
- cachedProfile(pubkey: string): Profile | null;
56
- getProfile(pubkey: string, opts?: FetchOptions): Promise<Fetched<Profile>>;
57
- getRelayList(pubkey: string, opts?: FetchOptions): Promise<Fetched<RelayList>>;
58
- /** Recent kind 1 notes by `pubkey`, from the pool and the author's NIP-65 write relays. */
59
- getNotes(pubkey: string, opts?: {
60
- limit?: number;
61
- since?: number;
62
- timeoutMs?: number;
63
- }): Promise<NostrEvent[]>;
64
- /** One-shot query; returns only events with valid signatures. */
65
- fetch(filters: Filter[], opts?: {
66
- relays?: readonly string[];
67
- timeoutMs?: number | undefined;
68
- }): Promise<NostrEvent[]>;
69
- publishProfile(profile: Profile): Promise<NostrEvent>;
70
- publishNote(content: string, tags?: string[][]): Promise<NostrEvent>;
71
- publishRelayList(list: RelayList): Promise<NostrEvent>;
72
- }
73
- export declare function parseProfile(event: NostrEvent): Profile | null;
74
- export declare function parseRelayList(event: NostrEvent): RelayList;
75
- export {};
package/dist/public.js DELETED
@@ -1,164 +0,0 @@
1
- import { verifySignedEvent } from './crypto.js';
2
- import { DEFAULT_DISCOVERY_RELAYS } from './defaults.js';
3
- import { normalizeRelayUrl } from './relay-pool.js';
4
- export const KIND_PROFILE = 0;
5
- export const KIND_NOTE = 1;
6
- export const KIND_RELAY_LIST = 10002;
7
- /**
8
- * Standard Nostr events (profiles, notes, NIP-65 relay lists): readable and writable by any
9
- * Nostr client. Fetched data is cached in the local SQLite so it is available offline.
10
- */
11
- export class PublicData {
12
- #d;
13
- constructor(deps) {
14
- this.#d = deps;
15
- }
16
- // ---- read ------------------------------------------------------------------
17
- /** Cached kind 0 without touching the network. */
18
- cachedProfile(pubkey) {
19
- const c = this.#d.store.getPublic(pubkey, KIND_PROFILE);
20
- return c ? parseProfile(c.event) : null;
21
- }
22
- async getProfile(pubkey, opts = {}) {
23
- const r = await this.#getReplaceable(pubkey, KIND_PROFILE, opts, true);
24
- return { ...r, value: r.event ? parseProfile(r.event) : null };
25
- }
26
- async getRelayList(pubkey, opts = {}) {
27
- const r = await this.#getReplaceable(pubkey, KIND_RELAY_LIST, opts, false);
28
- return { ...r, value: r.event ? parseRelayList(r.event) : null };
29
- }
30
- /** Recent kind 1 notes by `pubkey`, from the pool and the author's NIP-65 write relays. */
31
- async getNotes(pubkey, opts = {}) {
32
- const relays = await this.#authorRelays(pubkey, opts.timeoutMs);
33
- const filter = { kinds: [KIND_NOTE], authors: [pubkey], limit: opts.limit ?? 20 };
34
- if (opts.since !== undefined)
35
- filter.since = opts.since;
36
- const events = await this.fetch([filter], { relays, timeoutMs: opts.timeoutMs });
37
- return events.sort((a, b) => b.created_at - a.created_at || (a.id < b.id ? -1 : 1)).slice(0, filter.limit);
38
- }
39
- /** One-shot query; returns only events with valid signatures. */
40
- async fetch(filters, opts = {}) {
41
- const pool = this.#d.pool;
42
- if (!pool)
43
- return [];
44
- const q = {};
45
- if (opts.relays)
46
- q.relays = opts.relays;
47
- if (opts.timeoutMs !== undefined)
48
- q.timeoutMs = opts.timeoutMs;
49
- const events = await pool.query(filters, q);
50
- return events.filter(verifySignedEvent);
51
- }
52
- async #getReplaceable(pubkey, kind, opts, discover) {
53
- const { store, now } = this.#d;
54
- const cached = store.getPublic(pubkey, kind);
55
- const maxAge = opts.maxAgeMs ?? 10 * 60_000;
56
- if (cached && now() - cached.fetchedAt < maxAge) {
57
- return { event: cached.event, status: 'synced', fetchedAt: cached.fetchedAt };
58
- }
59
- let relays = this.#baseRelays(opts.relays);
60
- if (discover)
61
- relays = unique([...relays, ...(await this.#authorRelays(pubkey, opts.timeoutMs))]);
62
- const events = (await this.fetch([{ kinds: [kind], authors: [pubkey] }], { relays, timeoutMs: opts.timeoutMs }))
63
- .filter((e) => e.pubkey === pubkey && e.kind === kind);
64
- const best = newest(events);
65
- if (best) {
66
- const t = now();
67
- store.putPublic(best, pubkey, kind, t);
68
- const after = store.getPublic(pubkey, kind);
69
- return { event: after.event, status: 'synced', fetchedAt: t };
70
- }
71
- if (cached)
72
- return { event: cached.event, status: 'stale', fetchedAt: cached.fetchedAt };
73
- return { event: null, status: 'unavailable', fetchedAt: null };
74
- }
75
- /** Pool relays + discovery relays + the author's NIP-65 write relays. */
76
- async #authorRelays(pubkey, timeoutMs) {
77
- const opts = {};
78
- if (timeoutMs !== undefined)
79
- opts.timeoutMs = timeoutMs;
80
- const list = await this.getRelayList(pubkey, opts);
81
- return unique([...this.#baseRelays(), ...(list.value?.write ?? [])]);
82
- }
83
- #baseRelays(extra = []) {
84
- const pool = this.#d.pool?.relays ?? [];
85
- return unique([...pool, ...(this.#d.discoveryRelays ?? DEFAULT_DISCOVERY_RELAYS), ...extra]);
86
- }
87
- // ---- write -----------------------------------------------------------------
88
- // Signed with the owner key and delivered through the durable outbox.
89
- async publishProfile(profile) {
90
- const event = await this.#sign(KIND_PROFILE, JSON.stringify(profile), []);
91
- this.#d.store.putPublic(event, event.pubkey, KIND_PROFILE, this.#d.now());
92
- this.#d.enqueue(event);
93
- return event;
94
- }
95
- async publishNote(content, tags = []) {
96
- const event = await this.#sign(KIND_NOTE, content, tags);
97
- this.#d.enqueue(event);
98
- return event;
99
- }
100
- async publishRelayList(list) {
101
- const read = new Set(list.read.map(normalizeRelayUrl));
102
- const write = new Set(list.write.map(normalizeRelayUrl));
103
- const tags = [];
104
- for (const r of unique([...read, ...write])) {
105
- if (read.has(r) && write.has(r))
106
- tags.push(['r', r]);
107
- else
108
- tags.push(['r', r, read.has(r) ? 'read' : 'write']);
109
- }
110
- const event = await this.#sign(KIND_RELAY_LIST, '', tags);
111
- this.#d.store.putPublic(event, event.pubkey, KIND_RELAY_LIST, this.#d.now());
112
- this.#d.enqueue(event);
113
- return event;
114
- }
115
- #sign(kind, content, tags) {
116
- return this.#d.signer().signEvent({ kind, content, tags, created_at: Math.floor(this.#d.now() / 1000) });
117
- }
118
- }
119
- function newest(events) {
120
- // NIP-01: highest created_at wins; ties broken by lowest id.
121
- return events.reduce((best, e) => (!best || e.created_at > best.created_at || (e.created_at === best.created_at && e.id < best.id) ? e : best), undefined);
122
- }
123
- function unique(urls) {
124
- const out = new Set();
125
- for (const u of urls) {
126
- try {
127
- out.add(normalizeRelayUrl(u));
128
- }
129
- catch {
130
- /* skip malformed relay URLs from untrusted relay lists */
131
- }
132
- }
133
- return [...out];
134
- }
135
- export function parseProfile(event) {
136
- try {
137
- const p = JSON.parse(event.content);
138
- return typeof p === 'object' && p !== null && !Array.isArray(p) ? p : null;
139
- }
140
- catch {
141
- return null;
142
- }
143
- }
144
- export function parseRelayList(event) {
145
- const read = [];
146
- const write = [];
147
- for (const t of event.tags) {
148
- if (t[0] !== 'r' || typeof t[1] !== 'string')
149
- continue;
150
- let url;
151
- try {
152
- url = normalizeRelayUrl(t[1]);
153
- }
154
- catch {
155
- continue;
156
- }
157
- if (t[2] !== 'write')
158
- read.push(url);
159
- if (t[2] !== 'read')
160
- write.push(url);
161
- }
162
- return { read, write };
163
- }
164
- //# sourceMappingURL=public.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../src/public.ts"],"names":[],"mappings":"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"}