@ours.network/sdk 3.0.4 → 3.1.0

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.
Files changed (81) hide show
  1. package/README.md +19 -0
  2. package/dist/api/contacts.js +1 -1
  3. package/dist/api/files.js +1 -1
  4. package/dist/api/history.js +1 -1
  5. package/dist/api/identity.js +1 -1
  6. package/dist/api/messaging.js +1 -1
  7. package/dist/api/profile.js +1 -1
  8. package/dist/book.js +1 -1
  9. package/dist/boot.js +1 -1
  10. package/dist/chunk-2X5HGMMO.js +5 -0
  11. package/dist/{chunk-63FBQ35M.js → chunk-2ZQPUBE4.js} +1 -1
  12. package/dist/{chunk-3FAS7737.js → chunk-3CPIRV4P.js} +1 -1
  13. package/dist/{chunk-SQWLTVUX.js → chunk-3ZIC5X5I.js} +1 -1
  14. package/dist/{chunk-IOL6KZNO.js → chunk-4QU3AKO6.js} +1 -1
  15. package/dist/{chunk-L57CP5UJ.js → chunk-5JKYJZAR.js} +1 -1
  16. package/dist/{chunk-VD57XFNA.js → chunk-7Q3OCSPV.js} +1 -1
  17. package/dist/{chunk-6ATIPILE.js → chunk-7ZZWD64L.js} +1 -1
  18. package/dist/chunk-AAXXFRZP.js +4 -0
  19. package/dist/{chunk-XEK46DXF.js → chunk-AH3RIV2J.js} +1 -1
  20. package/dist/{chunk-HBHUWDY3.js → chunk-E34QSIVP.js} +1 -1
  21. package/dist/{chunk-O2K2ME7S.js → chunk-FCQYDCQA.js} +1 -1
  22. package/dist/{chunk-QWAZLLE2.js → chunk-IFCOOPD7.js} +2 -2
  23. package/dist/chunk-MGNMJ64X.js +174 -0
  24. package/dist/chunk-N4N4OLEW.js +2 -0
  25. package/dist/{chunk-6DRJYMF2.js → chunk-P2AAWXWI.js} +1 -1
  26. package/dist/{chunk-S6GRTEIM.js → chunk-PMN5M2JA.js} +1 -1
  27. package/dist/{chunk-TKIAVV2O.js → chunk-RL3OEL5W.js} +1 -1
  28. package/dist/{chunk-JV64HCOG.js → chunk-UZF6OB3R.js} +1 -1
  29. package/dist/{chunk-4EICEZ36.js → chunk-VQTATA4V.js} +1 -1
  30. package/dist/{chunk-CBKH6ILH.js → chunk-W34RPHBG.js} +1 -1
  31. package/dist/{chunk-FMQOOSOQ.js → chunk-WBCVUXOI.js} +1 -1
  32. package/dist/{chunk-MR2LCJLF.js → chunk-WD7K5KPL.js} +1 -1
  33. package/dist/{chunk-ULS3S767.js → chunk-WZQNO4PZ.js} +1 -1
  34. package/dist/chunk-XIWAQH6S.js +61 -0
  35. package/dist/{chunk-FP33FQ2P.js → chunk-XKPZWKI4.js} +1 -1
  36. package/dist/{chunk-RFU57I64.js → chunk-Y77ZVHTD.js} +1 -1
  37. package/dist/{chunk-VH4CORJZ.js → chunk-ZOZFAMAX.js} +1 -1
  38. package/dist/client/http.d.ts +3 -0
  39. package/dist/client/http.js +1 -1
  40. package/dist/client/select.js +1 -1
  41. package/dist/client.d.ts +1 -0
  42. package/dist/client.js +1 -1
  43. package/dist/cluster/control.js +1 -1
  44. package/dist/cluster/manifest.js +1 -1
  45. package/dist/config.d.ts +3 -0
  46. package/dist/config.js +1 -1
  47. package/dist/connector.js +1 -1
  48. package/dist/gc.js +1 -1
  49. package/dist/history-retention.d.ts +37 -0
  50. package/dist/history-retention.js +2 -0
  51. package/dist/history.js +1 -1
  52. package/dist/http/api-routes.js +1 -1
  53. package/dist/http/server.js +1 -1
  54. package/dist/identity/hierarchy.js +1 -1
  55. package/dist/identity/lease.js +1 -1
  56. package/dist/identity/lifecycle.js +1 -1
  57. package/dist/identity/migration.js +1 -1
  58. package/dist/identity/model.js +1 -1
  59. package/dist/identity/provision.js +1 -1
  60. package/dist/identity/reaper.js +1 -1
  61. package/dist/identity/release.js +1 -1
  62. package/dist/identity/staged.js +1 -1
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +1 -1
  65. package/dist/internal/daemon.js +1 -1
  66. package/dist/messaging/send.js +1 -1
  67. package/dist/mufl/handlers.js +1 -1
  68. package/dist/mufl/tx.js +1 -1
  69. package/dist/mufl_code/351F16D444E6DAA252D4A8D829D17204360D9015FEF670ACE68FB4747BB3B14E.muflo +0 -0
  70. package/dist/notify.js +1 -1
  71. package/dist/runtime/config-drift.js +1 -1
  72. package/dist/runtime/env.d.ts +1 -0
  73. package/dist/runtime/env.js +1 -1
  74. package/dist/state.js +1 -1
  75. package/dist/sweeps.js +1 -1
  76. package/dist/uploads.js +1 -1
  77. package/package.json +2 -2
  78. package/dist/chunk-6HS337DC.js +0 -4
  79. package/dist/chunk-EHCBEY52.js +0 -2
  80. package/dist/chunk-TXAIJEXA.js +0 -171
  81. package/dist/chunk-WS6UFNKF.js +0 -5
@@ -1,171 +0,0 @@
1
- import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import{createHash as O,randomUUID as H}from"node:crypto";import*as o from"node:fs";import{dirname as y,join as l,resolve as R,sep as x}from"node:path";import A from"better-sqlite3";var m=200,C=50,b=2*1024*1024,D=8*1024*1024,M="history.sqlite3",N=1,p=new Map,f=new Map,E=new Map,U=t=>l(t.dir,M),Y=t=>l(t.dir,"blobs","sha256");function w(){return{write_failures:0,message_write_failures:0,file_write_failures:0,receipt_update_failures:0,last_failure_at_ms:null}}function $(t){return{...f.get(t.dir)??w()}}function K(t,e,r,s){let i=f.get(t.dir)??w();if(i.write_failures+=1,i.last_failure_at_ms=Date.now(),e==="message"?i.message_write_failures+=1:e==="file"?i.file_write_failures+=1:i.receipt_update_failures+=1,f.set(t.dir,i),s==="out"&&r){let n=E.get(t.dir);n||(n=new Set,E.set(t.dir,n)),n.add(r)}}function Q(t,e){let r=E.get(t.dir);return r?.delete(e)?(r.size===0&&E.delete(t.dir),!0):!1}function F(t){t.exec(`
3
- CREATE TABLE IF NOT EXISTS history_meta (
4
- key TEXT PRIMARY KEY,
5
- value TEXT NOT NULL
6
- );
7
- CREATE TABLE IF NOT EXISTS wire_items (
8
- wire_id TEXT PRIMARY KEY,
9
- item_kind TEXT NOT NULL CHECK (item_kind IN ('message','file'))
10
- );
11
- CREATE TABLE IF NOT EXISTS messages (
12
- seq INTEGER PRIMARY KEY AUTOINCREMENT,
13
- wire_id TEXT NOT NULL UNIQUE,
14
- peer_cid TEXT NOT NULL,
15
- peer_name_snapshot TEXT NOT NULL,
16
- direction TEXT NOT NULL CHECK (direction IN ('in','out')),
17
- body TEXT NOT NULL,
18
- occurred_at_ms INTEGER NOT NULL,
19
- reply_to_wire_id TEXT,
20
- reply_to_sentence INTEGER,
21
- encryption TEXT NOT NULL CHECK (encryption IN ('legacy','e2e')),
22
- inbox_state TEXT NOT NULL CHECK (inbox_state IN ('pending_introduction','unread','read')),
23
- delivery_state TEXT,
24
- human_read_at_ms INTEGER,
25
- inserted_at_ms INTEGER NOT NULL
26
- );
27
- CREATE INDEX IF NOT EXISTS messages_unread_seq ON messages(inbox_state, seq ASC);
28
- CREATE INDEX IF NOT EXISTS messages_peer_seq ON messages(peer_cid, seq DESC);
29
- CREATE TRIGGER IF NOT EXISTS messages_release_wire AFTER DELETE ON messages BEGIN
30
- DELETE FROM wire_items WHERE wire_id = OLD.wire_id AND item_kind = 'message';
31
- END;
32
- CREATE TABLE IF NOT EXISTS files (
33
- seq INTEGER PRIMARY KEY AUTOINCREMENT,
34
- wire_id TEXT NOT NULL UNIQUE,
35
- peer_cid TEXT NOT NULL,
36
- peer_name_snapshot TEXT NOT NULL,
37
- direction TEXT NOT NULL CHECK (direction IN ('in','out')),
38
- filename TEXT NOT NULL,
39
- mime TEXT NOT NULL,
40
- byte_length INTEGER NOT NULL,
41
- sha256 TEXT NOT NULL,
42
- blob_relpath TEXT NOT NULL,
43
- occurred_at_ms INTEGER NOT NULL,
44
- reply_to_wire_id TEXT,
45
- reply_to_sentence INTEGER,
46
- encryption TEXT NOT NULL CHECK (encryption IN ('legacy','e2e')),
47
- inbox_state TEXT NOT NULL CHECK (inbox_state IN ('pending_introduction','unread','read')),
48
- delivery_state TEXT,
49
- human_read_at_ms INTEGER,
50
- inserted_at_ms INTEGER NOT NULL
51
- );
52
- CREATE INDEX IF NOT EXISTS files_unread_seq ON files(inbox_state, seq ASC);
53
- CREATE INDEX IF NOT EXISTS files_peer_seq ON files(peer_cid, seq DESC);
54
- CREATE TRIGGER IF NOT EXISTS files_release_wire AFTER DELETE ON files BEGIN
55
- DELETE FROM wire_items WHERE wire_id = OLD.wire_id AND item_kind = 'file';
56
- END;
57
- CREATE TABLE IF NOT EXISTS monitoring_items (
58
- seq INTEGER PRIMARY KEY AUTOINCREMENT,
59
- item_id TEXT NOT NULL UNIQUE,
60
- source_cid TEXT NOT NULL,
61
- source_name_snapshot TEXT NOT NULL,
62
- direction TEXT NOT NULL CHECK (direction IN ('in','out')),
63
- peer_cid TEXT NOT NULL,
64
- peer_name_snapshot TEXT NOT NULL,
65
- body TEXT NOT NULL,
66
- occurred_at_ms INTEGER NOT NULL,
67
- queue_state TEXT NOT NULL CHECK (queue_state IN ('pending','processed')),
68
- inserted_at_ms INTEGER NOT NULL
69
- );
70
- CREATE INDEX IF NOT EXISTS monitoring_pending_seq ON monitoring_items(queue_state, seq ASC);
71
- CREATE TABLE IF NOT EXISTS control_requests (
72
- seq INTEGER PRIMARY KEY AUTOINCREMENT,
73
- item_id TEXT NOT NULL UNIQUE,
74
- sender_cid TEXT NOT NULL,
75
- sender_name_snapshot TEXT NOT NULL,
76
- payload TEXT NOT NULL,
77
- occurred_at_ms INTEGER NOT NULL,
78
- queue_state TEXT NOT NULL CHECK (queue_state IN ('pending','processed')),
79
- inserted_at_ms INTEGER NOT NULL
80
- );
81
- CREATE INDEX IF NOT EXISTS control_pending_seq ON control_requests(queue_state, seq ASC);
82
- `);let e=t.prepare("SELECT value FROM history_meta WHERE key = ?").pluck().get("schema_version");if(e!==void 0&&Number(e)!==N)throw new Error(`unsupported history database schema ${String(e)} (expected ${N})`);t.prepare("INSERT OR IGNORE INTO history_meta(key, value) VALUES (?, ?)").run("schema_version",String(N))}function d(t){let e=p.get(t.dir);if(e)return e;o.mkdirSync(t.dir,{recursive:!0,mode:448}),o.chmodSync(t.dir,448);let r=U(t),s=new A(r);try{o.chmodSync(r,384),s.pragma("journal_mode = WAL"),s.pragma("synchronous = NORMAL"),s.pragma("foreign_keys = ON"),s.pragma("busy_timeout = 5000"),F(s);for(let i of["","-wal","-shm"]){let n=`${r}${i}`;o.existsSync(n)&&o.chmodSync(n,384)}}catch(i){throw s.close(),i}return p.set(t.dir,s),s}function V(t){let e=p.get(t.dir);e&&(p.delete(t.dir),e.close())}function q(t){if(!t.wireId||t.wireId.length>256)throw new Error("invalid wire_id");if(!t.peerCid||t.peerCid.length>256)throw new Error("invalid peer cid");if(!t.peerName||t.peerName.length>512)throw new Error("invalid peer name");if(!Number.isSafeInteger(t.occurredAtMs)||t.occurredAtMs<0)throw new Error("invalid timestamp");if(t.replyToWireId!==void 0&&(!t.replyToWireId||t.replyToWireId.length>256))throw new Error("invalid reply wire_id");if(t.replyToSentence!==void 0&&(!Number.isSafeInteger(t.replyToSentence)||t.replyToSentence<1))throw new Error("invalid reply sentence")}function k(t){if(q(t),t.kind==="message"){if(Buffer.byteLength(t.body,"utf8")>b)throw new Error("message body exceeds host limit");return}if(!t.filename||t.filename.length>512||/[\0]/.test(t.filename))throw new Error("invalid filename");if(t.mime.length>512||/[\r\n\0]/.test(t.mime))throw new Error("invalid MIME type");if(t.bytes.byteLength>D)throw new Error("file exceeds host limit")}function h(t){return t.reply_to_wire_id?t.reply_to_sentence===null?{wire_id:t.reply_to_wire_id}:{wire_id:t.reply_to_wire_id,sentence:t.reply_to_sentence}:null}function I(t){return new Date(t).toISOString()}function S(t){let e={id:t.peer_cid,name:t.peer_name_snapshot};return{seq:t.seq,msg_id:t.seq,wire_id:t.wire_id,from:e,peer:e,direction:t.direction,text:t.body,body:t.body,occurred_at_ms:t.occurred_at_ms,date:I(t.occurred_at_ms),encryption:t.encryption,transport:t.encryption==="e2e"?"double_ratchet":"legacy_box",inbox_state:t.inbox_state,status:t.inbox_state,delivery_state:t.delivery_state,human_read_at_ms:t.human_read_at_ms,reply_to:h(t)}}function g(t,e){let r={id:e.peer_cid,name:e.peer_name_snapshot},s=e.mime||"application/octet-stream";return{seq:e.seq,file_id:e.seq,wire_id:e.wire_id,from:r,peer:r,direction:e.direction,filename:e.filename,mime:s,size:e.byte_length,byte_length:e.byte_length,sha256:e.sha256,occurred_at_ms:e.occurred_at_ms,date:I(e.occurred_at_ms),encryption:e.encryption,inbox_state:e.inbox_state,status:e.inbox_state,delivery_state:e.delivery_state,human_read_at_ms:e.human_read_at_ms,reply_to:h(e),blob_path:l(t.dir,e.blob_relpath),kind:s.startsWith("audio/")?"voice_message":"file"}}function X(t,e){let r=O("sha256").update(e).digest("hex"),s=l("blobs","sha256",r.slice(0,2),r),i=l(t.dir,s);if(o.mkdirSync(y(i),{recursive:!0,mode:448}),o.chmodSync(y(i),448),!o.existsSync(i)){let n=l(y(i),`.${r}.${process.pid}.${H()}.tmp`);try{o.writeFileSync(n,e,{flag:"wx",mode:384}),o.chmodSync(n,384);try{o.renameSync(n,i)}catch(a){if(!o.existsSync(i))throw a;o.rmSync(n,{force:!0})}}catch(a){try{o.rmSync(n,{force:!0})}catch{}throw a}}return o.chmodSync(i,384),{sha256:r,relpath:s}}function j(t,e){k(e);let r=d(t);if(e.direction==="out"&&e.inboxState!==void 0)throw new Error("outbound event cannot set inbox state");let s=e.direction==="in"?e.inboxState??"unread":"read",i=e.direction==="out"?"sent":null;if(e.kind==="message")return r.transaction(()=>r.prepare(`
83
- INSERT INTO wire_items(wire_id, item_kind) VALUES (?, 'message')
84
- ON CONFLICT(wire_id) DO NOTHING
85
- `).run(e.wireId).changes!==1?!1:(r.prepare(`
86
- INSERT INTO messages (
87
- wire_id, peer_cid, peer_name_snapshot, direction, body, occurred_at_ms,
88
- reply_to_wire_id, reply_to_sentence, encryption, inbox_state,
89
- delivery_state, human_read_at_ms, inserted_at_ms
90
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
91
- `).run(e.wireId,e.peerCid,e.peerName,e.direction,e.body,e.occurredAtMs,e.replyToWireId??null,e.replyToSentence??null,e.encryption,s,i,e.direction==="out"?e.occurredAtMs:null,Date.now()),!0))();if(r.prepare("SELECT 1 FROM wire_items WHERE wire_id = ?").get(e.wireId))return!1;let a=X(t,e.bytes);return r.transaction(()=>r.prepare(`
92
- INSERT INTO wire_items(wire_id, item_kind) VALUES (?, 'file')
93
- ON CONFLICT(wire_id) DO NOTHING
94
- `).run(e.wireId).changes!==1?!1:(r.prepare(`
95
- INSERT INTO files (
96
- wire_id, peer_cid, peer_name_snapshot, direction, filename, mime,
97
- byte_length, sha256, blob_relpath, occurred_at_ms, reply_to_wire_id,
98
- reply_to_sentence, encryption, inbox_state, delivery_state,
99
- human_read_at_ms, inserted_at_ms
100
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
101
- `).run(e.wireId,e.peerCid,e.peerName,e.direction,e.filename,e.mime||"application/octet-stream",e.bytes.byteLength,a.sha256,a.relpath,e.occurredAtMs,e.replyToWireId??null,e.replyToSentence??null,e.encryption,s,i,e.direction==="out"?e.occurredAtMs:null,Date.now()),!0))()}function z(t,e){if(!e.itemId||!e.sourceCid||!e.sourceName||!e.peerCid||!e.peerName)throw new Error("invalid monitoring event metadata");if(!Number.isSafeInteger(e.occurredAtMs)||e.occurredAtMs<0)throw new Error("invalid monitoring timestamp");if(Buffer.byteLength(e.body,"utf8")>b)throw new Error("monitoring body exceeds host limit");return d(t).prepare(`
102
- INSERT INTO monitoring_items (
103
- item_id, source_cid, source_name_snapshot, direction, peer_cid,
104
- peer_name_snapshot, body, occurred_at_ms, queue_state, inserted_at_ms
105
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'pending', ?)
106
- ON CONFLICT(item_id) DO NOTHING
107
- `).run(e.itemId,e.sourceCid,e.sourceName,e.direction,e.peerCid,e.peerName,e.body,e.occurredAtMs,Date.now()).changes===1}function J(t,e){if(!e.itemId||!e.senderCid||!e.senderName)throw new Error("invalid control event metadata");if(!Number.isSafeInteger(e.occurredAtMs)||e.occurredAtMs<0)throw new Error("invalid control timestamp");if(Buffer.byteLength(e.payload,"utf8")>b)throw new Error("control payload exceeds host limit");return d(t).prepare(`
108
- INSERT INTO control_requests (
109
- item_id, sender_cid, sender_name_snapshot, payload,
110
- occurred_at_ms, queue_state, inserted_at_ms
111
- ) VALUES (?, ?, ?, ?, ?, 'pending', ?)
112
- ON CONFLICT(item_id) DO NOTHING
113
- `).run(e.itemId,e.senderCid,e.senderName,e.payload,e.occurredAtMs,Date.now()).changes===1}function Z(t,e){let r=d(t);return r.transaction(()=>{let s=r.prepare(`
114
- UPDATE messages SET inbox_state = 'unread'
115
- WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
116
- `).run(e).changes,i=r.prepare(`
117
- UPDATE files SET inbox_state = 'unread'
118
- WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
119
- `).run(e).changes;return s+i})()}function v(t,e){let r=d(t);return r.transaction(()=>{let s=r.prepare(`
120
- DELETE FROM messages
121
- WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
122
- `).run(e).changes,i=r.prepare(`
123
- DELETE FROM files
124
- WHERE direction = 'in' AND peer_cid = ? AND inbox_state = 'pending_introduction'
125
- `).run(e).changes;return s+i})()}function ee(t){let e=d(t);return{pending_introductions:Number(e.prepare(`
126
- SELECT
127
- (SELECT COUNT(*) FROM messages WHERE inbox_state = 'pending_introduction') +
128
- (SELECT COUNT(*) FROM files WHERE inbox_state = 'pending_introduction')
129
- `).pluck().get()),monitoring_copies:Number(e.prepare(`
130
- SELECT COUNT(*) FROM monitoring_items WHERE queue_state = 'pending'
131
- `).pluck().get()),control_requests:Number(e.prepare(`
132
- SELECT COUNT(*) FROM control_requests WHERE queue_state = 'pending'
133
- `).pluck().get())}}function T(t){let e=t??C;if(!Number.isSafeInteger(e)||e<1||e>m)throw new Error(`limit must be an integer from 1 to ${m}`);return e}function te(t){return d(t).prepare(`
134
- SELECT seq, wire_id, peer_cid, peer_name_snapshot, occurred_at_ms,
135
- reply_to_wire_id, reply_to_sentence, encryption
136
- FROM messages
137
- WHERE direction = 'in' AND inbox_state = 'unread'
138
- ORDER BY seq ASC
139
- `).all().map(r=>({seq:r.seq,msg_id:r.seq,wire_id:r.wire_id,from:{id:r.peer_cid,name:r.peer_name_snapshot},occurred_at_ms:r.occurred_at_ms,date:I(r.occurred_at_ms),encryption:r.encryption,inbox_state:"unread",status:"unread",reply_to:h(r)}))}function re(t,e={}){let r=d(t),s=T(e.limit),i=e.wire_ids;return r.transaction(()=>{let n;if(i!==void 0){if(i.length<1||i.length>m)throw new Error(`wire_ids must contain 1-${m} items`);if(new Set(i).size!==i.length)throw new Error("wire_ids must not contain duplicates");let c=r.prepare(`
140
- SELECT * FROM messages WHERE wire_id = ? AND direction = 'in' AND inbox_state = 'unread'
141
- `);if(n=i.map(u=>c.get(u)).filter(u=>!!u),n.length!==i.length)throw new Error("selected message wire_id is unknown, stale, or no longer unread")}else n=r.prepare(`
142
- SELECT * FROM messages
143
- WHERE direction = 'in' AND inbox_state = 'unread'
144
- ORDER BY seq ASC LIMIT ?
145
- `).all(s);let a=r.prepare(`
146
- UPDATE messages SET inbox_state = 'read'
147
- WHERE seq = ? AND direction = 'in' AND inbox_state = 'unread'
148
- `);for(let c of n){if(a.run(c.seq).changes!==1)throw new Error(`message row ${c.seq} changed during read batch`);c.inbox_state="read"}let _=Number(r.prepare(`
149
- SELECT COUNT(*) FROM messages WHERE direction = 'in' AND inbox_state = 'unread'
150
- `).pluck().get());return{messages:n.map(S),remaining:_}})()}function ie(t){return d(t).prepare(`
151
- SELECT * FROM files WHERE direction = 'in' AND inbox_state = 'unread' ORDER BY seq ASC
152
- `).all().map(r=>g(t,r))}function ne(t,e={}){let r=d(t),s=T(e.limit),i=e.wire_ids;return r.transaction(()=>{let n;if(i!==void 0){if(i.length<1||i.length>m)throw new Error(`wire_ids must contain 1-${m} items`);if(new Set(i).size!==i.length)throw new Error("wire_ids must not contain duplicates");let c=r.prepare(`
153
- SELECT * FROM files WHERE wire_id = ? AND direction = 'in' AND inbox_state = 'unread'
154
- `);if(n=i.map(u=>c.get(u)).filter(u=>!!u),n.length!==i.length)throw new Error("selected file wire_id is unknown, stale, or no longer unread")}else n=r.prepare(`
155
- SELECT * FROM files WHERE direction = 'in' AND inbox_state = 'unread'
156
- ORDER BY seq ASC LIMIT ?
157
- `).all(s);let a=r.prepare(`
158
- UPDATE files SET inbox_state = 'read'
159
- WHERE seq = ? AND direction = 'in' AND inbox_state = 'unread'
160
- `);for(let c of n){if(a.run(c.seq).changes!==1)throw new Error(`file row ${c.seq} changed during read batch`);c.inbox_state="read"}let _=Number(r.prepare(`
161
- SELECT COUNT(*) FROM files WHERE direction = 'in' AND inbox_state = 'unread'
162
- `).pluck().get());return{files:n.map(c=>g(t,c)),remaining:_}})()}function L(t){let e=[],r=[];return t.peer_cid!==void 0&&(e.push("peer_cid = ?"),r.push(t.peer_cid)),t.direction!==void 0&&(e.push("direction = ?"),r.push(t.direction)),t.before_seq!==void 0&&(e.push("seq < ?"),r.push(t.before_seq)),{sql:e.length?`WHERE ${e.join(" AND ")}`:"",args:r}}function se(t,e={}){let r=d(t),s=T(e.limit),i=L(e),n=r.prepare(`SELECT * FROM messages ${i.sql} ORDER BY seq DESC LIMIT ?`).all(...i.args,s+1),a=n.length>s;return a&&n.pop(),{items:n.map(S),next_cursor:a?n.at(-1).seq:null}}function oe(t,e){let r=d(t).prepare("SELECT * FROM messages WHERE wire_id = ?").get(e);return r?S(r):null}function ae(t,e){let r=d(t).prepare(`
163
- SELECT COUNT(*) AS total,
164
- SUM(CASE WHEN direction = 'in' AND inbox_state = 'unread' THEN 1 ELSE 0 END) AS unread
165
- FROM messages WHERE peer_cid = ?
166
- `).get(e.peer_cid);return{total:Number(r.total),unread:Number(r.unread??0)}}function de(t,e={}){let r=d(t),s=T(e.limit),i=L(e),n=r.prepare(`SELECT * FROM files ${i.sql} ORDER BY seq DESC LIMIT ?`).all(...i.args,s+1),a=n.length>s;return a&&n.pop(),{items:n.map(_=>g(t,_)),next_cursor:a?n.at(-1).seq:null}}function P(t,e){let r=d(t).prepare("SELECT * FROM files WHERE wire_id = ?").get(e);return r?g(t,r):null}function ce(t,e){let r=P(t,e);if(!r||!o.existsSync(r.blob_path))return null;let s=R(t.dir),i=R(r.blob_path);return i.startsWith(`${s}${x}`)?i:null}function _e(t,e,r,s){let i=d(t),n=r==="read"?2:1;i.transaction(()=>{for(let _ of s)for(let c of["messages","files"])i.prepare(`
167
- UPDATE ${c}
168
- SET delivery_state = ?, human_read_at_ms = CASE WHEN ? = 'read' THEN COALESCE(human_read_at_ms, ?) ELSE human_read_at_ms END
169
- WHERE wire_id = ? AND peer_cid = ? AND direction = 'out'
170
- AND (CASE delivery_state WHEN 'read' THEN 2 WHEN 'delivered' THEN 1 WHEN 'sent' THEN 0 ELSE -1 END) < ?
171
- `).run(r,r,Date.now(),_,e,n)})()}function ue(t){let e=d(t);return{messages:Number(e.prepare("SELECT COUNT(*) FROM messages WHERE direction='in' AND inbox_state='unread'").pluck().get()),files:Number(e.prepare("SELECT COUNT(*) FROM files WHERE direction='in' AND inbox_state='unread'").pluck().get())}}export{U as a,Y as b,$ as c,K as d,Q as e,d as f,V as g,j as h,z as i,J as j,Z as k,v as l,ee as m,te as n,re as o,ie as p,ne as q,se as r,oe as s,ae as t,de as u,P as v,ce as w,_e as x,ue as y};
@@ -1,5 +0,0 @@
1
- import { createRequire } from 'node:module'; const require = createRequire(import.meta.url);
2
- import*as o from"node:fs";import{randomBytes as S}from"node:crypto";import{homedir as g}from"node:os";import{resolve as c,join as a,dirname as p,basename as b}from"node:path";var y=["owner","shared","open"],s={brokerUrl:"wss://broker1.ours.network",port:3050,stateDir:c(g(),".ours"),gcIntervalMs:36e5,apiVisibility:"owner"};function d(){return process.env.OURS_CONFIG??a(g(),".ours","config.json")}function T(){let t;try{t=o.readFileSync(d(),"utf8")}catch{return{}}let e;try{e=JSON.parse(t)}catch{return{}}let r={};if(typeof e.brokerUrl=="string"&&(r.brokerUrl=e.brokerUrl),typeof e.port=="number"&&Number.isFinite(e.port)&&(r.port=e.port),typeof e.stateDir=="string"&&(r.stateDir=c(e.stateDir)),typeof e.gcIntervalMs=="number"&&Number.isFinite(e.gcIntervalMs)&&(r.gcIntervalMs=e.gcIntervalMs),typeof e.apiVisibility=="string"&&y.includes(e.apiVisibility)&&(r.apiVisibility=e.apiVisibility),typeof e.apiToken=="string"&&e.apiToken.trim()&&(r.apiToken=e.apiToken.trim()),e.stt&&typeof e.stt=="object"){let i=e.stt,n={};typeof i.provider=="string"&&(n.provider=i.provider),typeof i.apiKey=="string"&&(n.apiKey=i.apiKey),typeof i.model=="string"&&(n.model=i.model),typeof i.baseUrl=="string"&&(n.baseUrl=i.baseUrl),typeof i.language=="string"&&(n.language=i.language),typeof i.maxBytes=="number"&&Number.isFinite(i.maxBytes)&&(n.maxBytes=i.maxBytes),typeof i.timeoutMs=="number"&&Number.isFinite(i.timeoutMs)&&(n.timeoutMs=i.timeoutMs),i.custom&&typeof i.custom=="object"&&(n.custom=i.custom),r.stt=n}return r}function _(){let t=process.env.OURS_API_VISIBILITY?.trim().toLowerCase();return t&&y.includes(t)?t:void 0}function l(t){let e=process.env[t];if(e===void 0)return;let r=parseInt(e,10);return Number.isNaN(r)?void 0:r}function E(){let t=T();return{brokerUrl:process.env.OURS_BROKER_URL??t.brokerUrl??s.brokerUrl,port:l("OURS_PORT")??t.port??s.port,stateDir:c(process.env.OURS_STATE_DIR??t.stateDir??s.stateDir),gcIntervalMs:l("OURS_GC_INTERVAL_MS")??t.gcIntervalMs??s.gcIntervalMs,apiVisibility:_()??t.apiVisibility??s.apiVisibility,apiToken:process.env.OURS_API_TOKEN?.trim()||t.apiToken,stt:v(t.stt)}}function v(t){let e={};process.env.OURS_STT_PROVIDER?.trim()&&(e.provider=process.env.OURS_STT_PROVIDER.trim()),process.env.OURS_STT_API_KEY?.trim()&&(e.apiKey=process.env.OURS_STT_API_KEY.trim()),process.env.OURS_STT_MODEL?.trim()&&(e.model=process.env.OURS_STT_MODEL.trim()),process.env.OURS_STT_BASE_URL?.trim()&&(e.baseUrl=process.env.OURS_STT_BASE_URL.trim()),process.env.OURS_STT_LANGUAGE?.trim()&&(e.language=process.env.OURS_STT_LANGUAGE.trim());let r={...t??{},...e};return Object.keys(r).length?r:void 0}var O="daemon-token";function k(t){return a(t.stateDir,O)}function C(t){let e=process.env.OURS_API_TOKEN?.trim();return e||t.apiToken?.trim()||void 0}function F(t,e={}){let r=process.env.OURS_API_TOKEN?.trim();if(r)return{token:r,source:"env"};let i=t.apiToken?.trim();if(i)return{token:i,source:"config"};let n=k(t);try{let u=o.readFileSync(n,"utf8").trim();if(u)return{token:u,source:"file"}}catch{}if(!e.generate)return null;let f=S(32).toString("hex");try{o.mkdirSync(p(n),{recursive:!0}),o.writeFileSync(n,f+`
3
- `,{mode:384}),o.chmodSync(n,384)}catch{}return{token:f,source:"generated"}}function w(t){let e=d();o.mkdirSync(p(e),{recursive:!0}),o.writeFileSync(e,JSON.stringify(t,null,2)+`
4
- `,{mode:384});try{o.chmodSync(e,384)}catch{}return e}var m=".ours-identity";function I(t){if(!t.name.trim())throw new Error("identity name must not be empty");let e={identity:t.name.trim()};return t.force&&(e.force=!0),e.expose_local=t.exposeLocal??!0,e.local_auto_accept=t.localAutoAccept??!0,e}function U(t){let e=c(t);return b(e)===m?e:a(e,m)}function N(t,e,r=!1){let i=I(e),n=U(t);if(!r&&o.existsSync(n))throw new Error(`${n} already exists \u2014 pass overwrite to replace it`);return o.mkdirSync(p(n),{recursive:!0}),o.writeFileSync(n,JSON.stringify(i,null,2)+`
5
- `),n}export{y as a,s as b,d as c,E as d,O as e,k as f,C as g,F as h,w as i,m as j,I as k,U as l,N as m};