@leemour/cli-messaging 0.97.0 → 0.99.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 (244) hide show
  1. package/README.md +8 -7
  2. package/dist/cli/bot/admins.d.ts +10 -0
  3. package/dist/cli/bot/admins.d.ts.map +1 -0
  4. package/dist/cli/bot/admins.js +114 -0
  5. package/dist/cli/bot/admins.js.map +1 -0
  6. package/dist/cli/bot/command.d.ts.map +1 -1
  7. package/dist/cli/bot/command.js +17 -15
  8. package/dist/cli/bot/command.js.map +1 -1
  9. package/dist/cli/bot/context.d.ts +2 -0
  10. package/dist/cli/bot/context.d.ts.map +1 -1
  11. package/dist/cli/bot/context.js +7 -0
  12. package/dist/cli/bot/context.js.map +1 -1
  13. package/dist/cli/bot/messages.d.ts.map +1 -1
  14. package/dist/cli/bot/messages.js +20 -10
  15. package/dist/cli/bot/messages.js.map +1 -1
  16. package/dist/cli/bot/port.d.ts +128 -2
  17. package/dist/cli/bot/port.d.ts.map +1 -1
  18. package/dist/cli/bot/port.js.map +1 -1
  19. package/dist/cli/bot/registry.d.ts +2 -0
  20. package/dist/cli/bot/registry.d.ts.map +1 -1
  21. package/dist/cli/bot/registry.js +2 -0
  22. package/dist/cli/bot/registry.js.map +1 -1
  23. package/dist/cli/bot/setup.d.ts +9 -0
  24. package/dist/cli/bot/setup.d.ts.map +1 -0
  25. package/dist/cli/bot/setup.js +155 -0
  26. package/dist/cli/bot/setup.js.map +1 -0
  27. package/dist/cli/bot/updates.d.ts +23 -0
  28. package/dist/cli/bot/updates.d.ts.map +1 -0
  29. package/dist/cli/bot/updates.js +61 -0
  30. package/dist/cli/bot/updates.js.map +1 -0
  31. package/dist/cli/bot/watch.d.ts +9 -0
  32. package/dist/cli/bot/watch.d.ts.map +1 -0
  33. package/dist/cli/bot/watch.js +197 -0
  34. package/dist/cli/bot/watch.js.map +1 -0
  35. package/dist/cli/config-command.js +1 -1
  36. package/dist/cli/config-command.js.map +1 -1
  37. package/dist/cli/deadline.d.ts.map +1 -1
  38. package/dist/cli/deadline.js +11 -2
  39. package/dist/cli/deadline.js.map +1 -1
  40. package/dist/cli/index.d.ts +5 -2
  41. package/dist/cli/index.d.ts.map +1 -1
  42. package/dist/cli/index.js +2 -0
  43. package/dist/cli/index.js.map +1 -1
  44. package/dist/cli/messenger/admin-moderation-command.js +2 -2
  45. package/dist/cli/messenger/admin-moderation-command.js.map +1 -1
  46. package/dist/cli/messenger/context.d.ts +18 -2
  47. package/dist/cli/messenger/context.d.ts.map +1 -1
  48. package/dist/cli/messenger/context.js +30 -8
  49. package/dist/cli/messenger/context.js.map +1 -1
  50. package/dist/cli/messenger/download-command.d.ts.map +1 -1
  51. package/dist/cli/messenger/download-command.js +97 -30
  52. package/dist/cli/messenger/download-command.js.map +1 -1
  53. package/dist/cli/messenger/guard-commands.js +3 -3
  54. package/dist/cli/messenger/guard-commands.js.map +1 -1
  55. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  56. package/dist/cli/messenger/messages-command.js +45 -11
  57. package/dist/cli/messenger/messages-command.js.map +1 -1
  58. package/dist/cli/messenger/models-command.d.ts +1 -1
  59. package/dist/cli/messenger/models-command.d.ts.map +1 -1
  60. package/dist/cli/messenger/models-command.js +64 -3
  61. package/dist/cli/messenger/models-command.js.map +1 -1
  62. package/dist/cli/messenger/observed.d.ts.map +1 -1
  63. package/dist/cli/messenger/observed.js +27 -10
  64. package/dist/cli/messenger/observed.js.map +1 -1
  65. package/dist/cli/messenger/port.d.ts +26 -9
  66. package/dist/cli/messenger/port.d.ts.map +1 -1
  67. package/dist/cli/messenger/port.js.map +1 -1
  68. package/dist/cli/messenger/stored.d.ts +3 -2
  69. package/dist/cli/messenger/stored.d.ts.map +1 -1
  70. package/dist/cli/messenger/stored.js +75 -33
  71. package/dist/cli/messenger/stored.js.map +1 -1
  72. package/dist/cli/messenger/watch-command.d.ts +2 -1
  73. package/dist/cli/messenger/watch-command.d.ts.map +1 -1
  74. package/dist/cli/messenger/watch-command.js +11 -2
  75. package/dist/cli/messenger/watch-command.js.map +1 -1
  76. package/dist/embeddings/embed.d.ts +22 -0
  77. package/dist/embeddings/embed.d.ts.map +1 -0
  78. package/dist/embeddings/embed.js +69 -0
  79. package/dist/embeddings/embed.js.map +1 -0
  80. package/dist/embeddings/models.d.ts +33 -0
  81. package/dist/embeddings/models.d.ts.map +1 -0
  82. package/dist/embeddings/models.js +85 -0
  83. package/dist/embeddings/models.js.map +1 -0
  84. package/dist/index.d.ts +0 -1
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/kit/contract.d.ts +39 -0
  88. package/dist/kit/contract.d.ts.map +1 -0
  89. package/dist/kit/contract.js +449 -0
  90. package/dist/kit/contract.js.map +1 -0
  91. package/dist/kit/fake.d.ts +16 -0
  92. package/dist/kit/fake.d.ts.map +1 -0
  93. package/dist/kit/fake.js +457 -0
  94. package/dist/kit/fake.js.map +1 -0
  95. package/dist/kit/index.d.ts +4 -0
  96. package/dist/kit/index.d.ts.map +1 -0
  97. package/dist/kit/index.js +4 -0
  98. package/dist/kit/index.js.map +1 -0
  99. package/dist/kit/seed.d.ts +38 -0
  100. package/dist/kit/seed.d.ts.map +1 -0
  101. package/dist/kit/seed.js +83 -0
  102. package/dist/kit/seed.js.map +1 -0
  103. package/dist/mcp/resources.d.ts +6 -1
  104. package/dist/mcp/resources.d.ts.map +1 -1
  105. package/dist/mcp/resources.js +15 -5
  106. package/dist/mcp/resources.js.map +1 -1
  107. package/dist/mcp/server.d.ts.map +1 -1
  108. package/dist/mcp/server.js +3 -0
  109. package/dist/mcp/server.js.map +1 -1
  110. package/dist/mcp/tool.d.ts +12 -2
  111. package/dist/mcp/tool.d.ts.map +1 -1
  112. package/dist/mcp/tool.js +15 -8
  113. package/dist/mcp/tool.js.map +1 -1
  114. package/dist/mcp/tools/chats.js +3 -3
  115. package/dist/mcp/tools/chats.js.map +1 -1
  116. package/dist/mcp/tools/contacts.js +3 -3
  117. package/dist/mcp/tools/contacts.js.map +1 -1
  118. package/dist/mcp/tools/inbox.d.ts.map +1 -1
  119. package/dist/mcp/tools/inbox.js +3 -4
  120. package/dist/mcp/tools/inbox.js.map +1 -1
  121. package/dist/mcp/tools/messages.d.ts.map +1 -1
  122. package/dist/mcp/tools/messages.js +19 -12
  123. package/dist/mcp/tools/messages.js.map +1 -1
  124. package/dist/mcp/tools/review.d.ts.map +1 -1
  125. package/dist/mcp/tools/review.js +3 -4
  126. package/dist/mcp/tools/review.js.map +1 -1
  127. package/dist/moderation/check.d.ts +3 -1
  128. package/dist/moderation/check.d.ts.map +1 -1
  129. package/dist/moderation/check.js +3 -2
  130. package/dist/moderation/check.js.map +1 -1
  131. package/dist/parity/audit.d.ts +11 -9
  132. package/dist/parity/audit.d.ts.map +1 -1
  133. package/dist/parity/audit.js +63 -46
  134. package/dist/parity/audit.js.map +1 -1
  135. package/dist/parity/bin.js +17 -8
  136. package/dist/parity/bin.js.map +1 -1
  137. package/dist/parity/catalogue.d.ts.map +1 -1
  138. package/dist/parity/catalogue.js +7 -1
  139. package/dist/parity/catalogue.js.map +1 -1
  140. package/dist/parity/manifest.d.ts +19 -12
  141. package/dist/parity/manifest.d.ts.map +1 -1
  142. package/dist/parity/manifest.js +60 -37
  143. package/dist/parity/manifest.js.map +1 -1
  144. package/dist/parity/pages.d.ts +3 -3
  145. package/dist/parity/pages.d.ts.map +1 -1
  146. package/dist/parity/pages.js +4 -5
  147. package/dist/parity/pages.js.map +1 -1
  148. package/dist/parity/seed.d.ts +11 -0
  149. package/dist/parity/seed.d.ts.map +1 -0
  150. package/dist/parity/seed.js +99 -0
  151. package/dist/parity/seed.js.map +1 -0
  152. package/dist/parity/wording.d.ts +4 -3
  153. package/dist/parity/wording.d.ts.map +1 -1
  154. package/dist/parity/wording.js +21 -10
  155. package/dist/parity/wording.js.map +1 -1
  156. package/dist/search/correct.d.ts +25 -0
  157. package/dist/search/correct.d.ts.map +1 -0
  158. package/dist/search/correct.js +65 -0
  159. package/dist/search/correct.js.map +1 -0
  160. package/dist/search/query.d.ts +7 -2
  161. package/dist/search/query.d.ts.map +1 -1
  162. package/dist/search/query.js +12 -8
  163. package/dist/search/query.js.map +1 -1
  164. package/dist/search/search.d.ts +27 -0
  165. package/dist/search/search.d.ts.map +1 -0
  166. package/dist/search/search.js +65 -0
  167. package/dist/search/search.js.map +1 -0
  168. package/dist/sends/guarded.d.ts +12 -0
  169. package/dist/sends/guarded.d.ts.map +1 -1
  170. package/dist/sends/guarded.js +24 -2
  171. package/dist/sends/guarded.js.map +1 -1
  172. package/dist/services/archive.d.ts +8 -3
  173. package/dist/services/archive.d.ts.map +1 -1
  174. package/dist/services/archive.js +24 -3
  175. package/dist/services/archive.js.map +1 -1
  176. package/dist/services/chats.d.ts.map +1 -1
  177. package/dist/services/chats.js +13 -9
  178. package/dist/services/chats.js.map +1 -1
  179. package/dist/services/deps.d.ts +13 -0
  180. package/dist/services/deps.d.ts.map +1 -1
  181. package/dist/services/deps.js +12 -0
  182. package/dist/services/deps.js.map +1 -1
  183. package/dist/services/inbox.d.ts +14 -4
  184. package/dist/services/inbox.d.ts.map +1 -1
  185. package/dist/services/inbox.js +55 -14
  186. package/dist/services/inbox.js.map +1 -1
  187. package/dist/services/index.d.ts +2 -2
  188. package/dist/services/index.d.ts.map +1 -1
  189. package/dist/services/index.js +1 -1
  190. package/dist/services/index.js.map +1 -1
  191. package/dist/services/messages.d.ts +51 -6
  192. package/dist/services/messages.d.ts.map +1 -1
  193. package/dist/services/messages.js +202 -19
  194. package/dist/services/messages.js.map +1 -1
  195. package/dist/services/moderation.d.ts.map +1 -1
  196. package/dist/services/moderation.js +7 -1
  197. package/dist/services/moderation.js.map +1 -1
  198. package/dist/services/people.d.ts.map +1 -1
  199. package/dist/services/people.js +8 -5
  200. package/dist/services/people.js.map +1 -1
  201. package/dist/speech/hearing.d.ts +1 -1
  202. package/dist/speech/hearing.d.ts.map +1 -1
  203. package/dist/speech/hearing.js +2 -2
  204. package/dist/speech/hearing.js.map +1 -1
  205. package/dist/speech/install.d.ts +8 -1
  206. package/dist/speech/install.d.ts.map +1 -1
  207. package/dist/speech/install.js +11 -4
  208. package/dist/speech/install.js.map +1 -1
  209. package/dist/store/index.d.ts +1 -1
  210. package/dist/store/index.d.ts.map +1 -1
  211. package/dist/store/index.js.map +1 -1
  212. package/dist/store/sqlite/accounts.d.ts +1 -0
  213. package/dist/store/sqlite/accounts.d.ts.map +1 -1
  214. package/dist/store/sqlite/accounts.js +6 -1
  215. package/dist/store/sqlite/accounts.js.map +1 -1
  216. package/dist/store/sqlite/completeness.d.ts +17 -0
  217. package/dist/store/sqlite/completeness.d.ts.map +1 -0
  218. package/dist/store/sqlite/completeness.js +30 -0
  219. package/dist/store/sqlite/completeness.js.map +1 -0
  220. package/dist/store/sqlite/messages.d.ts +2 -2
  221. package/dist/store/sqlite/messages.d.ts.map +1 -1
  222. package/dist/store/sqlite/messages.js +10 -14
  223. package/dist/store/sqlite/messages.js.map +1 -1
  224. package/dist/store/sqlite/search-index.d.ts.map +1 -1
  225. package/dist/store/sqlite/search-index.js +45 -9
  226. package/dist/store/sqlite/search-index.js.map +1 -1
  227. package/dist/store/sqlite/search.d.ts +2 -0
  228. package/dist/store/sqlite/search.d.ts.map +1 -1
  229. package/dist/store/sqlite/search.js +27 -17
  230. package/dist/store/sqlite/search.js.map +1 -1
  231. package/dist/store/sqlite/words.d.ts +83 -0
  232. package/dist/store/sqlite/words.d.ts.map +1 -0
  233. package/dist/store/sqlite/words.js +255 -0
  234. package/dist/store/sqlite/words.js.map +1 -0
  235. package/dist/store/store.d.ts +40 -0
  236. package/dist/store/store.d.ts.map +1 -1
  237. package/dist/store/store.js +19 -2
  238. package/dist/store/store.js.map +1 -1
  239. package/package.json +10 -4
  240. package/parity.json +1136 -389
  241. package/dist/domain/capabilities.d.ts +0 -22
  242. package/dist/domain/capabilities.d.ts.map +0 -1
  243. package/dist/domain/capabilities.js +0 -2
  244. package/dist/domain/capabilities.js.map +0 -1
@@ -0,0 +1,449 @@
1
+ import assert from "node:assert/strict";
2
+ import { isCliFailure } from "../cli/failures.js";
3
+ import { capability } from "../cli/messenger/port.js";
4
+ import { newSendId } from "../sends/send-id.js";
5
+ import { BUSY_PAGE, contractSeed, wordIds } from "./seed.js";
6
+ const SERVER_READS = ["chats", "history", "around", "contact"];
7
+ const serverReads = (adapter) => SERVER_READS.every((method) => typeof adapter[method] === "function") ? adapter : undefined;
8
+ const NO_SERVER_READS = { skipped: "the adapter has no server reads (chats, history, around, contact)" };
9
+ /** Every method of the optional groups, which `capability` hands over or refuses. */
10
+ export const OPTIONAL_METHODS = [
11
+ ...SERVER_READS,
12
+ "historyAfter",
13
+ "historyBefore",
14
+ "topics",
15
+ "inspect",
16
+ "edit",
17
+ "forward",
18
+ "delete",
19
+ "pin",
20
+ "unpin",
21
+ "react",
22
+ "markRead",
23
+ "poll",
24
+ "vote",
25
+ "closePoll",
26
+ "createPoll",
27
+ "watch",
28
+ "feed",
29
+ "download",
30
+ "transcribe",
31
+ "scheduled",
32
+ "members",
33
+ "admins",
34
+ "chatEvents",
35
+ "sessions",
36
+ "lookup",
37
+ "addressBook",
38
+ "people",
39
+ "createGroup",
40
+ "join",
41
+ "leave",
42
+ "group",
43
+ "updateGroup",
44
+ "resetInviteLink",
45
+ "addMembers",
46
+ "removeMembers",
47
+ "addAdmin",
48
+ "removeAdmin",
49
+ "folders",
50
+ "createFolder",
51
+ "updateFolder",
52
+ "deleteFolder",
53
+ "addContact",
54
+ "removeContact",
55
+ "block",
56
+ "unblock",
57
+ "renameContact",
58
+ "importContacts",
59
+ "updateProfile",
60
+ "endOtherSessions",
61
+ ];
62
+ const refuses = async (work, code) => {
63
+ await assert.rejects(work, (error) => {
64
+ assert.ok(isCliFailure(error), `expected a CliError with a code from the closed list, got ${String(error)}`);
65
+ if (code)
66
+ assert.equal(error.code, code);
67
+ return true;
68
+ });
69
+ };
70
+ const within = async (work, failure, ms) => {
71
+ let timer;
72
+ const late = new Promise((_, reject) => {
73
+ timer = setTimeout(() => reject(new assert.AssertionError({ message: `${failure} within ${ms}ms` })), ms);
74
+ });
75
+ try {
76
+ await Promise.race([work, late]);
77
+ }
78
+ finally {
79
+ clearTimeout(timer);
80
+ }
81
+ };
82
+ const idsOf = (messages) => messages.map((message) => message.id);
83
+ /** Every `id`, `chatId` and `senderId` anywhere in `value`, so a number among them is caught. */
84
+ const everyId = (value, found = []) => {
85
+ if (Array.isArray(value))
86
+ for (const item of value)
87
+ everyId(item, found);
88
+ else if (value && typeof value === "object")
89
+ for (const [key, field] of Object.entries(value)) {
90
+ if (["id", "chatId", "senderId"].includes(key) && field !== null)
91
+ found.push(field);
92
+ else if (key !== "providerMetadata")
93
+ everyId(field, found);
94
+ }
95
+ return found;
96
+ };
97
+ /**
98
+ * The port's promises as cases any test runner can run: each connects through `connect`, checks
99
+ * with `node:assert/strict` and closes the adapter. None needs a live service.
100
+ *
101
+ * ```ts
102
+ * for (const one of contractCases({ connect: (seed) => myAdapter(fakeClientFrom(seed)) }))
103
+ * it(one.name, async (context) => {
104
+ * const result = await one.run()
105
+ * if (result) context.skip(result.skipped)
106
+ * })
107
+ * ```
108
+ */
109
+ export const contractCases = ({ connect, ids = wordIds, orderBy = "id", waitMs = 2_000, history = "server", }) => {
110
+ const seedOf = (loggedIn = true) => contractSeed({ ids, loggedIn });
111
+ const busyOf = (seed) => seed.messages.filter((message) => message.chatId === seed.busy);
112
+ const unknownChat = ids("chat", 99, new Date(0));
113
+ const unknownMessage = ids("message", 999, new Date(Date.parse("2026-09-01T08:00:00.000Z")));
114
+ const using = (body, loggedIn = true) => async () => {
115
+ const seed = seedOf(loggedIn);
116
+ const adapter = await connect(seed);
117
+ try {
118
+ return await body(adapter, seed);
119
+ }
120
+ finally {
121
+ await adapter.close();
122
+ }
123
+ };
124
+ const cases = (list) => list.map(([name, body, needs]) => ({ name, run: using(body), ...(needs ? { needs } : {}) }));
125
+ const lacking = (adapter, method) => typeof adapter[method] === "function" ? undefined : { skipped: `the adapter has no ${method}` };
126
+ const reading = (body) => async (adapter, seed) => {
127
+ const server = serverReads(adapter);
128
+ return server ? body(server, seed) : NO_SERVER_READS;
129
+ };
130
+ return [
131
+ ...(history === "server"
132
+ ? [
133
+ {
134
+ name: "a messenger whose history is on the server has every server read",
135
+ run: using(async (adapter) => {
136
+ const missing = SERVER_READS.filter((method) => typeof adapter[method] !== "function");
137
+ assert.deepEqual(missing, [], 'add them, or declare `history: "store"` on the Messenger');
138
+ return undefined;
139
+ }),
140
+ },
141
+ ]
142
+ : []),
143
+ ...cases([
144
+ [
145
+ "self() names the logged-in account, and me() agrees",
146
+ async (adapter, seed) => {
147
+ assert.equal(adapter.self(), seed.account?.id);
148
+ assert.equal((await adapter.me()).id, seed.account?.id);
149
+ },
150
+ ],
151
+ [
152
+ "chats pages by limit and offset and lists every chat once",
153
+ reading(async (adapter, seed) => {
154
+ const first = await adapter.chats({ limit: 2, offset: 0 });
155
+ const rest = await adapter.chats({ limit: 10, offset: 2 });
156
+ assert.equal(first.items.length, 2);
157
+ assert.equal(first.hasMore, true);
158
+ assert.equal(rest.hasMore, false);
159
+ const listed = [...first.items, ...rest.items].map((chat) => chat.id);
160
+ assert.deepEqual(listed.toSorted(), seed.chats.map((chat) => chat.id).toSorted());
161
+ }),
162
+ ],
163
+ [
164
+ "history answers the newest page, oldest first",
165
+ reading(async (adapter, seed) => {
166
+ const page = await adapter.history(seed.busy, { limit: BUSY_PAGE });
167
+ assert.deepEqual(idsOf(page.items), idsOf(busyOf(seed).slice(-BUSY_PAGE)));
168
+ assert.equal(page.hasMore, true);
169
+ }),
170
+ ],
171
+ [
172
+ "history pages back to hasMore: false and answers every message once",
173
+ reading(async (adapter, seed) => {
174
+ const pages = [];
175
+ let before;
176
+ for (let round = 0; round < 10; round += 1) {
177
+ const page = await adapter.history(seed.busy, { limit: BUSY_PAGE, ...(before ? { before } : {}) });
178
+ pages.unshift(page.items);
179
+ const oldest = page.items[0];
180
+ if (!page.hasMore || !oldest)
181
+ break;
182
+ before = orderBy === "id" ? oldest.id : oldest.timestamp;
183
+ }
184
+ assert.deepEqual(idsOf(pages.flat()), idsOf(busyOf(seed)));
185
+ }),
186
+ ],
187
+ [
188
+ "around answers a window oldest first, with one anchor on the message asked for",
189
+ reading(async (adapter, seed) => {
190
+ const busy = busyOf(seed);
191
+ const middle = busy[5];
192
+ const window = await adapter.around(seed.busy, middle.id, { before: 2, after: 2 });
193
+ assert.deepEqual(idsOf(window), idsOf(busy.slice(3, 8)));
194
+ assert.deepEqual(window.filter((message) => message.anchor).map((message) => message.id), [middle.id]);
195
+ const edge = await adapter.around(seed.busy, busy[0].id, { before: 2, after: 1 });
196
+ assert.deepEqual(idsOf(edge), idsOf(busy.slice(0, 2)));
197
+ }),
198
+ ],
199
+ [
200
+ "around refuses a message the chat does not have with not_found",
201
+ reading(async (adapter, seed) => {
202
+ await refuses(adapter.around(seed.busy, unknownMessage, { before: 1, after: 1 }), "not_found");
203
+ }),
204
+ ],
205
+ [
206
+ "resolve finds a chat by its id and by a title only it has",
207
+ async (adapter, seed) => {
208
+ assert.equal((await adapter.resolve(seed.busy)).id, seed.busy);
209
+ const title = seed.chats.find((chat) => chat.id === seed.busy)?.title;
210
+ assert.equal((await adapter.resolve(title)).id, seed.busy);
211
+ },
212
+ ],
213
+ [
214
+ "resolve refuses a title two chats share with validation_error, never picks one",
215
+ async (adapter, seed) => {
216
+ await refuses(adapter.resolve(seed.twins), "validation_error");
217
+ },
218
+ ],
219
+ [
220
+ "resolve refuses a chat that does not exist with not_found, or takes its id as a chat of kind unknown",
221
+ // A messenger may take an id without connecting, so a write its guard refuses never logs in first (max-cli).
222
+ // It may not answer another chat, or invent a title.
223
+ async (adapter) => {
224
+ let chat;
225
+ try {
226
+ chat = await adapter.resolve(unknownChat);
227
+ }
228
+ catch (error) {
229
+ assert.ok(isCliFailure(error), `expected a CliError with a code from the closed list, got ${String(error)}`);
230
+ assert.equal(error.code, "not_found");
231
+ return;
232
+ }
233
+ assert.deepEqual({ id: chat.id, kind: chat.kind, title: chat.title }, { id: unknownChat, kind: "unknown", title: null });
234
+ },
235
+ ],
236
+ [
237
+ "a read of a chat that does not exist fails with a code from the closed list, not a library error",
238
+ async (adapter) => {
239
+ await refuses(adapter.chat(unknownChat));
240
+ const server = serverReads(adapter);
241
+ if (server)
242
+ await refuses(server.history(unknownChat, { limit: 1 }));
243
+ },
244
+ ],
245
+ [
246
+ "chat answers the chat and who is in it",
247
+ async (adapter, seed) => {
248
+ const card = await adapter.chat(seed.busy);
249
+ assert.equal(card.id, seed.busy);
250
+ assert.ok(card.members?.some((member) => member.id === seed.person));
251
+ },
252
+ ],
253
+ [
254
+ "contact answers a person with the chats shared with them, and refuses a group",
255
+ reading(async (adapter, seed) => {
256
+ const card = await adapter.contact(seed.person);
257
+ assert.equal(card.id, seed.person);
258
+ assert.ok(card.chats.some((chat) => chat.id === seed.dialog));
259
+ await refuses(adapter.contact(seed.busy));
260
+ }),
261
+ ],
262
+ [
263
+ "send answers the message sent and the send id it was given",
264
+ async (adapter, seed) => {
265
+ const sendId = adapter.newSendId?.() ?? newSendId();
266
+ const sent = await adapter.send(seed.dialog, "see you there", { sendId });
267
+ assert.equal(sent.sendId, sendId);
268
+ assert.equal(sent.message.chatId, seed.dialog);
269
+ assert.equal(sent.message.text, "see you there");
270
+ const server = serverReads(adapter);
271
+ if (!server)
272
+ return;
273
+ const newest = await server.history(seed.dialog, { limit: 1 });
274
+ assert.deepEqual(idsOf(newest.items), [sent.message.id]);
275
+ },
276
+ "the fake keeps what was sent, so history answers it",
277
+ ],
278
+ [
279
+ "ids are strings in everything the reads answer",
280
+ async (adapter, seed) => {
281
+ const server = serverReads(adapter);
282
+ const answers = [
283
+ await adapter.me(),
284
+ await adapter.resolve(seed.dialog),
285
+ await adapter.chat(seed.busy),
286
+ ...(server
287
+ ? [
288
+ await server.chats({ offset: 0 }),
289
+ await server.history(seed.busy, { limit: 20 }),
290
+ await server.around(seed.busy, busyOf(seed)[1].id, { before: 1, after: 1 }),
291
+ await server.contact(seed.person),
292
+ ]
293
+ : []),
294
+ ];
295
+ const notStrings = everyId(answers).filter((id) => typeof id !== "string");
296
+ assert.deepEqual(notStrings, []);
297
+ },
298
+ ],
299
+ [
300
+ "reads change nothing: chats and history answer the same after every read",
301
+ reading(async (adapter, seed) => {
302
+ const look = async () => ({
303
+ chats: await adapter.chats({ offset: 0 }),
304
+ busy: await adapter.history(seed.busy, { limit: 20 }),
305
+ dialog: await adapter.history(seed.dialog, { limit: 20 }),
306
+ });
307
+ const before = await look();
308
+ await adapter.me();
309
+ await adapter.resolve(seed.dialog);
310
+ await adapter.chat(seed.dialog);
311
+ await adapter.contact(seed.person);
312
+ await adapter.around(seed.dialog, before.dialog.items[0].id, { before: 1, after: 1 });
313
+ const time = Date.parse(seed.messages[0]?.timestamp ?? "");
314
+ await adapter.historyAfter?.(seed.dialog, { limit: 5, after: { time } });
315
+ await adapter.historyBefore?.(seed.dialog, { limit: 5, time: Date.now() });
316
+ assert.deepEqual(await look(), before);
317
+ }),
318
+ ],
319
+ [
320
+ "capability() hands over each optional method the adapter has and refuses each it lacks",
321
+ async (adapter) => {
322
+ for (const method of OPTIONAL_METHODS) {
323
+ const value = adapter[method];
324
+ assert.ok(value === undefined || typeof value === "function", `${method} is neither a method nor absent`);
325
+ if (typeof value === "function")
326
+ assert.equal(typeof capability(adapter, method, method), "function");
327
+ else
328
+ assert.throws(() => capability(adapter, method, method), { code: "validation_error" });
329
+ }
330
+ },
331
+ ],
332
+ [
333
+ "historyAfter answers the oldest newer than a message or a moment, oldest first",
334
+ async (adapter, seed) => {
335
+ const skipped = lacking(adapter, "historyAfter");
336
+ if (skipped)
337
+ return skipped;
338
+ const busy = busyOf(seed);
339
+ const after = busy[2];
340
+ const byId = await adapter.historyAfter?.(seed.busy, { limit: 3, after: { id: after.id } });
341
+ assert.deepEqual(idsOf(byId?.items ?? []), idsOf(busy.slice(3, 6)));
342
+ assert.equal(byId?.hasMore, true);
343
+ const byTime = await adapter.historyAfter?.(seed.busy, {
344
+ limit: 20,
345
+ after: { time: Date.parse(after.timestamp) },
346
+ });
347
+ assert.deepEqual(idsOf(byTime?.items ?? []), idsOf(busy.slice(3)));
348
+ assert.equal(byTime?.hasMore, false);
349
+ },
350
+ ],
351
+ [
352
+ "historyBefore answers the newest sent before a moment, oldest first",
353
+ async (adapter, seed) => {
354
+ const skipped = lacking(adapter, "historyBefore");
355
+ if (skipped)
356
+ return skipped;
357
+ const busy = busyOf(seed);
358
+ const time = Date.parse(busy[5].timestamp);
359
+ const page = await adapter.historyBefore?.(seed.busy, { limit: 2, time });
360
+ assert.deepEqual(idsOf(page?.items ?? []), idsOf(busy.slice(3, 5)));
361
+ assert.equal(page?.hasMore, true);
362
+ },
363
+ ],
364
+ [
365
+ "watch calls onReady once listening and ends when the signal aborts",
366
+ async (adapter) => {
367
+ const skipped = lacking(adapter, "watch");
368
+ if (skipped)
369
+ return skipped;
370
+ const controller = new AbortController();
371
+ let ready = () => { };
372
+ const listening = new Promise((resolve) => {
373
+ ready = resolve;
374
+ });
375
+ const watching = adapter.watch?.(() => { }, controller.signal, ready);
376
+ await within(listening, "watch never called onReady", waitMs);
377
+ controller.abort();
378
+ await within(Promise.resolve(watching), "watch did not end when the signal aborted", waitMs);
379
+ },
380
+ "`connect` opens a connection that listens, as `{ listen: true }` does",
381
+ ],
382
+ [
383
+ "feed pushes only the seed's chats and messages, with ids as strings, and ends when the signal aborts",
384
+ async (adapter, seed) => {
385
+ const skipped = lacking(adapter, "feed");
386
+ if (skipped)
387
+ return skipped;
388
+ const controller = new AbortController();
389
+ const batches = [];
390
+ let pushed = () => { };
391
+ const first = new Promise((resolve) => {
392
+ pushed = resolve;
393
+ });
394
+ const feeding = adapter.feed?.((batch) => {
395
+ batches.push(batch);
396
+ pushed();
397
+ }, controller.signal);
398
+ await within(first, "feed pushed nothing", waitMs);
399
+ controller.abort();
400
+ await within(Promise.resolve(feeding), "feed did not end when the signal aborted", waitMs);
401
+ const chats = new Set(seed.chats.map((chat) => chat.id));
402
+ const messages = new Set(seed.messages.map((message) => `${message.chatId}/${message.id}`));
403
+ for (const batch of batches) {
404
+ for (const chat of batch.chats ?? [])
405
+ assert.ok(chats.has(chat.id), `chat ${chat.id} is not in the seed`);
406
+ for (const message of batch.messages ?? [])
407
+ assert.ok(messages.has(`${message.chatId}/${message.id}`), `message ${message.id} is not in the seed`);
408
+ }
409
+ assert.deepEqual(everyId(batches).filter((id) => typeof id !== "string"), [], "every id is a string");
410
+ },
411
+ "the fake pushes the seed's history once connected, as `fakeAdapter(seed, { feed: true })` does",
412
+ ],
413
+ ]),
414
+ {
415
+ name: "self() is null before a login",
416
+ needs: "the fake as a profile that never logged in: `seed.account` is null",
417
+ run: using(async (adapter) => {
418
+ assert.equal(adapter.self(), null);
419
+ }, false),
420
+ },
421
+ {
422
+ name: "a repeated send id leaves one message",
423
+ needs: "the fake drops a repeat of a send id, as the messenger's server does",
424
+ run: using(reading(async (adapter, seed) => {
425
+ const sendId = adapter.newSendId?.() ?? newSendId();
426
+ const first = await adapter.send(seed.dialog, "only once", { sendId });
427
+ const again = await adapter.send(seed.dialog, "only once", { sendId });
428
+ assert.equal(again.message.id, first.message.id);
429
+ const after = await adapter.history(seed.dialog, { limit: 20 });
430
+ assert.equal(after.items.filter((message) => message.text === "only once").length, 1);
431
+ })),
432
+ },
433
+ ...(orderBy === "id"
434
+ ? [
435
+ {
436
+ name: "a messenger whose store pages by id answers whole-number ids within 2^53",
437
+ run: using(reading(async (adapter, seed) => {
438
+ const page = await adapter.history(seed.busy, { limit: 20 });
439
+ const unsafe = page.items
440
+ .map((message) => message.id)
441
+ .filter((id) => !/^-?\d+$/.test(id) || !Number.isSafeInteger(Number(id)));
442
+ assert.deepEqual(unsafe, [], "page by time (`fetching.orderBy`) or give whole-number ids");
443
+ })),
444
+ },
445
+ ]
446
+ : []),
447
+ ];
448
+ };
449
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/kit/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { AccountEditing, AccountTools, ChatFolders, ChatReading, ContactBook, GroupAdmin, GroupModeration, LiveUpdates, MessageEditing, MessageMedia, MessagePins, MessagePolls, MessageReactions, MessengerCore, PushedHistory, ReadState, ScheduledMessages, ServerReads } from "../cli/messenger/port.js";
2
+ import { type Seed } from "./seed.js";
3
+ /** Every group of the port, over memory. */
4
+ export type FakeAdapter = MessengerCore & ServerReads & ChatReading & MessageEditing & MessagePins & MessageReactions & ReadState & MessagePolls & LiveUpdates & MessageMedia & ScheduledMessages & GroupModeration & AccountTools & GroupAdmin & ChatFolders & ContactBook & AccountEditing & Partial<PushedHistory>;
5
+ /**
6
+ * A messenger in memory, over `seed` (`contractSeed()` when not given), copied so a test may keep
7
+ * using its seed. It keeps the port's promises — oldest first, `hasMore`, a repeated send id leaving
8
+ * one message, `CliError` codes — and passes `contractCases`. Writes change only its own copy.
9
+ *
10
+ * With `{ feed: true }` it also pushes its history, as a messenger with `history: "store"` does:
11
+ * the chats and people in one batch, then each chat's messages in a batch of their own.
12
+ */
13
+ export declare const fakeAdapter: (seed?: Seed, options?: {
14
+ feed?: boolean;
15
+ }) => FakeAdapter;
16
+ //# sourceMappingURL=fake.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.d.ts","sourceRoot":"","sources":["../../src/kit/fake.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACV,eAAe,EAEf,WAAW,EACX,cAAc,EACd,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,SAAS,EACT,iBAAiB,EAEjB,WAAW,EACZ,MAAM,0BAA0B,CAAA;AAkBjC,OAAO,EAAgB,KAAK,IAAI,EAAE,MAAM,WAAW,CAAA;AAEnD,4CAA4C;AAC5C,MAAM,MAAM,WAAW,GAAG,aAAa,GACrC,WAAW,GACX,WAAW,GACX,cAAc,GACd,WAAW,GACX,gBAAgB,GAChB,SAAS,GACT,YAAY,GACZ,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,eAAe,GACf,YAAY,GACZ,UAAU,GACV,WAAW,GACX,WAAW,GACX,cAAc,GACd,OAAO,CAAC,aAAa,CAAC,CAAA;AA2BxB;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UAAU,IAAI,YAA4B;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAAQ,WA8a3F,CAAA"}