@fedify/botkit 0.5.0-dev.210 → 0.5.0-dev.226
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/bot-group.test.d.ts +2 -0
- package/dist/bot-group.test.js +220 -0
- package/dist/bot-group.test.js.map +1 -0
- package/dist/bot-impl.d.ts +132 -13
- package/dist/bot-impl.d.ts.map +1 -1
- package/dist/bot-impl.js +400 -178
- package/dist/bot-impl.js.map +1 -1
- package/dist/bot-impl.test.js +214 -76
- package/dist/bot-impl.test.js.map +1 -1
- package/dist/bot.d.ts +94 -48
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +2 -104
- package/dist/bot.js.map +1 -1
- package/dist/bot.test.js +59 -0
- package/dist/bot.test.js.map +1 -1
- package/dist/components/FollowButton.d.ts +3 -1
- package/dist/components/FollowButton.d.ts.map +1 -1
- package/dist/components/FollowButton.js +2 -2
- package/dist/components/FollowButton.js.map +1 -1
- package/dist/components/Layout.js +1 -1
- package/dist/components/Layout.js.map +1 -1
- package/dist/components/Message.d.ts +2 -2
- package/dist/deno.js +3 -13
- package/dist/deno.js.map +1 -1
- package/dist/follow-impl.test.js +3 -3
- package/dist/follow-impl.test.js.map +1 -1
- package/dist/instance-impl.d.ts +158 -0
- package/dist/instance-impl.d.ts.map +1 -0
- package/dist/instance-impl.js +603 -0
- package/dist/instance-impl.js.map +1 -0
- package/dist/instance-impl.test.d.ts +2 -0
- package/dist/instance-impl.test.js +103 -0
- package/dist/instance-impl.test.js.map +1 -0
- package/dist/instance-multi.test.d.ts +2 -0
- package/dist/instance-multi.test.js +151 -0
- package/dist/instance-multi.test.js.map +1 -0
- package/dist/instance-routing.test.d.ts +2 -0
- package/dist/instance-routing.test.js +367 -0
- package/dist/instance-routing.test.js.map +1 -0
- package/dist/instance.d.ts +318 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +51 -0
- package/dist/instance.js.map +1 -0
- package/dist/message-impl.d.ts.map +1 -1
- package/dist/message-impl.js +17 -10
- package/dist/message-impl.js.map +1 -1
- package/dist/message-impl.test.js +43 -9
- package/dist/message-impl.test.js.map +1 -1
- package/dist/mod.d.ts +5 -3
- package/dist/mod.js +4 -2
- package/dist/pages.d.ts +10 -1
- package/dist/pages.d.ts.map +1 -1
- package/dist/pages.js +112 -41
- package/dist/pages.js.map +1 -1
- package/dist/pages.test.d.ts +2 -0
- package/dist/pages.test.js +170 -0
- package/dist/pages.test.js.map +1 -0
- package/dist/repository.d.ts +385 -138
- package/dist/repository.d.ts.map +1 -1
- package/dist/repository.js +595 -223
- package/dist/repository.js.map +1 -1
- package/dist/repository.test.js +564 -136
- package/dist/repository.test.js.map +1 -1
- package/dist/session-impl.d.ts.map +1 -1
- package/dist/session-impl.js +13 -4
- package/dist/session-impl.js.map +1 -1
- package/dist/session-impl.test.d.ts.map +1 -1
- package/dist/session-impl.test.js +9 -9
- package/dist/session-impl.test.js.map +1 -1
- package/dist/session.d.ts +8 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/text.d.ts.map +1 -1
- package/dist/text.js +27 -10
- package/dist/text.js.map +1 -1
- package/dist/text.test.js +37 -2
- package/dist/text.test.js.map +1 -1
- package/dist/uri.d.ts +46 -0
- package/dist/uri.d.ts.map +1 -0
- package/dist/uri.js +64 -0
- package/dist/uri.js.map +1 -0
- package/dist/uri.test.d.ts +2 -0
- package/dist/uri.test.js +93 -0
- package/dist/uri.test.js.map +1 -0
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.test.js","names":["factories: Record<string, () => Repository>","keyPairs: CryptoKeyPair[]","messageC"],"sources":["../src/repository.test.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025–2026 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport { MemoryKvStore } from \"@fedify/fedify/federation\";\nimport { importJwk } from \"@fedify/fedify/sig\";\nimport { Create, Follow, Note, Person, PUBLIC_COLLECTION } from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport {\n KvRepository,\n MemoryCachedRepository,\n MemoryRepository,\n type Repository,\n} from \"./repository.ts\";\n\nfunction createKvRepository(): Repository {\n return new KvRepository(new MemoryKvStore());\n}\n\nfunction createMemoryRepository(): Repository {\n return new MemoryRepository();\n}\n\nfunction createMemoryCachedRepository(): Repository {\n return new MemoryCachedRepository(createKvRepository());\n}\n\nconst factories: Record<string, () => Repository> = {\n KvRepository: createKvRepository,\n MemoryRepository: createMemoryRepository,\n MemoryCachedRepository: createMemoryCachedRepository,\n};\n\nconst keyPairs: CryptoKeyPair[] = [\n {\n publicKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"1NZblYSc2beQqDmDUF_VDMeS7bUXShvIMK6NHd9OB-7ivBwad8vUcmqKwWj_ivqZva6EgD-n0549t0Pzn5xTArqEJ-c1DTyhC7TNtof0KIbU75qziHwHOqcyYCHusQgDm_TT7frDuxLqHJQ1UrdADMyCVDPFfcstPHhHp3NYStGeNcBo5B05DB_wkgqX2QF2MamQwkdRRMdZkVees38AsC6GTGoOFRI2lvJuUODtndpyjGAKOkLfkr9XzAcggRYx9ddsHBd5wylffwKhtUtWHkdVBdVAiEX8sZ38LhqNYm161PE83nfEvut6_lCCQ7DlPJ8Tp6SY-f2JTXA-C9sN0uJF8_YGhaCPgolv5Pk2UerQmvhMhql9MLDen1AvZrw0u1CWic0GQeIDA6Op9Exd5azhhdm4iKeYzAekUHFDi6WZRRZRCYgHaEEzXyFt9W3N3paolMYVOh1008d-aIgbYnZMToiwH897uQsNGkd1FVIutycXdeuhAbqB7AtLrzuD78wkKLO8k3DFcix2qaHRqiBKC3lUlDCD_I5yzinY_SOcagdpRxczvi6JN1ahUg39ZKYRtJIxUOp1H3iRrebbaOoxM19-axKH1om0sYtyX4JqYfN9QrSf3cO1I6CGnJY8hIkQ6CDH5Tmk_4VRRKdzphq4jZiiOYfR94WODPKDjTM\",\n e: \"AQAB\",\n // cSpell: enable\n key_ops: [\"verify\"],\n ext: true,\n }, \"public\"),\n privateKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"1NZblYSc2beQqDmDUF_VDMeS7bUXShvIMK6NHd9OB-7ivBwad8vUcmqKwWj_ivqZva6EgD-n0549t0Pzn5xTArqEJ-c1DTyhC7TNtof0KIbU75qziHwHOqcyYCHusQgDm_TT7frDuxLqHJQ1UrdADMyCVDPFfcstPHhHp3NYStGeNcBo5B05DB_wkgqX2QF2MamQwkdRRMdZkVees38AsC6GTGoOFRI2lvJuUODtndpyjGAKOkLfkr9XzAcggRYx9ddsHBd5wylffwKhtUtWHkdVBdVAiEX8sZ38LhqNYm161PE83nfEvut6_lCCQ7DlPJ8Tp6SY-f2JTXA-C9sN0uJF8_YGhaCPgolv5Pk2UerQmvhMhql9MLDen1AvZrw0u1CWic0GQeIDA6Op9Exd5azhhdm4iKeYzAekUHFDi6WZRRZRCYgHaEEzXyFt9W3N3paolMYVOh1008d-aIgbYnZMToiwH897uQsNGkd1FVIutycXdeuhAbqB7AtLrzuD78wkKLO8k3DFcix2qaHRqiBKC3lUlDCD_I5yzinY_SOcagdpRxczvi6JN1ahUg39ZKYRtJIxUOp1H3iRrebbaOoxM19-axKH1om0sYtyX4JqYfN9QrSf3cO1I6CGnJY8hIkQ6CDH5Tmk_4VRRKdzphq4jZiiOYfR94WODPKDjTM\",\n e: \"AQAB\",\n d: \"Yl3DrCHDIDhfifAyyWXRIHvoYyZL4jte1WkG3WSEOtRkRA41CWLSCCNHh8YQPNo_TdQnduJ0nTBIU7f7E6x7DQrI42xPL5Py1mc0oATLiiNurGJyUUUJTklR1e440-bhTCXmANnhtkcyngy9bEI3PvMR1PqsbswFVyo76586kjG5DhykHbGH2Ru14rk0nt23E5LLzY6Kd-AufCbjuQ-ccNC_zvdBFOn7At5-r7CVAVyhjlEgyPZ5P-hhGnG8ywxIANgUJhOPeexYL2o29IQiBBJxsCV0EsdN14UttN0etPvmRh5MRIFUE-zfRkRNQB20hMT8n4FKFlfgKkMS2gXep91h9VVyfYPHAt9jGJgUbIcbx_igeLK3nQlaUXaePf2bAuVRM1kW3P2UR0FOoUKDI5FZmi9XBoEtt0taQYySdKbPSXKaJWO2vKQ4SPyVXzzz-obfVe2zIe1msQ3Tco5RFoHfnufbvvnLC_WUAC9LSfp4jrPvr5lY3uoCFmPma56R-E3mVd2q87Ybk6mqvSh4yWHjid7sfzQ8Ovh9OhZlq_7Mfa3q3M92vNL98iHs8xYkJbE0DJs691UdgX45iNi4DVD-hJ7EbKQQgePsYNovWA611kM-cartevQWk7TBBggy9VYqmdWN0QuVQX9bsHFeYjjKSXg24bV5vYQW3EPkqZk\",\n p: \"9DeEDfMVdV605MbHCtHnw5xEbzTHd7vK-qAQNIjz5i4EmFC0tK7dvUiSn0WeyMNYJkuxVxTMHoDbWXzXq45tzbTEYuzEo5wsxyoVvldfFnnJIwMu6Hb7PWjyWfpBcbwLISr8fAJaGPzgcFsJE__KxrvLA66m1q_4k1y1L9CvXWfHDvFqb7VLGzKWXXp2wlbsACZuqx2Ff3THcWoOWb-wSww6AGsYAc3zC_DiYvAaTn9MxszZ0UYuMeJIHjLA1dmjL-Nksvq5GukjFxSSTpUS87zJ08fHoB0FzTKIIjJGpMRf6ebReLqbYCdo2Kr7eC7lbcTfwQTPI6gnHSKgPIYF5Q\",\n q: \"3xtArH_4MQjwRpl7JVivzQUZgDTARkynMpX-4Gvyny6Gxx0QLhHH0lQMRhtFWlI6qLZxCCLC9zhXPmGlqW-QWya8-xE80mX45JTrQlwBHISpTWTV3sI2Lp5dg7CW8Sc40CE4kB4Q2rHhf7V-Aimgmqhnl1uguzH2DXfr3RaCor0ge44k6gi1LXEJN_aFQIIFYL8HQOM0ctdY147Kr2rVHLchRnh8Q4GzBAJvpOcfvEDk9HF09NVxeaivLMXChpuSUHqbEGg_lVkotLnCMb-fUWk8QmO8EFFVU0pyOFDqHKIgrHOLSHjgUvV8moBwnMGQxMgu7rpY3g-9cXfsCoKVNw\",\n dp:\n \"bL1vajqrelhSGW-83r95_-pLumx4yIJwrcmpjYrRdtNUrnF5FN6r0wVGa-629dOtI1gevZSAErDzelQRP80qbSapLxcXs3XtpjzB87-5kitl-NYJA-8-jSh2iMPacgb1ua4HQDxX27p1QPH4B9SkeHrTuW8B0KQH_a2Q65pzCxcTVj7-UoEZ0SFkPHkz-fJ0INj7--soLwlTaNd9Tk8A81mdVeRZiywlpVJ7quwX-o3KJNa_weQK26FS1Udp_45pkAAjLWJgG3BldHhvcNgF2UtdXpQc-dkSZTyzyu4x8FmUD3T8HlKQrm69y4POdsQC2i6IJsy6YrkTuXBagrh2VQ\",\n dq:\n \"j0CQZjJEyjdTEAG8cF5hguKjXQ6B5qGROYnV_YNSZaMaJv8iRHJmO0Z8GwenoDbsMyfxq6emR9aFLijEleZsahqVfR-0TePry9lStWkdzZHgozD7oexRnd1Rbh0UzgLBF-I8z0x-xe0xPS7rmbfgx20aFrVentOViVBWwb6SYqvND4hVa2_r5SGPKb_AD4tsqJH_tkosgxCCmuW0fq256JYtZ3I1V6MPrqNhzCAa4GVKnSm8Tvg9xD_rOnRAUu3RJJuUtRQ6v0pgOKqNZiQDx-IqLvaa6l9OygwjCsXpjDkNga0u4Xm7j4jQWOPfasdejPt8Jwy_wtWYbiLyDE2MQQ\",\n qi:\n \"Th3TS6fHquqNljwZU2Vg7ndI0SmJidIwSTS2LlhM-Y2bxaAUF-orpS504xDVk1xjRYBrdxiTOmohbtoKtiWhLveOUAWVoNilMqgEU7lwnhaE3yfiUoE1x8df_wLP_YiAccFKeMZwsQp29aKLxuYQtO2dRSSQkN0IuxMGchnJtGOGNTbyA44O25IwggV1nlJN7OTX-nsJCSCe1XMojnGezhnD4xXGeSuR3S07oDDiWpvAO7qtRphEavVTtXdJWIr27tBvnUytbpb4uq6A3J4-TZ6X9uzlOw6jBSQhbL7fc83Z9E_wjPTnxfHufiC_AtXow6sK7lCy10aJGHp3jnGVdQ\",\n // cSpell: enable\n key_ops: [\"sign\"],\n ext: true,\n }, \"private\"),\n },\n {\n privateKey: await importJwk({\n kty: \"OKP\",\n crv: \"Ed25519\",\n // cSpell: disable-next-line\n x: \"CwcwyY7tu4wVzVW3KKX7AnBO8HakA2pg0rhAiMbGtfk\",\n key_ops: [\"sign\"],\n ext: true,\n // cSpell: disable-next-line\n d: \"K64nFsAPt892l7rr10uDsBXCW151CUM29SugU6l4ZzE\",\n }, \"private\"),\n publicKey: await importJwk({\n kty: \"OKP\",\n crv: \"Ed25519\",\n // cSpell: disable-next-line\n x: \"CwcwyY7tu4wVzVW3KKX7AnBO8HakA2pg0rhAiMbGtfk\",\n key_ops: [\"verify\"],\n ext: true,\n }, \"public\"),\n },\n];\n\nfor (const name in factories) {\n const factory = factories[name];\n\n describe(name, () => {\n const repo = factory();\n\n test(\"key pairs\", async () => {\n assert.deepStrictEqual(await repo.getKeyPairs(), undefined);\n await repo.setKeyPairs(keyPairs);\n assert.deepStrictEqual(await repo.getKeyPairs(), keyPairs);\n });\n\n test(\"messages\", async () => {\n assert.deepStrictEqual(await repo.countMessages(), 0);\n assert.deepStrictEqual(\n await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(await Array.fromAsync(repo.getMessages()), []);\n\n const messageA = new Create({\n id: new URL(\n \"https://example.com/ap/create/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n });\n const messageB = new Create({\n id: new URL(\n \"https://example.com/ap/create/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messageC = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messageD = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n });\n const messageC2 = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hi, world!\",\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n updated: Temporal.Instant.from(\"2025-01-03T12:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n updated: Temporal.Instant.from(\"2025-01-03T12:00:00Z\"),\n });\n\n await repo.addMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\", messageA);\n assert.deepStrictEqual(await repo.countMessages(), 1);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages())).map((m) => m.toJsonLd()),\n ),\n [await messageA.toJsonLd()],\n );\n\n await repo.addMessage(\"0194244f-d800-7873-8993-ef71ccd47306\", messageB);\n assert.deepStrictEqual(await repo.countMessages(), 2);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"))\n ?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages())).map((m) => m.toJsonLd()),\n ),\n [await messageB.toJsonLd(), await messageA.toJsonLd()],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages({ order: \"oldest\" }))).map((\n m,\n ) => m.toJsonLd()),\n ),\n [await messageA.toJsonLd(), await messageB.toJsonLd()],\n );\n\n await repo.addMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\", messageC);\n assert.deepStrictEqual(await repo.countMessages(), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"))\n ?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"))\n ?.toJsonLd(),\n await messageC.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages({ order: \"newest\" }))).map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n await messageA.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages({ order: \"oldest\" }))).map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageA.toJsonLd(),\n await messageB.toJsonLd(),\n await messageC.toJsonLd(),\n ],\n );\n\n await repo.addMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\", messageD);\n assert.deepStrictEqual(await repo.countMessages(), 4);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"))\n ?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"))\n ?.toJsonLd(),\n await messageC.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages())).map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageD.toJsonLd(),\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n await messageA.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(\n repo.getMessages({\n order: \"oldest\",\n until: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n }),\n )).map((m) => m.toJsonLd()),\n ),\n [\n await messageA.toJsonLd(),\n await messageB.toJsonLd(),\n await messageC.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(\n repo.getMessages({\n since: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n )).map((m) => m.toJsonLd()),\n ),\n [\n await messageD.toJsonLd(),\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(\n repo.getMessages({\n until: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n since: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n )).map((m) => m.toJsonLd()),\n ),\n [\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n ],\n );\n\n const removed = await repo.removeMessage(\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n );\n assert.deepStrictEqual(\n await removed?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(await repo.countMessages(), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"))\n ?.toJsonLd(),\n await messageC.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages({ order: \"newest\" }))).map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageD.toJsonLd(),\n await messageC.toJsonLd(),\n await messageA.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages({ order: \"oldest\" }))).map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageA.toJsonLd(),\n await messageC.toJsonLd(),\n await messageD.toJsonLd(),\n ],\n );\n\n await repo.updateMessage(\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n async (messageC) =>\n messageC.clone({\n object: await messageC2.getObject(),\n updated: messageC2.updated,\n }),\n );\n assert.deepStrictEqual(await repo.countMessages(), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"))\n ?.toJsonLd(),\n await messageC2.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n\n let updaterCalled = false;\n const updated = await repo.updateMessage(\n \"00000000-0000-0000-0000-000000000000\",\n (message) => {\n updaterCalled = true;\n return message;\n },\n );\n assert.deepStrictEqual(updated, false);\n assert.deepStrictEqual(updaterCalled, false);\n assert.deepStrictEqual(await repo.countMessages(), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"))\n ?.toJsonLd(),\n await messageC2.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n\n const updated2 = await repo.updateMessage(\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n (_) => undefined,\n );\n assert.deepStrictEqual(updated2, false);\n assert.deepStrictEqual(await repo.countMessages(), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\"))\n ?.toJsonLd(),\n await messageC2.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\"))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n });\n\n test(\"followers\", async () => {\n const followerA = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const followFromA = new URL(\n \"https://example.com/ap/follow/be2da56a-0ea3-4a6a-9dff-2a1837be67e0\",\n );\n const followerB = new Person({\n id: new URL(\"https://example.com/ap/actor/jane\"),\n preferredUsername: \"jane\",\n });\n const followFromB = new URL(\n \"https://example.com/ap/follow/8b76286d-5eef-4f02-8a16-080ff2b0e2ca\",\n );\n\n assert.deepStrictEqual(await repo.countFollowers(), 0);\n assert.deepStrictEqual(await repo.hasFollower(followerA.id!), false);\n assert.deepStrictEqual(await repo.hasFollower(followerB.id!), false);\n assert.deepStrictEqual(await Array.fromAsync(repo.getFollowers()), []);\n\n await repo.addFollower(followFromA, followerA);\n assert.deepStrictEqual(await repo.countFollowers(), 1);\n assert.ok(await repo.hasFollower(followerA.id!));\n assert.deepStrictEqual(await repo.hasFollower(followerB.id!), false);\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers())).map((f) => f.toJsonLd()),\n ),\n [await followerA.toJsonLd()],\n );\n\n await repo.addFollower(followFromB, followerB);\n assert.deepStrictEqual(await repo.countFollowers(), 2);\n assert.ok(await repo.hasFollower(followerA.id!));\n assert.ok(await repo.hasFollower(followerB.id!));\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers())).map((f) => f.toJsonLd()),\n ),\n [await followerA.toJsonLd(), await followerB.toJsonLd()],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers({ offset: 1 }))).map((f) =>\n f.toJsonLd()\n ),\n ),\n [await followerB.toJsonLd()],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers({ limit: 1 }))).map((f) =>\n f.toJsonLd()\n ),\n ),\n [await followerA.toJsonLd()],\n );\n\n assert.deepStrictEqual(\n await repo.removeFollower(followFromA, followerB.id!),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.removeFollower(followFromB, followerA.id!),\n undefined,\n );\n assert.deepStrictEqual(await repo.countFollowers(), 2);\n assert.ok(await repo.hasFollower(followerA.id!));\n assert.ok(await repo.hasFollower(followerB.id!));\n\n await repo.removeFollower(followFromA, followerA.id!);\n assert.deepStrictEqual(await repo.countFollowers(), 1);\n assert.deepStrictEqual(await repo.hasFollower(followerA.id!), false);\n assert.ok(await repo.hasFollower(followerB.id!));\n\n await repo.removeFollower(followFromB, followerB.id!);\n assert.deepStrictEqual(await repo.countFollowers(), 0);\n assert.deepStrictEqual(await repo.hasFollower(followerA.id!), false);\n assert.deepStrictEqual(await repo.hasFollower(followerB.id!), false);\n });\n\n test(\"sent follows\", async () => {\n const follow = new Follow({\n id: new URL(\n \"https://example.com/ap/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/john\"),\n });\n\n assert.deepStrictEqual(\n await repo.getSentFollow(\"03a395a2-353a-4894-afdb-2cab31a7b004\"),\n undefined,\n );\n\n await repo.addSentFollow(\"03a395a2-353a-4894-afdb-2cab31a7b004\", follow);\n assert.deepStrictEqual(\n await (await repo.getSentFollow(\"03a395a2-353a-4894-afdb-2cab31a7b004\"))\n ?.toJsonLd(),\n await follow.toJsonLd(),\n );\n\n await repo.removeSentFollow(\"03a395a2-353a-4894-afdb-2cab31a7b004\");\n assert.deepStrictEqual(\n await repo.getSentFollow(\"03a395a2-353a-4894-afdb-2cab31a7b004\"),\n undefined,\n );\n });\n\n test(\"followees\", async () => {\n const followeeId = new URL(\"https://example.com/ap/actor/john\");\n const follow = new Follow({\n id: new URL(\n \"https://example.com/ap/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followeeId,\n });\n\n assert.deepStrictEqual(await repo.getFollowee(followeeId), undefined);\n\n await repo.addFollowee(followeeId, follow);\n assert.deepStrictEqual(\n await (await repo.getFollowee(followeeId))?.toJsonLd(),\n await follow.toJsonLd(),\n );\n\n await repo.removeFollowee(followeeId);\n assert.deepStrictEqual(await repo.getFollowee(followeeId), undefined);\n });\n\n test(\"poll voting\", async () => {\n const messageId1 = \"01945678-1234-7890-abcd-ef0123456789\";\n const messageId2 = \"01945678-5678-7890-abcd-ef0123456789\";\n const voter1 = new URL(\"https://example.com/ap/actor/alice\");\n const voter2 = new URL(\"https://example.com/ap/actor/bob\");\n const voter3 = new URL(\"https://example.com/ap/actor/charlie\");\n\n // Initially, no votes exist\n assert.deepStrictEqual(await repo.countVoters(messageId1), 0);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {});\n assert.deepStrictEqual(await repo.countVoters(messageId2), 0);\n assert.deepStrictEqual(await repo.countVotes(messageId2), {});\n\n // Single voter, single option\n await repo.vote(messageId1, voter1, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(messageId1), 1);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 1,\n });\n\n // Same voter votes for same option again (should be ignored)\n await repo.vote(messageId1, voter1, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(messageId1), 1);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 1,\n });\n\n // Same voter votes for different option (multiple choice)\n await repo.vote(messageId1, voter1, \"option2\");\n assert.deepStrictEqual(await repo.countVoters(messageId1), 1);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 1,\n \"option2\": 1,\n });\n\n // Different voter votes for same option\n await repo.vote(messageId1, voter2, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(messageId1), 2);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n });\n\n // Third voter votes for new option\n await repo.vote(messageId1, voter3, \"option3\");\n assert.deepStrictEqual(await repo.countVoters(messageId1), 3);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n \"option3\": 1,\n });\n\n // Votes for different message should be separate\n await repo.vote(messageId2, voter1, \"optionA\");\n await repo.vote(messageId2, voter2, \"optionB\");\n assert.deepStrictEqual(await repo.countVoters(messageId2), 2);\n assert.deepStrictEqual(await repo.countVotes(messageId2), {\n \"optionA\": 1,\n \"optionB\": 1,\n });\n\n // Original message votes should remain unchanged\n assert.deepStrictEqual(await repo.countVoters(messageId1), 3);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n \"option3\": 1,\n });\n\n // Test with empty options (edge case)\n await repo.vote(messageId1, voter1, \"\");\n assert.deepStrictEqual(await repo.countVoters(messageId1), 3);\n assert.deepStrictEqual(await repo.countVotes(messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n \"option3\": 1,\n \"\": 1,\n });\n });\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repository.test.js","names":["factories: Record<string, () => Repository>","keyPairs: CryptoKeyPair[]","messageC","uuid: Uuid","actor: string","messageId: Uuid","message","followUuid: Uuid","kv: MemoryKvStore","sentFollowId: Uuid","#inner","key: KvKey","value: unknown","expectedValue: unknown","newValue: unknown","prefix?: KvKey"],"sources":["../src/repository.test.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025–2026 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport {\n type KvStoreListEntry,\n MemoryKvStore,\n} from \"@fedify/fedify/federation\";\nimport { exportJwk, importJwk } from \"@fedify/fedify/sig\";\nimport { Create, Follow, Note, Person, PUBLIC_COLLECTION } from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport {\n type KvKey,\n KvRepository,\n type KvStore,\n MemoryCachedRepository,\n MemoryRepository,\n type Repository,\n type Uuid,\n} from \"./repository.ts\";\n\nfunction createKvRepository(): Repository {\n return new KvRepository(new MemoryKvStore());\n}\n\nfunction createMemoryRepository(): Repository {\n return new MemoryRepository();\n}\n\nfunction createMemoryCachedRepository(): Repository {\n return new MemoryCachedRepository(createKvRepository());\n}\n\nconst factories: Record<string, () => Repository> = {\n KvRepository: createKvRepository,\n MemoryRepository: createMemoryRepository,\n MemoryCachedRepository: createMemoryCachedRepository,\n};\n\nconst keyPairs: CryptoKeyPair[] = [\n {\n publicKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"1NZblYSc2beQqDmDUF_VDMeS7bUXShvIMK6NHd9OB-7ivBwad8vUcmqKwWj_ivqZva6EgD-n0549t0Pzn5xTArqEJ-c1DTyhC7TNtof0KIbU75qziHwHOqcyYCHusQgDm_TT7frDuxLqHJQ1UrdADMyCVDPFfcstPHhHp3NYStGeNcBo5B05DB_wkgqX2QF2MamQwkdRRMdZkVees38AsC6GTGoOFRI2lvJuUODtndpyjGAKOkLfkr9XzAcggRYx9ddsHBd5wylffwKhtUtWHkdVBdVAiEX8sZ38LhqNYm161PE83nfEvut6_lCCQ7DlPJ8Tp6SY-f2JTXA-C9sN0uJF8_YGhaCPgolv5Pk2UerQmvhMhql9MLDen1AvZrw0u1CWic0GQeIDA6Op9Exd5azhhdm4iKeYzAekUHFDi6WZRRZRCYgHaEEzXyFt9W3N3paolMYVOh1008d-aIgbYnZMToiwH897uQsNGkd1FVIutycXdeuhAbqB7AtLrzuD78wkKLO8k3DFcix2qaHRqiBKC3lUlDCD_I5yzinY_SOcagdpRxczvi6JN1ahUg39ZKYRtJIxUOp1H3iRrebbaOoxM19-axKH1om0sYtyX4JqYfN9QrSf3cO1I6CGnJY8hIkQ6CDH5Tmk_4VRRKdzphq4jZiiOYfR94WODPKDjTM\",\n e: \"AQAB\",\n // cSpell: enable\n key_ops: [\"verify\"],\n ext: true,\n }, \"public\"),\n privateKey: await importJwk({\n kty: \"RSA\",\n alg: \"RS256\",\n // cSpell: disable\n n: \"1NZblYSc2beQqDmDUF_VDMeS7bUXShvIMK6NHd9OB-7ivBwad8vUcmqKwWj_ivqZva6EgD-n0549t0Pzn5xTArqEJ-c1DTyhC7TNtof0KIbU75qziHwHOqcyYCHusQgDm_TT7frDuxLqHJQ1UrdADMyCVDPFfcstPHhHp3NYStGeNcBo5B05DB_wkgqX2QF2MamQwkdRRMdZkVees38AsC6GTGoOFRI2lvJuUODtndpyjGAKOkLfkr9XzAcggRYx9ddsHBd5wylffwKhtUtWHkdVBdVAiEX8sZ38LhqNYm161PE83nfEvut6_lCCQ7DlPJ8Tp6SY-f2JTXA-C9sN0uJF8_YGhaCPgolv5Pk2UerQmvhMhql9MLDen1AvZrw0u1CWic0GQeIDA6Op9Exd5azhhdm4iKeYzAekUHFDi6WZRRZRCYgHaEEzXyFt9W3N3paolMYVOh1008d-aIgbYnZMToiwH897uQsNGkd1FVIutycXdeuhAbqB7AtLrzuD78wkKLO8k3DFcix2qaHRqiBKC3lUlDCD_I5yzinY_SOcagdpRxczvi6JN1ahUg39ZKYRtJIxUOp1H3iRrebbaOoxM19-axKH1om0sYtyX4JqYfN9QrSf3cO1I6CGnJY8hIkQ6CDH5Tmk_4VRRKdzphq4jZiiOYfR94WODPKDjTM\",\n e: \"AQAB\",\n d: \"Yl3DrCHDIDhfifAyyWXRIHvoYyZL4jte1WkG3WSEOtRkRA41CWLSCCNHh8YQPNo_TdQnduJ0nTBIU7f7E6x7DQrI42xPL5Py1mc0oATLiiNurGJyUUUJTklR1e440-bhTCXmANnhtkcyngy9bEI3PvMR1PqsbswFVyo76586kjG5DhykHbGH2Ru14rk0nt23E5LLzY6Kd-AufCbjuQ-ccNC_zvdBFOn7At5-r7CVAVyhjlEgyPZ5P-hhGnG8ywxIANgUJhOPeexYL2o29IQiBBJxsCV0EsdN14UttN0etPvmRh5MRIFUE-zfRkRNQB20hMT8n4FKFlfgKkMS2gXep91h9VVyfYPHAt9jGJgUbIcbx_igeLK3nQlaUXaePf2bAuVRM1kW3P2UR0FOoUKDI5FZmi9XBoEtt0taQYySdKbPSXKaJWO2vKQ4SPyVXzzz-obfVe2zIe1msQ3Tco5RFoHfnufbvvnLC_WUAC9LSfp4jrPvr5lY3uoCFmPma56R-E3mVd2q87Ybk6mqvSh4yWHjid7sfzQ8Ovh9OhZlq_7Mfa3q3M92vNL98iHs8xYkJbE0DJs691UdgX45iNi4DVD-hJ7EbKQQgePsYNovWA611kM-cartevQWk7TBBggy9VYqmdWN0QuVQX9bsHFeYjjKSXg24bV5vYQW3EPkqZk\",\n p: \"9DeEDfMVdV605MbHCtHnw5xEbzTHd7vK-qAQNIjz5i4EmFC0tK7dvUiSn0WeyMNYJkuxVxTMHoDbWXzXq45tzbTEYuzEo5wsxyoVvldfFnnJIwMu6Hb7PWjyWfpBcbwLISr8fAJaGPzgcFsJE__KxrvLA66m1q_4k1y1L9CvXWfHDvFqb7VLGzKWXXp2wlbsACZuqx2Ff3THcWoOWb-wSww6AGsYAc3zC_DiYvAaTn9MxszZ0UYuMeJIHjLA1dmjL-Nksvq5GukjFxSSTpUS87zJ08fHoB0FzTKIIjJGpMRf6ebReLqbYCdo2Kr7eC7lbcTfwQTPI6gnHSKgPIYF5Q\",\n q: \"3xtArH_4MQjwRpl7JVivzQUZgDTARkynMpX-4Gvyny6Gxx0QLhHH0lQMRhtFWlI6qLZxCCLC9zhXPmGlqW-QWya8-xE80mX45JTrQlwBHISpTWTV3sI2Lp5dg7CW8Sc40CE4kB4Q2rHhf7V-Aimgmqhnl1uguzH2DXfr3RaCor0ge44k6gi1LXEJN_aFQIIFYL8HQOM0ctdY147Kr2rVHLchRnh8Q4GzBAJvpOcfvEDk9HF09NVxeaivLMXChpuSUHqbEGg_lVkotLnCMb-fUWk8QmO8EFFVU0pyOFDqHKIgrHOLSHjgUvV8moBwnMGQxMgu7rpY3g-9cXfsCoKVNw\",\n dp:\n \"bL1vajqrelhSGW-83r95_-pLumx4yIJwrcmpjYrRdtNUrnF5FN6r0wVGa-629dOtI1gevZSAErDzelQRP80qbSapLxcXs3XtpjzB87-5kitl-NYJA-8-jSh2iMPacgb1ua4HQDxX27p1QPH4B9SkeHrTuW8B0KQH_a2Q65pzCxcTVj7-UoEZ0SFkPHkz-fJ0INj7--soLwlTaNd9Tk8A81mdVeRZiywlpVJ7quwX-o3KJNa_weQK26FS1Udp_45pkAAjLWJgG3BldHhvcNgF2UtdXpQc-dkSZTyzyu4x8FmUD3T8HlKQrm69y4POdsQC2i6IJsy6YrkTuXBagrh2VQ\",\n dq:\n \"j0CQZjJEyjdTEAG8cF5hguKjXQ6B5qGROYnV_YNSZaMaJv8iRHJmO0Z8GwenoDbsMyfxq6emR9aFLijEleZsahqVfR-0TePry9lStWkdzZHgozD7oexRnd1Rbh0UzgLBF-I8z0x-xe0xPS7rmbfgx20aFrVentOViVBWwb6SYqvND4hVa2_r5SGPKb_AD4tsqJH_tkosgxCCmuW0fq256JYtZ3I1V6MPrqNhzCAa4GVKnSm8Tvg9xD_rOnRAUu3RJJuUtRQ6v0pgOKqNZiQDx-IqLvaa6l9OygwjCsXpjDkNga0u4Xm7j4jQWOPfasdejPt8Jwy_wtWYbiLyDE2MQQ\",\n qi:\n \"Th3TS6fHquqNljwZU2Vg7ndI0SmJidIwSTS2LlhM-Y2bxaAUF-orpS504xDVk1xjRYBrdxiTOmohbtoKtiWhLveOUAWVoNilMqgEU7lwnhaE3yfiUoE1x8df_wLP_YiAccFKeMZwsQp29aKLxuYQtO2dRSSQkN0IuxMGchnJtGOGNTbyA44O25IwggV1nlJN7OTX-nsJCSCe1XMojnGezhnD4xXGeSuR3S07oDDiWpvAO7qtRphEavVTtXdJWIr27tBvnUytbpb4uq6A3J4-TZ6X9uzlOw6jBSQhbL7fc83Z9E_wjPTnxfHufiC_AtXow6sK7lCy10aJGHp3jnGVdQ\",\n // cSpell: enable\n key_ops: [\"sign\"],\n ext: true,\n }, \"private\"),\n },\n {\n privateKey: await importJwk({\n kty: \"OKP\",\n crv: \"Ed25519\",\n // cSpell: disable-next-line\n x: \"CwcwyY7tu4wVzVW3KKX7AnBO8HakA2pg0rhAiMbGtfk\",\n key_ops: [\"sign\"],\n ext: true,\n // cSpell: disable-next-line\n d: \"K64nFsAPt892l7rr10uDsBXCW151CUM29SugU6l4ZzE\",\n }, \"private\"),\n publicKey: await importJwk({\n kty: \"OKP\",\n crv: \"Ed25519\",\n // cSpell: disable-next-line\n x: \"CwcwyY7tu4wVzVW3KKX7AnBO8HakA2pg0rhAiMbGtfk\",\n key_ops: [\"verify\"],\n ext: true,\n }, \"public\"),\n },\n];\n\nfor (const name in factories) {\n const factory = factories[name];\n\n describe(name, () => {\n const repo = factory();\n\n test(\"key pairs\", async () => {\n assert.deepStrictEqual(await repo.getKeyPairs(\"bot\"), undefined);\n await repo.setKeyPairs(\"bot\", keyPairs);\n assert.deepStrictEqual(await repo.getKeyPairs(\"bot\"), keyPairs);\n });\n\n test(\"messages\", async () => {\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 0);\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942976-3400-7f34-872e-2cbf0f9eeac4\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Array.fromAsync(repo.getMessages(\"bot\")),\n [],\n );\n\n const messageA = new Create({\n id: new URL(\n \"https://example.com/ap/create/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n });\n const messageB = new Create({\n id: new URL(\n \"https://example.com/ap/create/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messageC = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messageD = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n });\n const messageC2 = new Create({\n id: new URL(\n \"https://example.com/ap/create/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ),\n attribution: new URL(\"https://example.com/ap/actor/bot\"),\n to: new URL(\"https://example.com/ap/actor/bot/followers\"),\n cc: PUBLIC_COLLECTION,\n content: \"Hi, world!\",\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n updated: Temporal.Instant.from(\"2025-01-03T12:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n updated: Temporal.Instant.from(\"2025-01-03T12:00:00Z\"),\n });\n\n await repo.addMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n messageA,\n );\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 1);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942976-3400-7f34-872e-2cbf0f9eeac4\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\"))).map((m) =>\n m.toJsonLd()\n ),\n ),\n [await messageA.toJsonLd()],\n );\n\n await repo.addMessage(\n \"bot\",\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n messageB,\n );\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 2);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n ))\n ?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942976-3400-7f34-872e-2cbf0f9eeac4\"),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\"))).map((m) =>\n m.toJsonLd()\n ),\n ),\n [await messageB.toJsonLd(), await messageA.toJsonLd()],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\", { order: \"oldest\" })))\n .map((\n m,\n ) => m.toJsonLd()),\n ),\n [await messageA.toJsonLd(), await messageB.toJsonLd()],\n );\n\n await repo.addMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n messageC,\n );\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n ))\n ?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ))\n ?.toJsonLd(),\n await messageC.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"01942e9c-9000-7480-a553-7a6ce737ce14\"),\n undefined,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\", { order: \"newest\" })))\n .map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n await messageA.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\", { order: \"oldest\" })))\n .map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageA.toJsonLd(),\n await messageB.toJsonLd(),\n await messageC.toJsonLd(),\n ],\n );\n\n await repo.addMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n messageD,\n );\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 4);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n ))\n ?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ))\n ?.toJsonLd(),\n await messageC.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n ))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\"))).map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageD.toJsonLd(),\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n await messageA.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(\n repo.getMessages(\"bot\", {\n order: \"oldest\",\n until: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n }),\n )).map((m) => m.toJsonLd()),\n ),\n [\n await messageA.toJsonLd(),\n await messageB.toJsonLd(),\n await messageC.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(\n repo.getMessages(\"bot\", {\n since: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n )).map((m) => m.toJsonLd()),\n ),\n [\n await messageD.toJsonLd(),\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(\n repo.getMessages(\"bot\", {\n until: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n since: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n }),\n )).map((m) => m.toJsonLd()),\n ),\n [\n await messageC.toJsonLd(),\n await messageB.toJsonLd(),\n ],\n );\n\n const removed = await repo.removeMessage(\n \"bot\",\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n );\n assert.deepStrictEqual(\n await removed?.toJsonLd(),\n await messageB.toJsonLd(),\n );\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ))\n ?.toJsonLd(),\n await messageC.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n ))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\", { order: \"newest\" })))\n .map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageD.toJsonLd(),\n await messageC.toJsonLd(),\n await messageA.toJsonLd(),\n ],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getMessages(\"bot\", { order: \"oldest\" })))\n .map((\n m,\n ) => m.toJsonLd()),\n ),\n [\n await messageA.toJsonLd(),\n await messageC.toJsonLd(),\n await messageD.toJsonLd(),\n ],\n );\n\n await repo.updateMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n async (messageC) =>\n messageC.clone({\n object: await messageC2.getObject(),\n updated: messageC2.updated,\n }),\n );\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ))\n ?.toJsonLd(),\n await messageC2.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n ))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n\n let updaterCalled = false;\n const updated = await repo.updateMessage(\n \"bot\",\n \"00000000-0000-0000-0000-000000000000\",\n (message) => {\n updaterCalled = true;\n return message;\n },\n );\n assert.deepStrictEqual(updated, false);\n assert.deepStrictEqual(updaterCalled, false);\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ))\n ?.toJsonLd(),\n await messageC2.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n ))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n\n const updated2 = await repo.updateMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n (_) => undefined,\n );\n assert.deepStrictEqual(updated2, false);\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 3);\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ))\n ?.toJsonLd(),\n await messageA.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"bot\", \"0194244f-d800-7873-8993-ef71ccd47306\"),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ))\n ?.toJsonLd(),\n await messageC2.toJsonLd(),\n );\n assert.deepStrictEqual(\n await (await repo.getMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n ))\n ?.toJsonLd(),\n await messageD.toJsonLd(),\n );\n });\n\n test(\"followers\", async () => {\n const followerA = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const followFromA = new URL(\n \"https://example.com/ap/follow/be2da56a-0ea3-4a6a-9dff-2a1837be67e0\",\n );\n const followerB = new Person({\n id: new URL(\"https://example.com/ap/actor/jane\"),\n preferredUsername: \"jane\",\n });\n const followFromB = new URL(\n \"https://example.com/ap/follow/8b76286d-5eef-4f02-8a16-080ff2b0e2ca\",\n );\n\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 0);\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", followerA.id!),\n false,\n );\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", followerB.id!),\n false,\n );\n assert.deepStrictEqual(\n await Array.fromAsync(repo.getFollowers(\"bot\")),\n [],\n );\n\n await repo.addFollower(\"bot\", followFromA, followerA);\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 1);\n assert.ok(await repo.hasFollower(\"bot\", followerA.id!));\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", followerB.id!),\n false,\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers(\"bot\"))).map((f) =>\n f.toJsonLd()\n ),\n ),\n [await followerA.toJsonLd()],\n );\n\n await repo.addFollower(\"bot\", followFromB, followerB);\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 2);\n assert.ok(await repo.hasFollower(\"bot\", followerA.id!));\n assert.ok(await repo.hasFollower(\"bot\", followerB.id!));\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers(\"bot\"))).map((f) =>\n f.toJsonLd()\n ),\n ),\n [await followerA.toJsonLd(), await followerB.toJsonLd()],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers(\"bot\", { offset: 1 }))).map((\n f,\n ) => f.toJsonLd()),\n ),\n [await followerB.toJsonLd()],\n );\n assert.deepStrictEqual(\n await Promise.all(\n (await Array.fromAsync(repo.getFollowers(\"bot\", { limit: 1 }))).map((\n f,\n ) => f.toJsonLd()),\n ),\n [await followerA.toJsonLd()],\n );\n\n assert.deepStrictEqual(\n await repo.removeFollower(\"bot\", followFromA, followerB.id!),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.removeFollower(\"bot\", followFromB, followerA.id!),\n undefined,\n );\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 2);\n assert.ok(await repo.hasFollower(\"bot\", followerA.id!));\n assert.ok(await repo.hasFollower(\"bot\", followerB.id!));\n\n await repo.removeFollower(\"bot\", followFromA, followerA.id!);\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 1);\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", followerA.id!),\n false,\n );\n assert.ok(await repo.hasFollower(\"bot\", followerB.id!));\n\n await repo.removeFollower(\"bot\", followFromB, followerB.id!);\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 0);\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", followerA.id!),\n false,\n );\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", followerB.id!),\n false,\n );\n });\n\n test(\"sent follows\", async () => {\n const follow = new Follow({\n id: new URL(\n \"https://example.com/ap/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/john\"),\n });\n\n assert.deepStrictEqual(\n await repo.getSentFollow(\"bot\", \"03a395a2-353a-4894-afdb-2cab31a7b004\"),\n undefined,\n );\n\n await repo.addSentFollow(\n \"bot\",\n \"03a395a2-353a-4894-afdb-2cab31a7b004\",\n follow,\n );\n assert.deepStrictEqual(\n await (await repo.getSentFollow(\n \"bot\",\n \"03a395a2-353a-4894-afdb-2cab31a7b004\",\n ))\n ?.toJsonLd(),\n await follow.toJsonLd(),\n );\n\n await repo.removeSentFollow(\n \"bot\",\n \"03a395a2-353a-4894-afdb-2cab31a7b004\",\n );\n assert.deepStrictEqual(\n await repo.getSentFollow(\"bot\", \"03a395a2-353a-4894-afdb-2cab31a7b004\"),\n undefined,\n );\n });\n\n test(\"followees\", async () => {\n const followeeId = new URL(\"https://example.com/ap/actor/john\");\n const follow = new Follow({\n id: new URL(\n \"https://example.com/ap/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followeeId,\n });\n\n assert.deepStrictEqual(\n await repo.getFollowee(\"bot\", followeeId),\n undefined,\n );\n\n await repo.addFollowee(\"bot\", followeeId, follow);\n assert.deepStrictEqual(\n await (await repo.getFollowee(\"bot\", followeeId))?.toJsonLd(),\n await follow.toJsonLd(),\n );\n\n await repo.removeFollowee(\"bot\", followeeId);\n assert.deepStrictEqual(\n await repo.getFollowee(\"bot\", followeeId),\n undefined,\n );\n });\n\n test(\"poll voting\", async () => {\n const messageId1 = \"01945678-1234-7890-abcd-ef0123456789\";\n const messageId2 = \"01945678-5678-7890-abcd-ef0123456789\";\n const voter1 = new URL(\"https://example.com/ap/actor/alice\");\n const voter2 = new URL(\"https://example.com/ap/actor/bob\");\n const voter3 = new URL(\"https://example.com/ap/actor/charlie\");\n\n // Initially, no votes exist\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 0);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {});\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId2), 0);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId2), {});\n\n // Single voter, single option\n await repo.vote(\"bot\", messageId1, voter1, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 1);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 1,\n });\n\n // Same voter votes for same option again (should be ignored)\n await repo.vote(\"bot\", messageId1, voter1, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 1);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 1,\n });\n\n // Same voter votes for different option (multiple choice)\n await repo.vote(\"bot\", messageId1, voter1, \"option2\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 1);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 1,\n \"option2\": 1,\n });\n\n // Different voter votes for same option\n await repo.vote(\"bot\", messageId1, voter2, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 2);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n });\n\n // Third voter votes for new option\n await repo.vote(\"bot\", messageId1, voter3, \"option3\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 3);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n \"option3\": 1,\n });\n\n // Votes for different message should be separate\n await repo.vote(\"bot\", messageId2, voter1, \"optionA\");\n await repo.vote(\"bot\", messageId2, voter2, \"optionB\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId2), 2);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId2), {\n \"optionA\": 1,\n \"optionB\": 1,\n });\n\n // Original message votes should remain unchanged\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 3);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n \"option3\": 1,\n });\n\n // Test with empty options (edge case)\n await repo.vote(\"bot\", messageId1, voter1, \"\");\n assert.deepStrictEqual(await repo.countVoters(\"bot\", messageId1), 3);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", messageId1), {\n \"option1\": 2,\n \"option2\": 1,\n \"option3\": 1,\n \"\": 1,\n });\n });\n });\n}\n\nfunction createNote(uuid: Uuid, actor: string): Create {\n return new Create({\n id: new URL(`https://example.com/ap/actor/${actor}/create/${uuid}`),\n actor: new URL(`https://example.com/ap/actor/${actor}`),\n to: new URL(`https://example.com/ap/actor/${actor}/followers`),\n cc: PUBLIC_COLLECTION,\n object: new Note({\n id: new URL(`https://example.com/ap/actor/${actor}/note/${uuid}`),\n attribution: new URL(`https://example.com/ap/actor/${actor}`),\n to: new URL(`https://example.com/ap/actor/${actor}/followers`),\n cc: PUBLIC_COLLECTION,\n content: \"Hello, world!\",\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n }),\n published: Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n });\n}\n\nfor (const name in factories) {\n const factory = factories[name];\n\n describe(`${name}: bot isolation`, () => {\n test(\"key pairs are isolated by bot identifier\", async () => {\n const repo = factory();\n await repo.setKeyPairs(\"botA\", keyPairs);\n assert.deepStrictEqual(await repo.getKeyPairs(\"botB\"), undefined);\n assert.deepStrictEqual(await repo.getKeyPairs(\"botA\"), keyPairs);\n });\n\n test(\"messages are isolated by bot identifier\", async () => {\n const repo = factory();\n const messageId: Uuid = \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\";\n const message = createNote(messageId, \"botA\");\n await repo.addMessage(\"botA\", messageId, message);\n assert.deepStrictEqual(\n await repo.getMessage(\"botB\", messageId),\n undefined,\n );\n assert.deepStrictEqual(await repo.countMessages(\"botB\"), 0);\n assert.deepStrictEqual(\n await Array.fromAsync(repo.getMessages(\"botB\")),\n [],\n );\n assert.deepStrictEqual(await repo.countMessages(\"botA\"), 1);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"botA\", messageId))?.toJsonLd(),\n await message.toJsonLd(),\n );\n\n // Removing through the wrong bot identifier must not delete the message:\n assert.deepStrictEqual(\n await repo.removeMessage(\"botB\", messageId),\n undefined,\n );\n assert.deepStrictEqual(await repo.countMessages(\"botA\"), 1);\n\n // Updating through the wrong bot identifier must not touch the message:\n let updaterCalled = false;\n const updated = await repo.updateMessage(\"botB\", messageId, (message) => {\n updaterCalled = true;\n return message;\n });\n assert.deepStrictEqual(updated, false);\n assert.deepStrictEqual(updaterCalled, false);\n });\n\n test(\"followers are isolated by bot identifier\", async () => {\n const repo = factory();\n const follower = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const followId = new URL(\n \"https://example.com/ap/follow/be2da56a-0ea3-4a6a-9dff-2a1837be67e0\",\n );\n await repo.addFollower(\"botA\", followId, follower);\n assert.deepStrictEqual(\n await repo.hasFollower(\"botB\", follower.id!),\n false,\n );\n assert.deepStrictEqual(await repo.countFollowers(\"botB\"), 0);\n assert.deepStrictEqual(\n await Array.fromAsync(repo.getFollowers(\"botB\")),\n [],\n );\n assert.ok(await repo.hasFollower(\"botA\", follower.id!));\n\n // Removing through the wrong bot identifier must not delete the follower:\n assert.deepStrictEqual(\n await repo.removeFollower(\"botB\", followId, follower.id!),\n undefined,\n );\n assert.ok(await repo.hasFollower(\"botA\", follower.id!));\n });\n\n test(\"sent follows are isolated by bot identifier\", async () => {\n const repo = factory();\n const followUuid: Uuid = \"03a395a2-353a-4894-afdb-2cab31a7b004\";\n const follow = new Follow({\n id: new URL(`https://example.com/ap/actor/botA/follow/${followUuid}`),\n actor: new URL(\"https://example.com/ap/actor/botA\"),\n object: new URL(\"https://example.com/ap/actor/john\"),\n });\n await repo.addSentFollow(\"botA\", followUuid, follow);\n assert.deepStrictEqual(\n await repo.getSentFollow(\"botB\", followUuid),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.removeSentFollow(\"botB\", followUuid),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getSentFollow(\"botA\", followUuid))?.toJsonLd(),\n await follow.toJsonLd(),\n );\n });\n\n test(\"followees are isolated by bot identifier\", async () => {\n const repo = factory();\n const followeeId = new URL(\"https://example.com/ap/actor/john\");\n const follow = new Follow({\n id: new URL(\n \"https://example.com/ap/actor/botA/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/botA\"),\n object: followeeId,\n });\n await repo.addFollowee(\"botA\", followeeId, follow);\n assert.deepStrictEqual(\n await repo.getFollowee(\"botB\", followeeId),\n undefined,\n );\n assert.deepStrictEqual(\n await repo.removeFollowee(\"botB\", followeeId),\n undefined,\n );\n assert.deepStrictEqual(\n await (await repo.getFollowee(\"botA\", followeeId))?.toJsonLd(),\n await follow.toJsonLd(),\n );\n });\n\n test(\"poll votes are isolated by bot identifier\", async () => {\n const repo = factory();\n const messageId: Uuid = \"01945678-1234-7890-abcd-ef0123456789\";\n const voter = new URL(\"https://example.com/ap/actor/alice\");\n await repo.vote(\"botA\", messageId, voter, \"option1\");\n assert.deepStrictEqual(await repo.countVoters(\"botB\", messageId), 0);\n assert.deepStrictEqual(await repo.countVotes(\"botB\", messageId), {});\n assert.deepStrictEqual(await repo.countVoters(\"botA\", messageId), 1);\n assert.deepStrictEqual(await repo.countVotes(\"botA\", messageId), {\n option1: 1,\n });\n });\n });\n\n describe(`${name}: findFollowedBots()`, () => {\n test(\"yields the identifiers of bots following the given actor\", async () => {\n const repo = factory();\n const followeeId = new URL(\"https://example.com/ap/actor/john\");\n const otherFolloweeId = new URL(\"https://example.com/ap/actor/jane\");\n const followA = new Follow({\n id: new URL(\n \"https://example.com/ap/actor/botA/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/botA\"),\n object: followeeId,\n });\n const followB = new Follow({\n id: new URL(\n \"https://example.com/ap/actor/botB/follow/e35ff5d8-ede9-4f5e-9b83-4bfcd4c9a69c\",\n ),\n actor: new URL(\"https://example.com/ap/actor/botB\"),\n object: followeeId,\n });\n\n assert.deepStrictEqual(\n await Array.fromAsync(repo.findFollowedBots(followeeId)),\n [],\n );\n\n await repo.addFollowee(\"botA\", followeeId, followA);\n await repo.addFollowee(\"botB\", followeeId, followB);\n const bots = await Array.fromAsync(repo.findFollowedBots(followeeId));\n bots.sort();\n assert.deepStrictEqual(bots, [\"botA\", \"botB\"]);\n assert.deepStrictEqual(\n await Array.fromAsync(repo.findFollowedBots(otherFolloweeId)),\n [],\n );\n\n // Adding the same followee twice must not duplicate the identifier:\n await repo.addFollowee(\"botA\", followeeId, followA);\n const bots2 = await Array.fromAsync(repo.findFollowedBots(followeeId));\n bots2.sort();\n assert.deepStrictEqual(bots2, [\"botA\", \"botB\"]);\n\n await repo.removeFollowee(\"botA\", followeeId);\n assert.deepStrictEqual(\n await Array.fromAsync(repo.findFollowedBots(followeeId)),\n [\"botB\"],\n );\n\n await repo.removeFollowee(\"botB\", followeeId);\n assert.deepStrictEqual(\n await Array.fromAsync(repo.findFollowedBots(followeeId)),\n [],\n );\n });\n });\n\n describe(`${name}: forIdentifier()`, () => {\n test(\"returns a repository view scoped to the given identifier\", async () => {\n const repo = factory();\n const scoped = repo.forIdentifier(\"botA\");\n assert.deepStrictEqual(scoped.identifier, \"botA\");\n\n // Writes through the scoped view are visible through the root:\n const messageId: Uuid = \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\";\n const message = createNote(messageId, \"botA\");\n await scoped.addMessage(messageId, message);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"botA\", messageId))?.toJsonLd(),\n await message.toJsonLd(),\n );\n assert.deepStrictEqual(\n await repo.getMessage(\"botB\", messageId),\n undefined,\n );\n assert.deepStrictEqual(await scoped.countMessages(), 1);\n\n // Writes through the root are visible through the scoped view:\n const follower = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const followId = new URL(\n \"https://example.com/ap/follow/be2da56a-0ea3-4a6a-9dff-2a1837be67e0\",\n );\n await repo.addFollower(\"botA\", followId, follower);\n assert.ok(await scoped.hasFollower(follower.id!));\n assert.deepStrictEqual(await scoped.countFollowers(), 1);\n\n // Key pairs round-trip through the scoped view:\n await scoped.setKeyPairs(keyPairs);\n assert.deepStrictEqual(await scoped.getKeyPairs(), keyPairs);\n assert.deepStrictEqual(await repo.getKeyPairs(\"botA\"), keyPairs);\n assert.deepStrictEqual(await repo.getKeyPairs(\"botB\"), undefined);\n });\n });\n}\n\ndescribe(\"KvRepository.migrate()\", () => {\n async function seedLegacyData(kv: MemoryKvStore): Promise<{\n messageId: Uuid;\n messageJson: unknown;\n followerId: URL;\n followRequestId: URL;\n followeeId: URL;\n followeeFollowJson: unknown;\n sentFollowId: Uuid;\n sentFollowJson: unknown;\n }> {\n // Simulates the key layout of BotKit 0.4 and earlier, which was not\n // scoped by bot identifiers.\n const messageId: Uuid = \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\";\n const message = createNote(messageId, \"bot\");\n const messageJson = await message.toJsonLd({ format: \"compact\" });\n await kv.set([\"_botkit\", \"messages\"], [messageId]);\n await kv.set([\"_botkit\", \"messages\", messageId], messageJson);\n\n const keyPairsData = [];\n for (const pair of keyPairs) {\n keyPairsData.push({\n private: await exportJwk(pair.privateKey),\n public: await exportJwk(pair.publicKey),\n });\n }\n await kv.set([\"_botkit\", \"keyPairs\"], keyPairsData);\n\n const follower = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const followRequestId = new URL(\n \"https://example.com/ap/follow/be2da56a-0ea3-4a6a-9dff-2a1837be67e0\",\n );\n await kv.set([\"_botkit\", \"followers\"], [follower.id!.href]);\n await kv.set(\n [\"_botkit\", \"followers\", follower.id!.href],\n await follower.toJsonLd({ format: \"compact\" }),\n );\n await kv.set(\n [\"_botkit\", \"followRequests\", followRequestId.href],\n follower.id!.href,\n );\n\n const followeeId = new URL(\"https://example.com/ap/actor/jane\");\n const followeeFollow = new Follow({\n id: new URL(\n \"https://example.com/ap/follow/03a395a2-353a-4894-afdb-2cab31a7b004\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followeeId,\n });\n const followeeFollowJson = await followeeFollow.toJsonLd({\n format: \"compact\",\n });\n await kv.set([\"_botkit\", \"followees\", followeeId.href], followeeFollowJson);\n\n const sentFollowId: Uuid = \"e35ff5d8-ede9-4f5e-9b83-4bfcd4c9a69c\";\n const sentFollow = new Follow({\n id: new URL(`https://example.com/ap/follow/${sentFollowId}`),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/joe\"),\n });\n const sentFollowJson = await sentFollow.toJsonLd({ format: \"compact\" });\n await kv.set([\"_botkit\", \"follows\", sentFollowId], sentFollowJson);\n\n // Poll votes for the message:\n await kv.set([\"_botkit\", \"polls\", messageId], [\"option1\", \"option2\"]);\n await kv.set([\"_botkit\", \"polls\", messageId, \"option1\"], [\n \"https://example.com/ap/actor/alice\",\n \"https://example.com/ap/actor/bob\",\n ]);\n await kv.set([\"_botkit\", \"polls\", messageId, \"option2\"], [\n \"https://example.com/ap/actor/alice\",\n ]);\n\n return {\n messageId,\n messageJson,\n followerId: follower.id!,\n followRequestId,\n followeeId,\n followeeFollowJson,\n sentFollowId,\n sentFollowJson,\n };\n }\n\n test(\"adopts legacy unscoped data\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n\n await repo.migrate(\"bot\");\n\n assert.deepStrictEqual(await repo.getKeyPairs(\"bot\"), keyPairs);\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 1);\n assert.deepStrictEqual(\n await (await repo.getMessage(\"bot\", seed.messageId))?.toJsonLd({\n format: \"compact\",\n }),\n seed.messageJson,\n );\n assert.deepStrictEqual(\n (await Array.fromAsync(repo.getMessages(\"bot\"))).length,\n 1,\n );\n assert.ok(await repo.hasFollower(\"bot\", seed.followerId));\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 1);\n assert.deepStrictEqual(await repo.countVoters(\"bot\", seed.messageId), 2);\n assert.deepStrictEqual(await repo.countVotes(\"bot\", seed.messageId), {\n option1: 2,\n option2: 1,\n });\n\n // Data must belong to the migrated identifier only:\n assert.deepStrictEqual(await repo.getKeyPairs(\"other\"), undefined);\n assert.deepStrictEqual(await repo.countMessages(\"other\"), 0);\n\n // Legacy keys are kept (copy, not move), so a partially failed run can\n // be retried without data loss:\n assert.ok(await kv.get([\"_botkit\", \"messages\", seed.messageId]) != null);\n });\n\n test(\"is idempotent\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n\n await repo.migrate(\"bot\");\n await repo.migrate(\"bot\");\n\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 1);\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 1);\n\n // A migrated message that is removed afterwards must not reappear:\n await repo.removeMessage(\"bot\", seed.messageId);\n await repo.migrate(\"bot\");\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 0);\n });\n\n test(\"does nothing without legacy data\", async () => {\n const kv = new MemoryKvStore();\n const repo = new KvRepository(kv);\n await repo.migrate(\"bot\");\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 0);\n assert.deepStrictEqual(await repo.getKeyPairs(\"bot\"), undefined);\n });\n\n test(\"does not clobber scoped data written before migration\", async () => {\n const kv = new MemoryKvStore();\n await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n await repo.setKeyPairs(\"bot\", keyPairs.slice(0, 1));\n await repo.migrate(\"bot\");\n assert.deepStrictEqual(await repo.getKeyPairs(\"bot\"), [keyPairs[0]]);\n });\n\n test(\"migrates sent follows eagerly\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n await repo.migrate(\"bot\");\n\n const follow = await repo.getSentFollow(\"bot\", seed.sentFollowId);\n assert.deepStrictEqual(\n await follow?.toJsonLd({ format: \"compact\" }),\n seed.sentFollowJson,\n );\n // Legacy keys are copied, not moved:\n assert.ok(\n await kv.get([\"_botkit\", \"follows\", seed.sentFollowId]) != null,\n );\n\n // The adoption applies only to the migrating identifier:\n const kv2 = new MemoryKvStore();\n const seed2 = await seedLegacyData(kv2);\n const repo2 = new KvRepository(kv2);\n await repo2.migrate(\"bot\");\n assert.deepStrictEqual(\n await repo2.getSentFollow(\"other\", seed2.sentFollowId),\n undefined,\n );\n });\n\n test(\"migrates followees eagerly with their reverse index\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n await repo.migrate(\"bot\");\n\n // The reverse index is populated by the migration itself, before any\n // followee is individually accessed, so timeline routing works right\n // after an upgrade:\n assert.deepStrictEqual(\n await Array.fromAsync(repo.findFollowedBots(seed.followeeId)),\n [\"bot\"],\n );\n const follow = await repo.getFollowee(\"bot\", seed.followeeId);\n assert.deepStrictEqual(\n await follow?.toJsonLd({ format: \"compact\" }),\n seed.followeeFollowJson,\n );\n });\n\n test(\"migrates follow requests eagerly\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n await repo.migrate(\"bot\");\n\n // removeFollower() consults the migrated follow request record:\n const removed = await repo.removeFollower(\n \"bot\",\n seed.followRequestId,\n seed.followerId,\n );\n assert.ok(removed != null);\n assert.deepStrictEqual(\n await repo.hasFollower(\"bot\", seed.followerId),\n false,\n );\n assert.deepStrictEqual(await repo.countFollowers(\"bot\"), 0);\n });\n\n test(\"migrates poll options named like lock keys\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n // Poll option names are user-controlled, so an option may collide with\n // the transient \"lock\" suffix used by the message/follower index lists:\n await kv.set([\"_botkit\", \"polls\", seed.messageId], [\"lock\", \"open\"]);\n await kv.set(\n [\"_botkit\", \"polls\", seed.messageId, \"lock\"],\n [\"https://example.com/ap/actor/voter1\"],\n );\n await kv.set(\n [\"_botkit\", \"polls\", seed.messageId, \"open\"],\n [\"https://example.com/ap/actor/voter2\"],\n );\n const repo = new KvRepository(kv);\n await repo.migrate(\"bot\");\n\n assert.deepStrictEqual(await repo.countVotes(\"bot\", seed.messageId), {\n lock: 1,\n open: 1,\n });\n });\n\n test(\"adopts legacy data for one identifier only\", async () => {\n const kv = new MemoryKvStore();\n await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n\n await repo.migrate(\"botA\");\n // A later migration for another identifier must not adopt the same\n // legacy rows again; that would break cross-identifier isolation:\n await repo.migrate(\"botB\");\n\n assert.deepStrictEqual(await repo.countMessages(\"botA\"), 1);\n assert.deepStrictEqual(await repo.countMessages(\"botB\"), 0);\n assert.deepStrictEqual(await repo.getKeyPairs(\"botB\"), undefined);\n assert.deepStrictEqual(await repo.countFollowers(\"botB\"), 0);\n });\n\n test(\"claims the legacy data atomically under concurrency\", async () => {\n // Slows reads down so that two concurrent migrations overlap on the\n // missing-marker check; the CAS-backed claim must still admit only one:\n class SlowKvStore implements KvStore {\n readonly #inner = new MemoryKvStore();\n async get<T = unknown>(key: KvKey): Promise<T | undefined> {\n await new Promise((resolve) => setTimeout(resolve, 10));\n return await this.#inner.get<T>(key);\n }\n set(key: KvKey, value: unknown): Promise<void> {\n return this.#inner.set(key, value);\n }\n delete(key: KvKey): Promise<void> {\n return this.#inner.delete(key);\n }\n cas(\n key: KvKey,\n expectedValue: unknown,\n newValue: unknown,\n ): Promise<boolean> {\n return this.#inner.cas!(key, expectedValue, newValue);\n }\n list(prefix?: KvKey): AsyncIterable<KvStoreListEntry> {\n return this.#inner.list(prefix);\n }\n }\n const kv = new SlowKvStore();\n // Seed legacy data through the inner store's interface:\n const messageId: Uuid = \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\";\n const message = createNote(messageId, \"bot\");\n await kv.set([\"_botkit\", \"messages\"], [messageId]);\n await kv.set(\n [\"_botkit\", \"messages\", messageId],\n await message.toJsonLd({ format: \"compact\" }),\n );\n\n const repo = new KvRepository(kv);\n await Promise.all([repo.migrate(\"botA\"), repo.migrate(\"botB\")]);\n\n const counts = [\n await repo.countMessages(\"botA\"),\n await repo.countMessages(\"botB\"),\n ];\n counts.sort();\n // Exactly one identifier adopted the legacy data:\n assert.deepStrictEqual(counts, [0, 1]);\n });\n\n test(\"keeps the legacy data with the adopting identifier\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n\n await repo.migrate(\"botA\");\n await repo.migrate(\"botB\");\n\n assert.deepStrictEqual(\n await repo.getSentFollow(\"botB\", seed.sentFollowId),\n undefined,\n );\n assert.ok(await repo.getSentFollow(\"botA\", seed.sentFollowId) != null);\n });\n\n test(\"forwards migration through MemoryCachedRepository\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new MemoryCachedRepository(new KvRepository(kv));\n\n await repo.migrate?.(\"bot\");\n\n assert.deepStrictEqual(await repo.getKeyPairs(\"bot\"), keyPairs);\n assert.deepStrictEqual(await repo.countMessages(\"bot\"), 1);\n assert.ok(await repo.hasFollower(\"bot\", seed.followerId));\n // Records keyed by UUIDs are migrated as well:\n assert.deepStrictEqual(\n await (await repo.getSentFollow(\"bot\", seed.sentFollowId))?.toJsonLd({\n format: \"compact\",\n }),\n seed.sentFollowJson,\n );\n });\n\n test(\"does not expose legacy data before migrate() is called\", async () => {\n const kv = new MemoryKvStore();\n const seed = await seedLegacyData(kv);\n const repo = new KvRepository(kv);\n assert.deepStrictEqual(\n await repo.getSentFollow(\"bot\", seed.sentFollowId),\n undefined,\n );\n });\n});\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-impl.d.ts","names":[],"sources":["../src/session-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAsDiB,gDACP,sBAAsB;gBAChB,QAAQ,cAAc;;UAGrB,6CACL,oCAGV,+BAA+B,GAAG,eAClC,0BAA0B;UAGX,4DAEb,kCAAkC,eAClC,mCAAmC,UAAU,eAhBjD;AAA0C,cAmB7B,WAnB6B,CAAA,YAAA,CAAA,YAmBQ,OAnBR,CAmBgB,YAnBhB,CAAA,CAAA;EAAA,SACV,GAAA,EAmBhB,OAnBgB,CAmBR,YAnBQ,CAAA;EAAY,SACpB,OAAA,EAmBJ,OAnBI,CAmBI,YAnBJ,CAAA;EAAY,WAAE,CAAA,GAAA,EAqBnB,OArBmB,CAqBX,YArBW,CAAA,EAAA,OAAA,EAqBa,OArBb,CAqBqB,YArBrB,CAAA;EAAY,IAAlC,OAAA,CAAA,CAAA,EA0BH,GA1BG;EAAO,IADb,WAAA,CAAA,CAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAqB,QAAA,CAAA,CAAA,EAmCX,OAnCW,CAmCH,KAnCG,CAAA;EAId,MAAA,CAAA,KAAA,EAmCK,KAnCL,GAmCa,GAnCb,GAAA,MAAA,CAAA,EAmC4B,OAnCM,CAAA,IAAA,CAAA;EAAA,QAAA,CAAA,KAAA,
|
|
1
|
+
{"version":3,"file":"session-impl.d.ts","names":[],"sources":["../src/session-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAsDiB,gDACP,sBAAsB;gBAChB,QAAQ,cAAc;;UAGrB,6CACL,oCAGV,+BAA+B,GAAG,eAClC,0BAA0B;UAGX,4DAEb,kCAAkC,eAClC,mCAAmC,UAAU,eAhBjD;AAA0C,cAmB7B,WAnB6B,CAAA,YAAA,CAAA,YAmBQ,OAnBR,CAmBgB,YAnBhB,CAAA,CAAA;EAAA,SACV,GAAA,EAmBhB,OAnBgB,CAmBR,YAnBQ,CAAA;EAAY,SACpB,OAAA,EAmBJ,OAnBI,CAmBI,YAnBJ,CAAA;EAAY,WAAE,CAAA,GAAA,EAqBnB,OArBmB,CAqBX,YArBW,CAAA,EAAA,OAAA,EAqBa,OArBb,CAqBqB,YArBrB,CAAA;EAAY,IAAlC,OAAA,CAAA,CAAA,EA0BH,GA1BG;EAAO,IADb,WAAA,CAAA,CAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAqB,QAAA,CAAA,CAAA,EAmCX,OAnCW,CAmCH,KAnCG,CAAA;EAId,MAAA,CAAA,KAAA,EAmCK,KAnCL,GAmCa,GAnCb,GAAA,MAAA,CAAA,EAmC4B,OAnCM,CAAA,IAAA,CAAA;EAAA,QAAA,CAAA,KAAA,EAmF3B,KAnF2B,GAmFnB,GAnFmB,GAAA,MAAA,CAAA,EAmFJ,OAnFI,CAAA,IAAA,CAAA;EAAA,OACvC,CAAA,KAAA,EA+HW,KA/HX,GA+HmB,GA/HnB,GAAA,MAAA,CAAA,EA+HkC,OA/HlC,CAAA,OAAA,CAAA;EAAY,gBAGS,CAAA,CAAA,EA4JL,OA5JK,CAAA,IAAA,CAAA;EAAC,OAAE,CAAA,OAAA,EAgLvB,IAhLuB,CAAA,OAAA,EAgLT,YAhLS,CAAA,EAAA,OAAA,CAAA,EAiLtB,yBAjLsB,CAiLI,YAjLJ,CAAA,CAAA,EAkL/B,OAlL+B,CAkLvB,iBAlLuB,CAkLL,IAlLK,EAkLC,YAlLD,CAAA,CAAA;EAAY,OACpB,CAAA,UAkLF,YAlLE,CAAA,CAAA,OAAA,EAmLf,IAnLe,CAAA,OAAA,EAmLD,YAnLC,CAAA,EAAA,OAAA,EAoLf,kCApLe,CAoLoB,CApLpB,EAoLuB,YApLvB,CAAA,CAAA,EAqLvB,OArLuB,CAqLf,iBArLe,CAqLG,CArLH,EAqLM,YArLN,CAAA,CAAA;EAAY,OADtC,CAAA,OAAA,EAwLW,IAxLX,CAAA,OAAA,EAwLyB,YAxLzB,CAAA,EAAA,OAAA,EAyLW,qCAzLX,CAyLiD,YAzLjD,CAAA,CAAA,EA0LG,OA1LH,CA0LW,iBA1LX,CA0L6B,QA1L7B,EA0LuC,YA1LvC,CAAA,CAAA;EAA8B,SAC9B,CAAA,OAAA,CAAA,EA2WW,uBA3WX,CAAA,EA4WG,aA5WH,CA4WiB,iBA5WjB,CA4WmC,YA5WnC,EA4WiD,YA5WjD,CAAA,CAAA;AAAyB;AAG3B"}
|
package/dist/session-impl.js
CHANGED
|
@@ -45,7 +45,10 @@ var SessionImpl = class {
|
|
|
45
45
|
}
|
|
46
46
|
const id = v7();
|
|
47
47
|
const follow = new Follow({
|
|
48
|
-
id: this.context.getObjectUri(Follow, {
|
|
48
|
+
id: this.context.getObjectUri(Follow, {
|
|
49
|
+
identifier: this.bot.identifier,
|
|
50
|
+
id
|
|
51
|
+
}),
|
|
49
52
|
actor: this.context.getActorUri(this.bot.identifier),
|
|
50
53
|
object: actor.id,
|
|
51
54
|
to: actor.id
|
|
@@ -147,7 +150,10 @@ var SessionImpl = class {
|
|
|
147
150
|
endTime = options.poll.endTime;
|
|
148
151
|
}
|
|
149
152
|
const msg = new cls({
|
|
150
|
-
id: this.context.getObjectUri(cls, {
|
|
153
|
+
id: this.context.getObjectUri(cls, {
|
|
154
|
+
identifier: this.bot.identifier,
|
|
155
|
+
id
|
|
156
|
+
}),
|
|
151
157
|
contents: options.language == null ? [contentHtml] : [new LanguageString(contentHtml, options.language), contentHtml],
|
|
152
158
|
replyTarget: options.replyTarget?.id,
|
|
153
159
|
quoteUrl: options.quoteTarget?.id,
|
|
@@ -161,10 +167,13 @@ var SessionImpl = class {
|
|
|
161
167
|
tos: visibility === "public" ? [PUBLIC_COLLECTION, ...mentionedActorIds] : visibility === "unlisted" || visibility === "followers" ? [this.context.getFollowersUri(this.bot.identifier), ...mentionedActorIds] : mentionedActorIds,
|
|
162
168
|
ccs: visibility === "public" ? [this.context.getFollowersUri(this.bot.identifier)] : visibility === "unlisted" ? [PUBLIC_COLLECTION] : [],
|
|
163
169
|
published: published.toTemporalInstant(),
|
|
164
|
-
url:
|
|
170
|
+
url: this.bot.instance.getMessageWebUrl(this.bot, id, this.context.origin)
|
|
165
171
|
});
|
|
166
172
|
const activity = new Create({
|
|
167
|
-
id: this.context.getObjectUri(Create, {
|
|
173
|
+
id: this.context.getObjectUri(Create, {
|
|
174
|
+
identifier: this.bot.identifier,
|
|
175
|
+
id
|
|
176
|
+
}),
|
|
168
177
|
actors: msg.attributionIds,
|
|
169
178
|
tos: msg.toIds,
|
|
170
179
|
ccs: msg.ccIds,
|
package/dist/session-impl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-impl.js","names":["bot: BotImpl<TContextData>","context: Context<TContextData>","actor: Actor | URL | string","actorId: URL","content: Text<\"block\", TContextData>","options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData>","mentionedActorIds: URL[]","inclusiveOptions: Note[]","exclusiveOptions: Note[]","voters: number | null","endTime: Temporal.Instant | null","cachedObjects: Record<string, Object>","promises: Promise<Object | null>[]","options: SessionGetOutboxOptions","object: Object | null"],"sources":["../src/session-impl.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025–2026 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport type { Context } from \"@fedify/fedify/federation\";\nimport { LanguageString } from \"@fedify/vocab-runtime\";\nimport {\n type Actor,\n Collection,\n Create,\n Follow,\n isActor,\n Link,\n Mention,\n Note,\n type Object,\n PUBLIC_COLLECTION,\n Undo,\n Update,\n} from \"@fedify/vocab\";\nimport { getLogger } from \"@logtape/logtape\";\nimport { encode } from \"html-entities\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport type { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage, isMessageObject } from \"./message-impl.ts\";\nimport {\n type AuthorizedMessage,\n type Message,\n type MessageClass,\n Question,\n} from \"./message.ts\";\nimport type { Uuid } from \"./repository.ts\";\nimport type {\n Session,\n SessionGetOutboxOptions,\n SessionPublishOptions,\n SessionPublishOptionsWithClass,\n SessionPublishOptionsWithQuestion,\n} from \"./session.ts\";\nimport type { Text } from \"./text.ts\";\n\nconst logger = getLogger([\"botkit\", \"session\"]);\n\nexport interface SessionImplPublishOptions<TContextData>\n extends SessionPublishOptions<TContextData> {\n replyTarget?: Message<MessageClass, TContextData>;\n}\n\nexport interface SessionImplPublishOptionsWithClass<\n T extends MessageClass,\n TContextData,\n> extends\n SessionPublishOptionsWithClass<T, TContextData>,\n SessionImplPublishOptions<TContextData> {\n}\n\nexport interface SessionImplPublishOptionsWithQuestion<TContextData>\n extends\n SessionPublishOptionsWithQuestion<TContextData>,\n SessionImplPublishOptionsWithClass<Question, TContextData> {\n}\n\nexport class SessionImpl<TContextData> implements Session<TContextData> {\n readonly bot: BotImpl<TContextData>;\n readonly context: Context<TContextData>;\n\n constructor(bot: BotImpl<TContextData>, context: Context<TContextData>) {\n this.bot = bot;\n this.context = context;\n }\n\n get actorId() {\n return this.context.getActorUri(this.bot.identifier);\n }\n\n get actorHandle() {\n return `@${this.bot.username}@${this.context.host}` as const;\n }\n\n async getActor(): Promise<Actor> {\n return (await this.bot.dispatchActor(this.context, this.bot.identifier))!;\n }\n\n async follow(actor: Actor | URL | string): Promise<void> {\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const followee = await this.bot.repository.getFollowee(actor.id);\n if (followee != null) {\n logger.warn(\n \"The bot is already following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n const id = uuidv7() as Uuid;\n const follow = new Follow({\n id: this.context.getObjectUri(Follow, { id }),\n actor: this.context.getActorUri(this.bot.identifier),\n object: actor.id,\n to: actor.id,\n });\n await this.bot.repository.addSentFollow(id, follow);\n await this.context.sendActivity(\n this.bot,\n actor,\n follow,\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n\n async unfollow(actor: Actor | URL | string): Promise<void> {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const follow = await this.bot.repository.getFollowee(actor.id);\n if (follow == null) {\n logger.warn(\n \"The bot is not following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n await this.bot.repository.removeFollowee(actor.id);\n if (follow.id != null && follow.objectId?.href === actor.id.href) {\n await this.context.sendActivity(\n this.bot,\n actor,\n new Undo({\n id: new URL(\"#undo\", follow.id),\n actor: this.context.getActorUri(this.bot.identifier),\n object: follow,\n to: actor.id,\n }),\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n }\n\n async follows(actor: Actor | URL | string): Promise<boolean> {\n let actorId: URL;\n if (isActor(actor)) {\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = actor.id;\n } else if (actor instanceof URL) {\n actorId = actor;\n } else {\n if (actor.startsWith(\"http://\") || actor.startsWith(\"https://\")) {\n actorId = new URL(actor);\n } else {\n if (actor === this.actorHandle) return false;\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, {\n documentLoader,\n });\n if (object == null || !isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n if (object.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = object.id;\n }\n }\n if (actorId.href === this.actorId.href) return false;\n const follow = await this.bot.repository.getFollowee(actorId);\n return follow != null;\n }\n\n async republishProfile(): Promise<void> {\n const actor = await this.getActor();\n const update = new Update({\n id: new URL(`#update-profile/${crypto.randomUUID()}`, this.actorId),\n actor: this.actorId,\n to: this.context.getFollowersUri(this.bot.identifier),\n object: actor,\n });\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n update,\n {\n preferSharedInbox: true,\n excludeBaseUris: [new URL(this.context.origin)],\n },\n );\n }\n\n async publish(\n content: Text<\"block\", TContextData>,\n options?: SessionImplPublishOptions<TContextData>,\n ): Promise<AuthorizedMessage<Note, TContextData>>;\n async publish<T extends MessageClass>(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithClass<T, TContextData>,\n ): Promise<AuthorizedMessage<T, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithQuestion<TContextData>,\n ): Promise<AuthorizedMessage<Question, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData> = {},\n ): Promise<AuthorizedMessage<MessageClass, TContextData>> {\n const published = new Date();\n const id = uuidv7({ msecs: +published }) as Uuid;\n const cls = \"class\" in options ? options.class : Note;\n const visibility = options.visibility ?? \"public\";\n let contentHtml = \"\";\n for await (const chunk of content.getHtml(this)) {\n contentHtml += chunk;\n }\n const tags = await Array.fromAsync(content.getTags(this));\n const mentionedActorIds: URL[] = [];\n for (const tag of tags) {\n if (tag instanceof Mention && tag.href != null) {\n mentionedActorIds.push(tag.href);\n }\n }\n if (options.quoteTarget != null) {\n let url = options.quoteTarget.raw.url ?? options.quoteTarget.id;\n if (url instanceof Link) url = url.href ?? options.quoteTarget.id;\n contentHtml += `\\n\\n<p class=\"quote-inline\"><br>RE: <a href=\"${\n encode(url.href)\n }\">${encode(url.href)}</a></p>`;\n tags.push(\n new Link({\n mediaType:\n 'application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"',\n rel: \"https://misskey-hub.net/ns#_misskey_quote\",\n href: options.quoteTarget.id,\n name: `RE: ${url.href}`,\n }),\n );\n }\n let inclusiveOptions: Note[] = [];\n let exclusiveOptions: Note[] = [];\n let voters: number | null = null;\n let endTime: Temporal.Instant | null = null;\n if (\"class\" in options && options.class === Question && \"poll\" in options) {\n if (options.poll.options.length < 2) {\n throw new TypeError(\"At least two options are required in a poll.\");\n } else if (\n new Set(options.poll.options).size != options.poll.options.length\n ) {\n throw new TypeError(\"Duplicate options are not allowed in a poll.\");\n } else if (options.poll.options.some((o) => o.trim() === \"\")) {\n throw new TypeError(\"Poll options cannot be empty.\");\n }\n const pollOptions = options.poll.options.map((option) =>\n new Note({\n name: option,\n replies: new Collection({ totalItems: 0 }),\n })\n );\n if (options.poll.multiple) inclusiveOptions = pollOptions;\n else exclusiveOptions = pollOptions;\n voters = 0;\n endTime = options.poll.endTime;\n }\n const msg = new cls({\n id: this.context.getObjectUri<MessageClass>(cls, { id }),\n contents: options.language == null\n ? [contentHtml]\n : [new LanguageString(contentHtml, options.language), contentHtml],\n replyTarget: options.replyTarget?.id,\n quoteUrl: options.quoteTarget?.id,\n tags,\n attribution: this.context.getActorUri(this.bot.identifier),\n attachments: options.attachments ?? [],\n inclusiveOptions,\n exclusiveOptions,\n voters,\n endTime,\n tos: visibility === \"public\"\n ? [PUBLIC_COLLECTION, ...mentionedActorIds]\n : visibility === \"unlisted\" || visibility === \"followers\"\n ? [\n this.context.getFollowersUri(this.bot.identifier),\n ...mentionedActorIds,\n ]\n : mentionedActorIds,\n ccs: visibility === \"public\"\n ? [this.context.getFollowersUri(this.bot.identifier)]\n : visibility === \"unlisted\"\n ? [PUBLIC_COLLECTION]\n : [],\n published: published.toTemporalInstant(),\n url: new URL(`/message/${id}`, this.context.origin),\n });\n const activity = new Create({\n id: this.context.getObjectUri(Create, { id }),\n actors: msg.attributionIds,\n tos: msg.toIds,\n ccs: msg.ccIds,\n object: msg,\n published: published.toTemporalInstant(),\n });\n await this.bot.repository.addMessage(id, activity);\n const preferSharedInbox = visibility === \"public\" ||\n visibility === \"unlisted\" || visibility === \"followers\";\n const excludeBaseUris = [new URL(this.context.origin)];\n if (preferSharedInbox) {\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n const cachedObjects: Record<string, Object> = {};\n for (const cachedObject of content.getCachedObjects()) {\n if (cachedObject.id == null) continue;\n cachedObjects[cachedObject.id.href] = cachedObject;\n }\n if (mentionedActorIds.length > 0) {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const promises: Promise<Object | null>[] = [];\n for (const mentionedActorId of mentionedActorIds) {\n const cachedObject = cachedObjects[mentionedActorId.href];\n const promise = cachedObject == null\n ? this.context.lookupObject(\n mentionedActorId,\n { documentLoader },\n )\n : Promise.resolve(cachedObject);\n promises.push(promise);\n }\n const objects = await Promise.all(promises);\n const mentionedActors = objects.filter(isActor);\n await this.context.sendActivity(\n this.bot,\n mentionedActors,\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n if (options.replyTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.replyTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n if (options.quoteTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.quoteTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n return await createMessage(\n msg,\n this,\n cachedObjects,\n options.replyTarget,\n options.quoteTarget,\n true,\n );\n }\n\n async *getOutbox(\n options: SessionGetOutboxOptions = {},\n ): AsyncIterable<AuthorizedMessage<MessageClass, TContextData>> {\n for await (const activity of this.bot.repository.getMessages(options)) {\n let object: Object | null;\n try {\n object = await activity.getObject(this.context);\n } catch {\n continue;\n }\n if (object == null || !isMessageObject(object)) continue;\n const message = await createMessage(\n object,\n this,\n {},\n undefined,\n undefined,\n true,\n );\n yield message;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-impl.js","names":["bot: BotImpl<TContextData>","context: Context<TContextData>","actor: Actor | URL | string","actorId: URL","content: Text<\"block\", TContextData>","options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData>","mentionedActorIds: URL[]","inclusiveOptions: Note[]","exclusiveOptions: Note[]","voters: number | null","endTime: Temporal.Instant | null","cachedObjects: Record<string, Object>","promises: Promise<Object | null>[]","options: SessionGetOutboxOptions","object: Object | null"],"sources":["../src/session-impl.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025–2026 Hong Minhee <https://hongminhee.org/>\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as\n// published by the Free Software Foundation, either version 3 of the\n// License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program. If not, see <https://www.gnu.org/licenses/>.\nimport type { Context } from \"@fedify/fedify/federation\";\nimport { LanguageString } from \"@fedify/vocab-runtime\";\nimport {\n type Actor,\n Collection,\n Create,\n Follow,\n isActor,\n Link,\n Mention,\n Note,\n type Object,\n PUBLIC_COLLECTION,\n Undo,\n Update,\n} from \"@fedify/vocab\";\nimport { getLogger } from \"@logtape/logtape\";\nimport { encode } from \"html-entities\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport type { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage, isMessageObject } from \"./message-impl.ts\";\nimport {\n type AuthorizedMessage,\n type Message,\n type MessageClass,\n Question,\n} from \"./message.ts\";\nimport type { Uuid } from \"./repository.ts\";\nimport type {\n Session,\n SessionGetOutboxOptions,\n SessionPublishOptions,\n SessionPublishOptionsWithClass,\n SessionPublishOptionsWithQuestion,\n} from \"./session.ts\";\nimport type { Text } from \"./text.ts\";\n\nconst logger = getLogger([\"botkit\", \"session\"]);\n\nexport interface SessionImplPublishOptions<TContextData>\n extends SessionPublishOptions<TContextData> {\n replyTarget?: Message<MessageClass, TContextData>;\n}\n\nexport interface SessionImplPublishOptionsWithClass<\n T extends MessageClass,\n TContextData,\n> extends\n SessionPublishOptionsWithClass<T, TContextData>,\n SessionImplPublishOptions<TContextData> {\n}\n\nexport interface SessionImplPublishOptionsWithQuestion<TContextData>\n extends\n SessionPublishOptionsWithQuestion<TContextData>,\n SessionImplPublishOptionsWithClass<Question, TContextData> {\n}\n\nexport class SessionImpl<TContextData> implements Session<TContextData> {\n readonly bot: BotImpl<TContextData>;\n readonly context: Context<TContextData>;\n\n constructor(bot: BotImpl<TContextData>, context: Context<TContextData>) {\n this.bot = bot;\n this.context = context;\n }\n\n get actorId() {\n return this.context.getActorUri(this.bot.identifier);\n }\n\n get actorHandle() {\n return `@${this.bot.username}@${this.context.host}` as const;\n }\n\n async getActor(): Promise<Actor> {\n return (await this.bot.dispatchActor(this.context, this.bot.identifier))!;\n }\n\n async follow(actor: Actor | URL | string): Promise<void> {\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot follow itself.\");\n }\n const followee = await this.bot.repository.getFollowee(actor.id);\n if (followee != null) {\n logger.warn(\n \"The bot is already following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n const id = uuidv7() as Uuid;\n const follow = new Follow({\n id: this.context.getObjectUri(Follow, {\n identifier: this.bot.identifier,\n id,\n }),\n actor: this.context.getActorUri(this.bot.identifier),\n object: actor.id,\n to: actor.id,\n });\n await this.bot.repository.addSentFollow(id, follow);\n await this.context.sendActivity(\n this.bot,\n actor,\n follow,\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n\n async unfollow(actor: Actor | URL | string): Promise<void> {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n if (actor instanceof URL || typeof actor === \"string\") {\n if (\n actor instanceof URL && actor.href === this.actorId.href ||\n typeof actor === \"string\" &&\n (actor === this.actorId.href || actor === this.actorHandle)\n ) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const object = await this.context.lookupObject(actor, { documentLoader });\n if (!isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n actor = object;\n }\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n } else if (actor.id.href === this.actorId.href) {\n throw new TypeError(\"The bot cannot unfollow itself.\");\n }\n const follow = await this.bot.repository.getFollowee(actor.id);\n if (follow == null) {\n logger.warn(\n \"The bot is not following the actor {actor}.\",\n { actor: actor.id.href },\n );\n return;\n }\n await this.bot.repository.removeFollowee(actor.id);\n if (follow.id != null && follow.objectId?.href === actor.id.href) {\n await this.context.sendActivity(\n this.bot,\n actor,\n new Undo({\n id: new URL(\"#undo\", follow.id),\n actor: this.context.getActorUri(this.bot.identifier),\n object: follow,\n to: actor.id,\n }),\n { excludeBaseUris: [new URL(this.context.origin)] },\n );\n }\n }\n\n async follows(actor: Actor | URL | string): Promise<boolean> {\n let actorId: URL;\n if (isActor(actor)) {\n if (actor.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = actor.id;\n } else if (actor instanceof URL) {\n actorId = actor;\n } else {\n if (actor.startsWith(\"http://\") || actor.startsWith(\"https://\")) {\n actorId = new URL(actor);\n } else {\n if (actor === this.actorHandle) return false;\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const object = await this.context.lookupObject(actor, {\n documentLoader,\n });\n if (object == null || !isActor(object)) {\n throw new TypeError(\"The resolved object is not an Actor.\");\n }\n if (object.id == null) {\n throw new TypeError(\"The actor does not have an ID.\");\n }\n actorId = object.id;\n }\n }\n if (actorId.href === this.actorId.href) return false;\n const follow = await this.bot.repository.getFollowee(actorId);\n return follow != null;\n }\n\n async republishProfile(): Promise<void> {\n const actor = await this.getActor();\n const update = new Update({\n id: new URL(`#update-profile/${crypto.randomUUID()}`, this.actorId),\n actor: this.actorId,\n to: this.context.getFollowersUri(this.bot.identifier),\n object: actor,\n });\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n update,\n {\n preferSharedInbox: true,\n excludeBaseUris: [new URL(this.context.origin)],\n },\n );\n }\n\n async publish(\n content: Text<\"block\", TContextData>,\n options?: SessionImplPublishOptions<TContextData>,\n ): Promise<AuthorizedMessage<Note, TContextData>>;\n async publish<T extends MessageClass>(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithClass<T, TContextData>,\n ): Promise<AuthorizedMessage<T, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options: SessionImplPublishOptionsWithQuestion<TContextData>,\n ): Promise<AuthorizedMessage<Question, TContextData>>;\n async publish(\n content: Text<\"block\", TContextData>,\n options:\n | SessionImplPublishOptions<TContextData>\n | SessionImplPublishOptionsWithClass<MessageClass, TContextData>\n | SessionImplPublishOptionsWithQuestion<TContextData> = {},\n ): Promise<AuthorizedMessage<MessageClass, TContextData>> {\n const published = new Date();\n const id = uuidv7({ msecs: +published }) as Uuid;\n const cls = \"class\" in options ? options.class : Note;\n const visibility = options.visibility ?? \"public\";\n let contentHtml = \"\";\n for await (const chunk of content.getHtml(this)) {\n contentHtml += chunk;\n }\n const tags = await Array.fromAsync(content.getTags(this));\n const mentionedActorIds: URL[] = [];\n for (const tag of tags) {\n if (tag instanceof Mention && tag.href != null) {\n mentionedActorIds.push(tag.href);\n }\n }\n if (options.quoteTarget != null) {\n let url = options.quoteTarget.raw.url ?? options.quoteTarget.id;\n if (url instanceof Link) url = url.href ?? options.quoteTarget.id;\n contentHtml += `\\n\\n<p class=\"quote-inline\"><br>RE: <a href=\"${\n encode(url.href)\n }\">${encode(url.href)}</a></p>`;\n tags.push(\n new Link({\n mediaType:\n 'application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"',\n rel: \"https://misskey-hub.net/ns#_misskey_quote\",\n href: options.quoteTarget.id,\n name: `RE: ${url.href}`,\n }),\n );\n }\n let inclusiveOptions: Note[] = [];\n let exclusiveOptions: Note[] = [];\n let voters: number | null = null;\n let endTime: Temporal.Instant | null = null;\n if (\"class\" in options && options.class === Question && \"poll\" in options) {\n if (options.poll.options.length < 2) {\n throw new TypeError(\"At least two options are required in a poll.\");\n } else if (\n new Set(options.poll.options).size != options.poll.options.length\n ) {\n throw new TypeError(\"Duplicate options are not allowed in a poll.\");\n } else if (options.poll.options.some((o) => o.trim() === \"\")) {\n throw new TypeError(\"Poll options cannot be empty.\");\n }\n const pollOptions = options.poll.options.map((option) =>\n new Note({\n name: option,\n replies: new Collection({ totalItems: 0 }),\n })\n );\n if (options.poll.multiple) inclusiveOptions = pollOptions;\n else exclusiveOptions = pollOptions;\n voters = 0;\n endTime = options.poll.endTime;\n }\n const msg = new cls({\n id: this.context.getObjectUri<MessageClass>(cls, {\n identifier: this.bot.identifier,\n id,\n }),\n contents: options.language == null\n ? [contentHtml]\n : [new LanguageString(contentHtml, options.language), contentHtml],\n replyTarget: options.replyTarget?.id,\n quoteUrl: options.quoteTarget?.id,\n tags,\n attribution: this.context.getActorUri(this.bot.identifier),\n attachments: options.attachments ?? [],\n inclusiveOptions,\n exclusiveOptions,\n voters,\n endTime,\n tos: visibility === \"public\"\n ? [PUBLIC_COLLECTION, ...mentionedActorIds]\n : visibility === \"unlisted\" || visibility === \"followers\"\n ? [\n this.context.getFollowersUri(this.bot.identifier),\n ...mentionedActorIds,\n ]\n : mentionedActorIds,\n ccs: visibility === \"public\"\n ? [this.context.getFollowersUri(this.bot.identifier)]\n : visibility === \"unlisted\"\n ? [PUBLIC_COLLECTION]\n : [],\n published: published.toTemporalInstant(),\n url: this.bot.instance.getMessageWebUrl(\n this.bot,\n id,\n this.context.origin,\n ),\n });\n const activity = new Create({\n id: this.context.getObjectUri(Create, {\n identifier: this.bot.identifier,\n id,\n }),\n actors: msg.attributionIds,\n tos: msg.toIds,\n ccs: msg.ccIds,\n object: msg,\n published: published.toTemporalInstant(),\n });\n await this.bot.repository.addMessage(id, activity);\n const preferSharedInbox = visibility === \"public\" ||\n visibility === \"unlisted\" || visibility === \"followers\";\n const excludeBaseUris = [new URL(this.context.origin)];\n if (preferSharedInbox) {\n await this.context.sendActivity(\n this.bot,\n \"followers\",\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n const cachedObjects: Record<string, Object> = {};\n for (const cachedObject of content.getCachedObjects()) {\n if (cachedObject.id == null) continue;\n cachedObjects[cachedObject.id.href] = cachedObject;\n }\n if (mentionedActorIds.length > 0) {\n const documentLoader = await this.context.getDocumentLoader(this.bot);\n const promises: Promise<Object | null>[] = [];\n for (const mentionedActorId of mentionedActorIds) {\n const cachedObject = cachedObjects[mentionedActorId.href];\n const promise = cachedObject == null\n ? this.context.lookupObject(\n mentionedActorId,\n { documentLoader },\n )\n : Promise.resolve(cachedObject);\n promises.push(promise);\n }\n const objects = await Promise.all(promises);\n const mentionedActors = objects.filter(isActor);\n await this.context.sendActivity(\n this.bot,\n mentionedActors,\n activity,\n { preferSharedInbox, excludeBaseUris },\n );\n }\n if (options.replyTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.replyTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n if (options.quoteTarget != null) {\n await this.context.sendActivity(\n this.bot,\n options.quoteTarget.actor,\n activity,\n { preferSharedInbox, excludeBaseUris, fanout: \"skip\" },\n );\n }\n return await createMessage(\n msg,\n this,\n cachedObjects,\n options.replyTarget,\n options.quoteTarget,\n true,\n );\n }\n\n async *getOutbox(\n options: SessionGetOutboxOptions = {},\n ): AsyncIterable<AuthorizedMessage<MessageClass, TContextData>> {\n for await (const activity of this.bot.repository.getMessages(options)) {\n let object: Object | null;\n try {\n object = await activity.getObject(this.context);\n } catch {\n continue;\n }\n if (object == null || !isMessageObject(object)) continue;\n const message = await createMessage(\n object,\n this,\n {},\n undefined,\n undefined,\n true,\n );\n yield message;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-impl.test.d.ts","names":[],"sources":["../src/session-impl.test.ts"],"sourcesContent":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"session-impl.test.d.ts","names":[],"sources":["../src/session-impl.test.ts"],"sourcesContent":[],"mappings":";;;;;;;UAg7BiB,YAAA;4BACW;YAChB;;UAGK,WAAA,SAAoB;kBACnB;AANlB;AAA6B,iBASb,iBAAA,CATa,GAAA,EAUtB,OAVsB,CAAA,IAAA,CAAA,EAAA,MAAA,EAWnB,GAXmB,GAAA,MAAA,CAAA,EAY1B,WAZ0B"}
|
|
@@ -39,13 +39,13 @@ test("SessionImpl.follow()", async (t) => {
|
|
|
39
39
|
assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));
|
|
40
40
|
assert.deepStrictEqual(activity.objectId, actor.id);
|
|
41
41
|
assert.deepStrictEqual(activity.toIds, [actor.id]);
|
|
42
|
-
const follow = await repository.getSentFollow(parsed.values.id);
|
|
42
|
+
const follow = await repository.getSentFollow("bot", parsed.values.id);
|
|
43
43
|
assert.ok(follow != null);
|
|
44
44
|
assert.deepStrictEqual(await follow.toJsonLd({ format: "compact" }), await activity.toJsonLd({ format: "compact" }));
|
|
45
45
|
});
|
|
46
46
|
await t.test("follow again", async () => {
|
|
47
47
|
ctx.sentActivities = [];
|
|
48
|
-
await repository.addFollowee(new URL("https://example.com/ap/actor/alice"), new Follow({
|
|
48
|
+
await repository.addFollowee("bot", new URL("https://example.com/ap/actor/alice"), new Follow({
|
|
49
49
|
id: new URL("https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0"),
|
|
50
50
|
actor: new URL("https://example.com/ap/actor/bot"),
|
|
51
51
|
object: new URL("https://example.com/ap/actor/alice")
|
|
@@ -80,7 +80,7 @@ test("SessionImpl.unfollow()", async (t) => {
|
|
|
80
80
|
const ctx = createMockContext(bot, "https://example.com");
|
|
81
81
|
const session = new SessionImpl(bot, ctx);
|
|
82
82
|
await t.test("unfollow", async () => {
|
|
83
|
-
await repository.addFollowee(new URL("https://example.com/ap/actor/alice"), new Follow({
|
|
83
|
+
await repository.addFollowee("bot", new URL("https://example.com/ap/actor/alice"), new Follow({
|
|
84
84
|
id: new URL("https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0"),
|
|
85
85
|
actor: new URL("https://example.com/ap/actor/bot"),
|
|
86
86
|
object: new URL("https://example.com/ap/actor/alice")
|
|
@@ -98,7 +98,7 @@ test("SessionImpl.unfollow()", async (t) => {
|
|
|
98
98
|
assert.ok(object instanceof Follow);
|
|
99
99
|
assert.deepStrictEqual(object.id, new URL("https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0"));
|
|
100
100
|
assert.deepStrictEqual(object.actorId, ctx.getActorUri(bot.identifier));
|
|
101
|
-
assert.deepStrictEqual(await repository.getFollowee(new URL("https://example.com/ap/actor/alice")), void 0);
|
|
101
|
+
assert.deepStrictEqual(await repository.getFollowee("bot", new URL("https://example.com/ap/actor/alice")), void 0);
|
|
102
102
|
});
|
|
103
103
|
await t.test("unfollow again", async () => {
|
|
104
104
|
ctx.sentActivities = [];
|
|
@@ -137,7 +137,7 @@ describe("SessionImpl.follows()", () => {
|
|
|
137
137
|
id: followeeId,
|
|
138
138
|
preferredUsername: "alice"
|
|
139
139
|
});
|
|
140
|
-
await repository.addFollowee(new URL("https://example.com/ap/actor/alice"), new Follow({
|
|
140
|
+
await repository.addFollowee("bot", new URL("https://example.com/ap/actor/alice"), new Follow({
|
|
141
141
|
id: new URL("https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0"),
|
|
142
142
|
actor: new URL("https://example.com/ap/actor/bot"),
|
|
143
143
|
object: followee
|
|
@@ -572,10 +572,10 @@ test("SessionImpl.getOutbox()", async (t) => {
|
|
|
572
572
|
}),
|
|
573
573
|
published: Temporal.Instant.from("2025-01-04T00:00:00Z")
|
|
574
574
|
});
|
|
575
|
-
await repository.addMessage("01941f29-7c00-7fe8-ab0a-7b593990a3c0", messageA);
|
|
576
|
-
await repository.addMessage("0194244f-d800-7873-8993-ef71ccd47306", messageB);
|
|
577
|
-
await repository.addMessage("01942976-3400-7f34-872e-2cbf0f9eeac4", messageC);
|
|
578
|
-
await repository.addMessage("01942e9c-9000-7480-a553-7a6ce737ce14", messageD);
|
|
575
|
+
await repository.addMessage("bot", "01941f29-7c00-7fe8-ab0a-7b593990a3c0", messageA);
|
|
576
|
+
await repository.addMessage("bot", "0194244f-d800-7873-8993-ef71ccd47306", messageB);
|
|
577
|
+
await repository.addMessage("bot", "01942976-3400-7f34-872e-2cbf0f9eeac4", messageC);
|
|
578
|
+
await repository.addMessage("bot", "01942e9c-9000-7480-a553-7a6ce737ce14", messageD);
|
|
579
579
|
await t.test("default", async () => {
|
|
580
580
|
const outbox = session.getOutbox({ order: "oldest" });
|
|
581
581
|
const messages = await Array.fromAsync(outbox);
|