@fedify/botkit 0.5.0-dev.210 → 0.5.0-dev.225
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 +5 -3
- 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/Follower.d.ts +2 -2
- 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 +2 -1
- 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 +12 -3
- 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 +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-impl.test.js","names":["bot: BotImpl<void>","origin: URL | string"],"sources":["../src/session-impl.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 { type Context, MemoryKvStore } from \"@fedify/fedify/federation\";\nimport {\n type Activity,\n Create,\n Follow,\n Note,\n Person,\n PUBLIC_COLLECTION,\n Question,\n type Recipient,\n Undo,\n Update,\n} from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage } from \"./message-impl.ts\";\nimport { MemoryRepository, type Uuid } from \"./repository.ts\";\nimport { SessionImpl } from \"./session-impl.ts\";\nimport { mention, text } from \"./text.ts\";\n\ntest(\"SessionImpl.follow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"follow\", async () => {\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Follow);\n const parsed = ctx.parseUri(activity.id);\n assert.deepStrictEqual(parsed?.type, \"object\");\n assert.ok(parsed?.type === \"object\");\n assert.deepStrictEqual(parsed.class, Follow);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.objectId, actor.id);\n assert.deepStrictEqual(activity.toIds, [actor.id]);\n const follow = await repository.getSentFollow(parsed.values.id as Uuid);\n assert.ok(follow != null);\n assert.deepStrictEqual(\n await follow.toJsonLd({ format: \"compact\" }),\n await activity.toJsonLd({ format: \"compact\" }),\n );\n });\n\n await t.test(\"follow again\", async () => {\n ctx.sentActivities = [];\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"follow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.follow(session.actorId.href),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorId),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorHandle),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.follow(actor),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ntest(\"SessionImpl.unfollow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"unfollow\", async () => {\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Undo);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Follow);\n assert.deepStrictEqual(\n object.id,\n new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n );\n assert.deepStrictEqual(object.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(\n await repository.getFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n ),\n undefined,\n );\n });\n\n await t.test(\"unfollow again\", async () => {\n ctx.sentActivities = [];\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"unfollow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.unfollow(session.actorId.href),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorId),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorHandle),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.unfollow(actor),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ndescribe(\"SessionImpl.follows()\", () => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n test(\"when it follows\", async () => {\n const followeeId = new URL(\"https://example.com/ap/actor/alice\");\n const followee = new Person({\n id: followeeId,\n preferredUsername: \"alice\",\n });\n await repository.addFollowee(\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followee,\n }),\n );\n assert.ok(await session.follows(followeeId.href));\n assert.ok(await session.follows(followeeId));\n assert.ok(await session.follows(followee));\n });\n\n test(\"when it does not follow\", async () => {\n const actorId = new URL(\"https://example.com/ap/actor/john\");\n const actor = new Person({\n id: actorId,\n preferredUsername: \"john\",\n });\n assert.deepStrictEqual(await session.follows(actorId.href), false);\n assert.deepStrictEqual(await session.follows(actorId), false);\n assert.deepStrictEqual(await session.follows(actor), false);\n });\n\n test(\"bot itself\", async () => {\n assert.deepStrictEqual(await session.follows(session.actorId.href), false);\n assert.deepStrictEqual(await session.follows(session.actorId), false);\n assert.deepStrictEqual(\n await session.follows(await session.getActor()),\n false,\n );\n assert.deepStrictEqual(await session.follows(session.actorHandle), false);\n });\n});\n\ntest(\"SessionImpl.republishProfile()\", async () => {\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n name: \"Bot display name\",\n summary: text`This is the bot profile.`,\n icon: new URL(\"https://example.com/icon.png\"),\n image: new URL(\"https://example.com/header.png\"),\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await session.republishProfile();\n\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Update);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(activity.ccIds, []);\n const actor = await activity.getObject(ctx);\n assert.ok(actor instanceof bot.class);\n assert.deepStrictEqual(actor.id, session.actorId);\n assert.deepStrictEqual(actor.name?.toString(), \"Bot display name\");\n assert.deepStrictEqual(\n actor.summary?.toString(),\n \"<p>This is the bot profile.</p>\",\n );\n const icon = await actor.getIcon();\n assert.ok(icon != null);\n assert.deepStrictEqual(icon.url, new URL(\"https://example.com/icon.png\"));\n const image = await actor.getImage();\n assert.ok(image != null);\n assert.deepStrictEqual(image.url, new URL(\"https://example.com/header.png\"));\n});\n\ntest(\"SessionImpl.publish()\", async (t) => {\n const kv = new MemoryKvStore();\n const bot = new BotImpl<void>({ kv, username: \"bot\" });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"public\", async () => {\n ctx.sentActivities = [];\n const publicMsg = await session.publish(text`Hello, world!`);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.content, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(publicMsg.id, object.id);\n assert.deepStrictEqual(publicMsg.text, \"Hello, world!\");\n assert.deepStrictEqual(publicMsg.html, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(publicMsg.visibility, \"public\");\n assert.deepStrictEqual(publicMsg.mentions, []);\n });\n\n await t.test(\"unlisted\", async () => {\n ctx.sentActivities = [];\n const unlistedMsg = await session.publish(text`Hello!`, {\n visibility: \"unlisted\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.content, \"<p>Hello!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(unlistedMsg.id, object.id);\n assert.deepStrictEqual(unlistedMsg.text, \"Hello!\");\n assert.deepStrictEqual(unlistedMsg.html, \"<p>Hello!</p>\");\n assert.deepStrictEqual(unlistedMsg.visibility, \"unlisted\");\n assert.deepStrictEqual(unlistedMsg.mentions, []);\n });\n\n await t.test(\"followers\", async () => {\n ctx.sentActivities = [];\n const followersMsg = await session.publish(text`Hi!`, {\n visibility: \"followers\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(object.content, \"<p>Hi!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(followersMsg.id, object.id);\n assert.deepStrictEqual(followersMsg.text, \"Hi!\");\n assert.deepStrictEqual(followersMsg.html, \"<p>Hi!</p>\");\n assert.deepStrictEqual(followersMsg.visibility, \"followers\");\n assert.deepStrictEqual(followersMsg.mentions, []);\n });\n\n await t.test(\"direct\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n ctx.sentActivities = [];\n const directMsg = await session.publish(\n text`Hey ${mention(mentioned)}!`,\n { visibility: \"direct\" },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [mentioned.id]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(\n object.content,\n '<p>Hey <a href=\"https://example.com/ap/actor/john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a>!</p>\",\n );\n const tags = await Array.fromAsync(object.getTags());\n assert.deepStrictEqual(tags.length, 1);\n assert.deepStrictEqual(directMsg.id, object.id);\n assert.deepStrictEqual(directMsg.text, \"Hey @john@example.com!\");\n assert.deepStrictEqual(directMsg.html, object.content);\n assert.deepStrictEqual(directMsg.visibility, \"direct\");\n // assert.deepStrictEqual(directMsg.mentions, [mentioned]); // FIXME\n });\n\n await t.test(\"quote\", async () => {\n const originalAuthor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const originalPost = new Note({\n id: new URL(\n \"https://example.com/ap/note/c1c792ce-a0be-4685-b396-e59e5ef8c788\",\n ),\n content: \"<p>Hello, world!</p>\",\n attribution: originalAuthor,\n to: new URL(\"https://example.com/ap/actor/john/followers\"),\n cc: PUBLIC_COLLECTION,\n });\n const originalMsg = await createMessage<Note, void>(\n originalPost,\n session,\n {},\n );\n ctx.sentActivities = [];\n const quote = await session.publish(text`Check this out!`, {\n quoteTarget: originalMsg,\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 2);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n const { recipients: recipients2, activity: activity2 } =\n ctx.sentActivities[1];\n assert.deepStrictEqual(recipients2, [originalAuthor]);\n assert.ok(activity2 instanceof Create);\n assert.deepStrictEqual(activity2.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity2.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity2.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n `<p>Check this out!</p>\n\n<p class=\"quote-inline\"><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(object.quoteUrl, originalMsg.id);\n assert.deepStrictEqual(quote.id, object.id);\n assert.deepStrictEqual(\n quote.text,\n `Check this out!\\n\\nRE: ${originalMsg.id.href}`,\n );\n assert.deepStrictEqual(\n quote.html,\n `<p>Check this out!</p>\n\n<p><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(quote.visibility, \"public\");\n assert.deepStrictEqual(quote.quoteTarget?.id, originalMsg.id);\n });\n\n await t.test(\"poll single choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 });\n const poll = await session.publish(text`What's your favorite color?`, {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Red\", \"Blue\", \"Green\"],\n endTime,\n },\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n \"<p>What's your favorite color?</p>\",\n );\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.inclusiveOptionIds, []);\n\n const exclusiveOptions = await Array.fromAsync(\n object.getExclusiveOptions(ctx),\n );\n assert.deepStrictEqual(exclusiveOptions.length, 3);\n assert.ok(exclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[0].name?.toString(), \"Red\");\n assert.ok(exclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[1].name?.toString(), \"Blue\");\n assert.ok(exclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[2].name?.toString(), \"Green\");\n\n for (const option of exclusiveOptions) {\n const replies = await option.getReplies(ctx);\n assert.deepStrictEqual(replies?.totalItems, 0);\n }\n\n assert.deepStrictEqual(poll.id, object.id);\n assert.deepStrictEqual(poll.text, \"What's your favorite color?\");\n assert.deepStrictEqual(\n poll.html,\n \"<p>What's your favorite color?</p>\",\n );\n assert.deepStrictEqual(poll.visibility, \"public\");\n });\n\n await t.test(\"poll multiple choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 * 7 });\n const poll = await session.publish(\n text`Which programming languages do you know?`,\n {\n class: Question,\n poll: {\n multiple: true,\n options: [\"JavaScript\", \"TypeScript\", \"Python\", \"Rust\"],\n endTime,\n },\n visibility: \"unlisted\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.exclusiveOptionIds, []);\n\n const inclusiveOptions = await Array.fromAsync(\n object.getInclusiveOptions(ctx),\n );\n assert.deepStrictEqual(inclusiveOptions.length, 4);\n assert.ok(inclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[0].name?.toString(), \"JavaScript\");\n assert.ok(inclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[1].name?.toString(), \"TypeScript\");\n assert.ok(inclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[2].name?.toString(), \"Python\");\n assert.ok(inclusiveOptions[3] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[3].name?.toString(), \"Rust\");\n\n assert.deepStrictEqual(poll.visibility, \"unlisted\");\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n });\n\n await t.test(\"poll with direct visibility\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 12 });\n const poll = await session.publish(\n text`Hey ${mention(mentioned)}, what do you think?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Good\", \"Bad\", \"Neutral\"],\n endTime,\n },\n visibility: \"direct\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(poll.visibility, \"direct\");\n });\n\n await t.test(\"poll end-to-end workflow\", async () => {\n // Create fresh repository and session for isolation\n const freshRepository = new MemoryRepository();\n const freshBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository: freshRepository,\n username: \"testbot\",\n });\n const freshCtx = createMockContext(freshBot, \"https://example.com\");\n const freshSession = new SessionImpl(freshBot, freshCtx);\n\n const endTime = Temporal.Now.instant().add({ hours: 1 });\n\n // 1. Create a poll\n const poll = await freshSession.publish(\n text`What should we have for lunch?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Pizza\", \"Burgers\", \"Salad\"],\n endTime,\n },\n },\n );\n\n // Verify poll was created correctly\n assert.deepStrictEqual(freshCtx.sentActivities.length, 1);\n const { activity: createActivity } = freshCtx.sentActivities[0];\n assert.ok(createActivity instanceof Create);\n const pollObject = await createActivity.getObject(freshCtx);\n assert.ok(pollObject instanceof Question);\n assert.deepStrictEqual(pollObject.endTime, endTime);\n\n // Get poll options\n const options = await Array.fromAsync(\n pollObject.getExclusiveOptions(freshCtx),\n );\n assert.deepStrictEqual(options.length, 3);\n assert.deepStrictEqual(options[0].name?.toString(), \"Pizza\");\n assert.deepStrictEqual(options[1].name?.toString(), \"Burgers\");\n assert.deepStrictEqual(options[2].name?.toString(), \"Salad\");\n\n // 2. Verify poll is accessible via getOutbox\n const outbox = freshSession.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 1);\n assert.deepStrictEqual(messages[0].id, poll.id);\n assert.deepStrictEqual(messages[0].text, \"What should we have for lunch?\");\n\n // 3. Verify poll structure\n assert.deepStrictEqual(poll.visibility, \"public\");\n assert.deepStrictEqual(poll.mentions, []);\n });\n});\n\ntest(\"SessionImpl.getOutbox()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\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 await repository.addMessage(\"01941f29-7c00-7fe8-ab0a-7b593990a3c0\", messageA);\n await repository.addMessage(\"0194244f-d800-7873-8993-ef71ccd47306\", messageB);\n await repository.addMessage(\"01942976-3400-7f34-872e-2cbf0f9eeac4\", messageC);\n await repository.addMessage(\"01942e9c-9000-7480-a553-7a6ce737ce14\", messageD);\n\n await t.test(\"default\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 4);\n\n assert.deepStrictEqual(\n messages[0].id.href,\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n );\n assert.deepStrictEqual(\n messages[0].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[0].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[0].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[0].published,\n Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[1].id.href,\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n );\n assert.deepStrictEqual(\n messages[1].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[1].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[1].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[1].published,\n Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[2].id.href,\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n );\n assert.deepStrictEqual(\n messages[2].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[2].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[2].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[2].published,\n Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[3].id.href,\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n );\n assert.deepStrictEqual(\n messages[3].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[3].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[3].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[3].published,\n Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n );\n });\n\n await t.test(\"order: 'oldest'\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ]);\n });\n\n await t.test(\"order: 'newest'\", async () => {\n const outbox = session.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"since\", async () => {\n const outbox = session.getOutbox({\n since: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ]);\n });\n\n await t.test(\"until\", async () => {\n const outbox = session.getOutbox({\n until: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"messages should have update and delete methods\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.strictEqual(messages.length, 4);\n\n for (const message of messages) {\n assert.strictEqual(typeof message.update, \"function\");\n assert.strictEqual(typeof message.delete, \"function\");\n }\n });\n});\n\nexport interface SentActivity {\n recipients: \"followers\" | Recipient[];\n activity: Activity;\n}\n\nexport interface MockContext extends Context<void> {\n sentActivities: SentActivity[];\n}\n\nexport function createMockContext(\n bot: BotImpl<void>,\n origin: URL | string,\n): MockContext {\n const ctx = bot.federation.createContext(\n new URL(origin),\n undefined,\n ) as MockContext;\n ctx.sentActivities = [];\n ctx.sendActivity = (_, recipients, activity) => {\n ctx.sentActivities.push({\n recipients: recipients === \"followers\"\n ? \"followers\"\n : Array.isArray(recipients)\n ? recipients\n : [recipients],\n activity,\n });\n return Promise.resolve();\n };\n return ctx;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-impl.test.js","names":["bot: BotImpl<void>","origin: URL | string"],"sources":["../src/session-impl.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 { type Context, MemoryKvStore } from \"@fedify/fedify/federation\";\nimport {\n type Activity,\n Create,\n Follow,\n Note,\n Person,\n PUBLIC_COLLECTION,\n Question,\n type Recipient,\n Undo,\n Update,\n} from \"@fedify/vocab\";\nimport assert from \"node:assert\";\nimport { describe, test } from \"node:test\";\nimport { BotImpl } from \"./bot-impl.ts\";\nimport { createMessage } from \"./message-impl.ts\";\nimport { MemoryRepository, type Uuid } from \"./repository.ts\";\nimport { SessionImpl } from \"./session-impl.ts\";\nimport { mention, text } from \"./text.ts\";\n\ntest(\"SessionImpl.follow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"follow\", async () => {\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Follow);\n const parsed = ctx.parseUri(activity.id);\n assert.deepStrictEqual(parsed?.type, \"object\");\n assert.ok(parsed?.type === \"object\");\n assert.deepStrictEqual(parsed.class, Follow);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.objectId, actor.id);\n assert.deepStrictEqual(activity.toIds, [actor.id]);\n const follow = await repository.getSentFollow(\n \"bot\",\n parsed.values.id as Uuid,\n );\n assert.ok(follow != null);\n assert.deepStrictEqual(\n await follow.toJsonLd({ format: \"compact\" }),\n await activity.toJsonLd({ format: \"compact\" }),\n );\n });\n\n await t.test(\"follow again\", async () => {\n ctx.sentActivities = [];\n await repository.addFollowee(\n \"bot\",\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.follow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"follow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.follow(session.actorId.href),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorId),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.follow(session.actorHandle),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.follow(actor),\n TypeError,\n \"The bot cannot follow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ntest(\"SessionImpl.unfollow()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"unfollow\", async () => {\n await repository.addFollowee(\n \"bot\",\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: new URL(\"https://example.com/ap/actor/alice\"),\n }),\n );\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [actor]);\n assert.ok(activity instanceof Undo);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Follow);\n assert.deepStrictEqual(\n object.id,\n new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n );\n assert.deepStrictEqual(object.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(\n await repository.getFollowee(\n \"bot\",\n new URL(\"https://example.com/ap/actor/alice\"),\n ),\n undefined,\n );\n });\n\n await t.test(\"unfollow again\", async () => {\n ctx.sentActivities = [];\n const actor = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n await session.unfollow(actor);\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n\n await t.test(\"unfollow bot itself\", async () => {\n ctx.sentActivities = [];\n await assert.rejects(\n () => session.unfollow(session.actorId.href),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorId),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n await assert.rejects(\n () => session.unfollow(session.actorHandle),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n\n const actor = await session.getActor();\n await assert.rejects(\n () => session.unfollow(actor),\n TypeError,\n \"The bot cannot unfollow itself.\",\n );\n assert.deepStrictEqual(ctx.sentActivities, []);\n });\n});\n\ndescribe(\"SessionImpl.follows()\", () => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n test(\"when it follows\", async () => {\n const followeeId = new URL(\"https://example.com/ap/actor/alice\");\n const followee = new Person({\n id: followeeId,\n preferredUsername: \"alice\",\n });\n await repository.addFollowee(\n \"bot\",\n new URL(\"https://example.com/ap/actor/alice\"),\n new Follow({\n id: new URL(\n \"https://example.com/ap/follow/4114eadb-2596-408f-ad99-06f467c9ace0\",\n ),\n actor: new URL(\"https://example.com/ap/actor/bot\"),\n object: followee,\n }),\n );\n assert.ok(await session.follows(followeeId.href));\n assert.ok(await session.follows(followeeId));\n assert.ok(await session.follows(followee));\n });\n\n test(\"when it does not follow\", async () => {\n const actorId = new URL(\"https://example.com/ap/actor/john\");\n const actor = new Person({\n id: actorId,\n preferredUsername: \"john\",\n });\n assert.deepStrictEqual(await session.follows(actorId.href), false);\n assert.deepStrictEqual(await session.follows(actorId), false);\n assert.deepStrictEqual(await session.follows(actor), false);\n });\n\n test(\"bot itself\", async () => {\n assert.deepStrictEqual(await session.follows(session.actorId.href), false);\n assert.deepStrictEqual(await session.follows(session.actorId), false);\n assert.deepStrictEqual(\n await session.follows(await session.getActor()),\n false,\n );\n assert.deepStrictEqual(await session.follows(session.actorHandle), false);\n });\n});\n\ntest(\"SessionImpl.republishProfile()\", async () => {\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n username: \"bot\",\n name: \"Bot display name\",\n summary: text`This is the bot profile.`,\n icon: new URL(\"https://example.com/icon.png\"),\n image: new URL(\"https://example.com/header.png\"),\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await session.republishProfile();\n\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Update);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(activity.ccIds, []);\n const actor = await activity.getObject(ctx);\n assert.ok(actor instanceof bot.class);\n assert.deepStrictEqual(actor.id, session.actorId);\n assert.deepStrictEqual(actor.name?.toString(), \"Bot display name\");\n assert.deepStrictEqual(\n actor.summary?.toString(),\n \"<p>This is the bot profile.</p>\",\n );\n const icon = await actor.getIcon();\n assert.ok(icon != null);\n assert.deepStrictEqual(icon.url, new URL(\"https://example.com/icon.png\"));\n const image = await actor.getImage();\n assert.ok(image != null);\n assert.deepStrictEqual(image.url, new URL(\"https://example.com/header.png\"));\n});\n\ntest(\"SessionImpl.publish()\", async (t) => {\n const kv = new MemoryKvStore();\n const bot = new BotImpl<void>({ kv, username: \"bot\" });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\n\n await t.test(\"public\", async () => {\n ctx.sentActivities = [];\n const publicMsg = await session.publish(text`Hello, world!`);\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.content, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(publicMsg.id, object.id);\n assert.deepStrictEqual(publicMsg.text, \"Hello, world!\");\n assert.deepStrictEqual(publicMsg.html, \"<p>Hello, world!</p>\");\n assert.deepStrictEqual(publicMsg.visibility, \"public\");\n assert.deepStrictEqual(publicMsg.mentions, []);\n });\n\n await t.test(\"unlisted\", async () => {\n ctx.sentActivities = [];\n const unlistedMsg = await session.publish(text`Hello!`, {\n visibility: \"unlisted\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.content, \"<p>Hello!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(unlistedMsg.id, object.id);\n assert.deepStrictEqual(unlistedMsg.text, \"Hello!\");\n assert.deepStrictEqual(unlistedMsg.html, \"<p>Hello!</p>\");\n assert.deepStrictEqual(unlistedMsg.visibility, \"unlisted\");\n assert.deepStrictEqual(unlistedMsg.mentions, []);\n });\n\n await t.test(\"followers\", async () => {\n ctx.sentActivities = [];\n const followersMsg = await session.publish(text`Hi!`, {\n visibility: \"followers\",\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(object.content, \"<p>Hi!</p>\");\n assert.deepStrictEqual(object.tagIds, []);\n assert.deepStrictEqual(followersMsg.id, object.id);\n assert.deepStrictEqual(followersMsg.text, \"Hi!\");\n assert.deepStrictEqual(followersMsg.html, \"<p>Hi!</p>\");\n assert.deepStrictEqual(followersMsg.visibility, \"followers\");\n assert.deepStrictEqual(followersMsg.mentions, []);\n });\n\n await t.test(\"direct\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n ctx.sentActivities = [];\n const directMsg = await session.publish(\n text`Hey ${mention(mentioned)}!`,\n { visibility: \"direct\" },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [mentioned.id]);\n assert.deepStrictEqual(activity.ccIds, []);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(\n object.content,\n '<p>Hey <a href=\"https://example.com/ap/actor/john\" translate=\"no\" ' +\n 'class=\"h-card u-url mention\" target=\"_blank\">@<span>john@example.com' +\n \"</span></a>!</p>\",\n );\n const tags = await Array.fromAsync(object.getTags());\n assert.deepStrictEqual(tags.length, 1);\n assert.deepStrictEqual(directMsg.id, object.id);\n assert.deepStrictEqual(directMsg.text, \"Hey @john@example.com!\");\n assert.deepStrictEqual(directMsg.html, object.content);\n assert.deepStrictEqual(directMsg.visibility, \"direct\");\n // assert.deepStrictEqual(directMsg.mentions, [mentioned]); // FIXME\n });\n\n await t.test(\"quote\", async () => {\n const originalAuthor = new Person({\n id: new URL(\"https://example.com/ap/actor/john\"),\n preferredUsername: \"john\",\n });\n const originalPost = new Note({\n id: new URL(\n \"https://example.com/ap/note/c1c792ce-a0be-4685-b396-e59e5ef8c788\",\n ),\n content: \"<p>Hello, world!</p>\",\n attribution: originalAuthor,\n to: new URL(\"https://example.com/ap/actor/john/followers\"),\n cc: PUBLIC_COLLECTION,\n });\n const originalMsg = await createMessage<Note, void>(\n originalPost,\n session,\n {},\n );\n ctx.sentActivities = [];\n const quote = await session.publish(text`Check this out!`, {\n quoteTarget: originalMsg,\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 2);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n const { recipients: recipients2, activity: activity2 } =\n ctx.sentActivities[1];\n assert.deepStrictEqual(recipients2, [originalAuthor]);\n assert.ok(activity2 instanceof Create);\n assert.deepStrictEqual(activity2.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity2.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity2.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.ok(object instanceof Note);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n `<p>Check this out!</p>\n\n<p class=\"quote-inline\"><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(object.quoteUrl, originalMsg.id);\n assert.deepStrictEqual(quote.id, object.id);\n assert.deepStrictEqual(\n quote.text,\n `Check this out!\\n\\nRE: ${originalMsg.id.href}`,\n );\n assert.deepStrictEqual(\n quote.html,\n `<p>Check this out!</p>\n\n<p><br>RE: <a href=\"${originalMsg.id.href}\">${originalMsg.id.href}</a></p>`,\n );\n assert.deepStrictEqual(quote.visibility, \"public\");\n assert.deepStrictEqual(quote.quoteTarget?.id, originalMsg.id);\n });\n\n await t.test(\"poll single choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 });\n const poll = await session.publish(text`What's your favorite color?`, {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Red\", \"Blue\", \"Green\"],\n endTime,\n },\n });\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n assert.deepStrictEqual(activity.actorId, ctx.getActorUri(bot.identifier));\n assert.deepStrictEqual(activity.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(activity.ccIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(\n object.attributionId,\n ctx.getActorUri(bot.identifier),\n );\n assert.deepStrictEqual(object.toIds, [PUBLIC_COLLECTION]);\n assert.deepStrictEqual(object.ccIds, [ctx.getFollowersUri(bot.identifier)]);\n assert.deepStrictEqual(\n object.content,\n \"<p>What's your favorite color?</p>\",\n );\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.inclusiveOptionIds, []);\n\n const exclusiveOptions = await Array.fromAsync(\n object.getExclusiveOptions(ctx),\n );\n assert.deepStrictEqual(exclusiveOptions.length, 3);\n assert.ok(exclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[0].name?.toString(), \"Red\");\n assert.ok(exclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[1].name?.toString(), \"Blue\");\n assert.ok(exclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(exclusiveOptions[2].name?.toString(), \"Green\");\n\n for (const option of exclusiveOptions) {\n const replies = await option.getReplies(ctx);\n assert.deepStrictEqual(replies?.totalItems, 0);\n }\n\n assert.deepStrictEqual(poll.id, object.id);\n assert.deepStrictEqual(poll.text, \"What's your favorite color?\");\n assert.deepStrictEqual(\n poll.html,\n \"<p>What's your favorite color?</p>\",\n );\n assert.deepStrictEqual(poll.visibility, \"public\");\n });\n\n await t.test(\"poll multiple choice\", async () => {\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 24 * 7 });\n const poll = await session.publish(\n text`Which programming languages do you know?`,\n {\n class: Question,\n poll: {\n multiple: true,\n options: [\"JavaScript\", \"TypeScript\", \"Python\", \"Rust\"],\n endTime,\n },\n visibility: \"unlisted\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, \"followers\");\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.endTime, endTime);\n assert.deepStrictEqual(object.voters, 0);\n assert.deepStrictEqual(object.exclusiveOptionIds, []);\n\n const inclusiveOptions = await Array.fromAsync(\n object.getInclusiveOptions(ctx),\n );\n assert.deepStrictEqual(inclusiveOptions.length, 4);\n assert.ok(inclusiveOptions[0] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[0].name?.toString(), \"JavaScript\");\n assert.ok(inclusiveOptions[1] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[1].name?.toString(), \"TypeScript\");\n assert.ok(inclusiveOptions[2] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[2].name?.toString(), \"Python\");\n assert.ok(inclusiveOptions[3] instanceof Note);\n assert.deepStrictEqual(inclusiveOptions[3].name?.toString(), \"Rust\");\n\n assert.deepStrictEqual(poll.visibility, \"unlisted\");\n assert.deepStrictEqual(activity.toIds, [\n ctx.getFollowersUri(bot.identifier),\n ]);\n assert.deepStrictEqual(activity.ccIds, [PUBLIC_COLLECTION]);\n });\n\n await t.test(\"poll with direct visibility\", async () => {\n const mentioned = new Person({\n id: new URL(\"https://example.com/ap/actor/alice\"),\n preferredUsername: \"alice\",\n });\n ctx.sentActivities = [];\n const endTime = Temporal.Now.instant().add({ hours: 12 });\n const poll = await session.publish(\n text`Hey ${mention(mentioned)}, what do you think?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Good\", \"Bad\", \"Neutral\"],\n endTime,\n },\n visibility: \"direct\",\n },\n );\n assert.deepStrictEqual(ctx.sentActivities.length, 1);\n const { recipients, activity } = ctx.sentActivities[0];\n assert.deepStrictEqual(recipients, [mentioned]);\n assert.ok(activity instanceof Create);\n const object = await activity.getObject(ctx);\n assert.ok(object instanceof Question);\n assert.deepStrictEqual(object.toIds, [mentioned.id]);\n assert.deepStrictEqual(object.ccIds, []);\n assert.deepStrictEqual(poll.visibility, \"direct\");\n });\n\n await t.test(\"poll end-to-end workflow\", async () => {\n // Create fresh repository and session for isolation\n const freshRepository = new MemoryRepository();\n const freshBot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository: freshRepository,\n username: \"testbot\",\n });\n const freshCtx = createMockContext(freshBot, \"https://example.com\");\n const freshSession = new SessionImpl(freshBot, freshCtx);\n\n const endTime = Temporal.Now.instant().add({ hours: 1 });\n\n // 1. Create a poll\n const poll = await freshSession.publish(\n text`What should we have for lunch?`,\n {\n class: Question,\n poll: {\n multiple: false,\n options: [\"Pizza\", \"Burgers\", \"Salad\"],\n endTime,\n },\n },\n );\n\n // Verify poll was created correctly\n assert.deepStrictEqual(freshCtx.sentActivities.length, 1);\n const { activity: createActivity } = freshCtx.sentActivities[0];\n assert.ok(createActivity instanceof Create);\n const pollObject = await createActivity.getObject(freshCtx);\n assert.ok(pollObject instanceof Question);\n assert.deepStrictEqual(pollObject.endTime, endTime);\n\n // Get poll options\n const options = await Array.fromAsync(\n pollObject.getExclusiveOptions(freshCtx),\n );\n assert.deepStrictEqual(options.length, 3);\n assert.deepStrictEqual(options[0].name?.toString(), \"Pizza\");\n assert.deepStrictEqual(options[1].name?.toString(), \"Burgers\");\n assert.deepStrictEqual(options[2].name?.toString(), \"Salad\");\n\n // 2. Verify poll is accessible via getOutbox\n const outbox = freshSession.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 1);\n assert.deepStrictEqual(messages[0].id, poll.id);\n assert.deepStrictEqual(messages[0].text, \"What should we have for lunch?\");\n\n // 3. Verify poll structure\n assert.deepStrictEqual(poll.visibility, \"public\");\n assert.deepStrictEqual(poll.mentions, []);\n });\n});\n\ntest(\"SessionImpl.getOutbox()\", async (t) => {\n const repository = new MemoryRepository();\n const bot = new BotImpl<void>({\n kv: new MemoryKvStore(),\n repository,\n username: \"bot\",\n });\n const ctx = createMockContext(bot, \"https://example.com\");\n const session = new SessionImpl(bot, ctx);\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 await repository.addMessage(\n \"bot\",\n \"01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n messageA,\n );\n await repository.addMessage(\n \"bot\",\n \"0194244f-d800-7873-8993-ef71ccd47306\",\n messageB,\n );\n await repository.addMessage(\n \"bot\",\n \"01942976-3400-7f34-872e-2cbf0f9eeac4\",\n messageC,\n );\n await repository.addMessage(\n \"bot\",\n \"01942e9c-9000-7480-a553-7a6ce737ce14\",\n messageD,\n );\n\n await t.test(\"default\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.deepStrictEqual(messages.length, 4);\n\n assert.deepStrictEqual(\n messages[0].id.href,\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n );\n assert.deepStrictEqual(\n messages[0].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[0].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[0].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[0].published,\n Temporal.Instant.from(\"2025-01-01T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[1].id.href,\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n );\n assert.deepStrictEqual(\n messages[1].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[1].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[1].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[1].published,\n Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[2].id.href,\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n );\n assert.deepStrictEqual(\n messages[2].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[2].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[2].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[2].published,\n Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n );\n\n assert.deepStrictEqual(\n messages[3].id.href,\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n );\n assert.deepStrictEqual(\n messages[3].actor.id?.href,\n \"https://example.com/ap/actor/bot\",\n );\n assert.deepStrictEqual(messages[3].visibility, \"unlisted\");\n assert.deepStrictEqual(messages[3].text, \"Hello, world!\");\n assert.deepStrictEqual(\n messages[3].published,\n Temporal.Instant.from(\"2025-01-04T00:00:00Z\"),\n );\n });\n\n await t.test(\"order: 'oldest'\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n ]);\n });\n\n await t.test(\"order: 'newest'\", async () => {\n const outbox = session.getOutbox({ order: \"newest\" });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"since\", async () => {\n const outbox = session.getOutbox({\n since: Temporal.Instant.from(\"2025-01-03T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/01942e9c-9000-7480-a553-7a6ce737ce14\",\n \"https://example.com/ap/note/01942976-3400-7f34-872e-2cbf0f9eeac4\",\n ]);\n });\n\n await t.test(\"until\", async () => {\n const outbox = session.getOutbox({\n until: Temporal.Instant.from(\"2025-01-02T00:00:00Z\"),\n });\n const messages = await Array.fromAsync(outbox);\n const messageIds = messages.map((msg) => msg.id.href);\n assert.deepStrictEqual(messageIds, [\n \"https://example.com/ap/note/0194244f-d800-7873-8993-ef71ccd47306\",\n \"https://example.com/ap/note/01941f29-7c00-7fe8-ab0a-7b593990a3c0\",\n ]);\n });\n\n await t.test(\"messages should have update and delete methods\", async () => {\n const outbox = session.getOutbox({ order: \"oldest\" });\n const messages = await Array.fromAsync(outbox);\n assert.strictEqual(messages.length, 4);\n\n for (const message of messages) {\n assert.strictEqual(typeof message.update, \"function\");\n assert.strictEqual(typeof message.delete, \"function\");\n }\n });\n});\n\nexport interface SentActivity {\n recipients: \"followers\" | Recipient[];\n activity: Activity;\n}\n\nexport interface MockContext extends Context<void> {\n sentActivities: SentActivity[];\n}\n\nexport function createMockContext(\n bot: BotImpl<void>,\n origin: URL | string,\n): MockContext {\n const ctx = bot.federation.createContext(\n new URL(origin),\n undefined,\n ) as MockContext;\n ctx.sentActivities = [];\n ctx.sendActivity = (_, recipients, activity) => {\n ctx.sentActivities.push({\n recipients: recipients === \"followers\"\n ? \"followers\"\n : Array.isArray(recipients)\n ? recipients\n : [recipients],\n activity,\n });\n return Promise.resolve();\n };\n return ctx;\n}\n"],"mappings":"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"}
|
package/dist/session.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ Date.prototype.toTemporalInstant = toTemporalInstant;
|
|
|
3
3
|
import { Text } from "./text.js";
|
|
4
4
|
import { AuthorizedMessage, Message, MessageClass, MessageVisibility } from "./message.js";
|
|
5
5
|
import { Poll } from "./poll.js";
|
|
6
|
-
import {
|
|
6
|
+
import { ReadonlyBot } from "./bot.js";
|
|
7
7
|
import { Context } from "@fedify/fedify/federation";
|
|
8
8
|
import { Actor, Article, ChatMessage, Document, Note, Question } from "@fedify/vocab";
|
|
9
9
|
|
|
@@ -13,9 +13,14 @@ import { Actor, Article, ChatMessage, Document, Note, Question } from "@fedify/v
|
|
|
13
13
|
*/
|
|
14
14
|
interface Session<TContextData> {
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
16
|
+
* A read-only view of the bot to which the session belongs. It exposes
|
|
17
|
+
* the bot's identity and profile (e.g. `identifier`, `username`, `name`)
|
|
18
|
+
* without allowing event handlers to be reassigned through it.
|
|
19
|
+
*
|
|
20
|
+
* Before BotKit 0.5.0, this property was typed as `Bot`; it is now
|
|
21
|
+
* a {@link ReadonlyBot} so that a session cannot mutate its bot.
|
|
17
22
|
*/
|
|
18
|
-
readonly bot:
|
|
23
|
+
readonly bot: ReadonlyBot;
|
|
19
24
|
/**
|
|
20
25
|
* The Fedify context of the session.
|
|
21
26
|
*/
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","names":[],"sources":["../src/session.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;UAqCiB;;;AAAjB
|
|
1
|
+
{"version":3,"file":"session.d.ts","names":[],"sources":["../src/session.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;UAqCiB;;;AAAjB;;;;;;EAmBuB,SAWD,GAAA,EArBN,WAqBM;EAAK;;;EAgBA,SAAY,OAAA,EAhCnB,OAgCmB,CAhCX,YAgCW,CAAA;EAAO;;;EAeE,SAW/B,OAAA,EArDG,GAqDH;EAAK;;;EAYO,SASF,WAAA,EAAA,IAAA,MAAA,IAAA,MAAA,EAAA;EAAY;;;;EAEJ,QAAE,EAAA,EAjEvB,OAiEuB,CAjEf,KAiEe,CAAA;EAAY;;;;;;;;;;;;;;EAsBhC,MAC8B,CAAA,KAAA,EAxE/B,KAwE+B,GAxEvB,GAwEuB,GAAA,MAAA,CAAA,EAxER,OAwEQ,CAAA,IAAA,CAAA;EAAY;;;;;;;;;;AAUzC;AAOlB;;EAAsC,QAIF,CAAA,KAAA,EA9ElB,KA8EkB,GA9EV,GA8EU,GAAA,MAAA,CAAA,EA9EK,OA8EL,CAAA,IAAA,CAAA;EAAM;;;;;;AAiBV;AAQhC;;EAA+C,OACnC,CAAA,KAAA,EA7FK,KA6FL,GA7Fa,GA6Fb,GAAA,MAAA,CAAA,EA7F4B,OA6F5B,CAAA,OAAA,CAAA;EAAY;;;;;;;;;;EAQU,gBAC5B,EAAA,EA1FgB,OA0FhB,CAAA,IAAA,CAAA;EAAC;;;AAPwB;AAgB/B;;EAAkD,OACT,CAAA,OAAA,EA3F5B,IA2F4B,CAAA,OAAA,EA3Fd,YA2Fc,CAAA,EAAA,OAAA,CAAA,EA1F3B,qBA0F2B,CA1FL,YA0FK,CAAA,CAAA,EAzFpC,OAyFoC,CAzF5B,iBAyF4B,CAzFV,IAyFU,EAzFJ,YAyFI,CAAA,CAAA;EAAQ;;;AAAT;AAWxC;;;EAWmC,OAMhB,CAAA,UA5GC,YA4GQ,CAAA,CAAA,OAAA,EA3Gf,IA2Ge,CAAA,OAAA,EA3GD,YA2GC,CAAA,EAAA,OAAA,EA1Gf,8BA0Ge,CA1GgB,CA0GhB,EA1GmB,YA0GnB,CAAA,CAAA,EAzGvB,OAyGuB,CAzGf,iBAyGe,CAzGG,CAyGH,EAzGM,YAyGN,CAAA,CAAA;EAAO;;;;;;;mBA/FtB,cAAc,wBACd,kCAAkC,gBAC1C,QAAQ,kBAAkB,UAAU;;;;;;sBAQ3B,0BACT,cAAc,kBAAkB,cAAc;;;;;;UAOlC;;;;+BAIc,IAAA,CAAK;;;;;wBAMZ,QAAQ;;;;yBAKP;;;;;yBAMA,QAAQ,cAAc;;;;;;;UAQ9B,yCACL,oCAEF,sBAAsB;;;;kBAId,UAAU,iBAAiB,UACvC,UAAU,qBAAqB,cAC/B,UAAU,cAAc,OACxB,UAAU,kBAAkB;;;;;;;UASjB,wDACP,+BAA+B,UAAU;;;;;iBAKlC;;;;;UAMA,uBAAA;;;;;;;;;;mBAWE,QAAA,CAAS;;;;;mBAMT,QAAA,CAAS"}
|
package/dist/text.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","names":[],"sources":["../src/text.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"text.d.ts","names":[],"sources":["../src/text.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;UAyCiB;EAAA;;;EAIK,SAOK,IAAA,EAPV,KAOU;EAAY;;;;;EAOsB,OAAG,CAAA,OAAA,EAP7C,OAO6C,CAPrC,YAOqC,CAAA,CAAA,EAPrB,aAOqB,CAAA,MAAA,CAAA;EAAM;;AAS1C;AAS5B;;EAAsB,OAEe,CAAA,OAAA,EApBlB,OAoBkB,CApBV,YAoBU,CAAA,CAAA,EApBM,aAoBN,CApBoB,IAoBpB,GApB2B,QAoB3B,CAAA;EAAY;AAAjC;AAehB;;;;;EAE6C,gBAArC,EAAA,EA5Bc,QA4Bd,EAAA;;;;AAEE;AAiBV;;;AAWuB,iBAjDP,MAiDO,CAAA,YAAA,CAAA,CAAA,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IA/CX,IA+CW,CAAA,OAAA,GAAA,QAAA,EA/Cc,YA+Cd,CAAA;;;;;;;;;AAyDD,iBAzFA,QAyFA,CAAA,YAAA,CAAA,CAAA,OAAA,EAxFX,OAwFW,CAxFH,YAwFG,CAAA,EAAA,IAAA,EAvFd,IAuFc,CAAA,OAAA,GAAA,QAAA,EAvFW,YAuFX,CAAA,EAAA,KAAA,EAtFb,KAsFa,GAtFL,GAsFK,CAAA,EArFnB,OAqFmB,CAAA,OAAA,CAAA;;AAnEL;AAoGjB;;;;AAGG,cAxGU,aAwGV,CAAA,YAAA,CAAA,YAvGU,IAuGV,CAAA,OAAA,EAvGwB,YAuGxB,CAAA,CAAA;EAAI,CAAA,OAAA;EASM,SAAA,IAAS,GAAA,OAAA;EAAA;;;;;EAY0C,WAU1C,CAAA,OAAA,EA5HC,oBA4HD,EAAA,GAAA,MAAA,EAAA,OAAA,EAAA;EAAY,OAApB,CAAA,OAAA,EAjHY,OAiHZ,CAjHoB,YAiHpB,CAAA,CAAA,EAjHoC,aAiHpC,CAAA,MAAA,CAAA;EAAO,OACF,CAAA,OAAA,EA3EO,OA2EP,CA3Ee,YA2Ef,CAAA,CAAA,EA3E+B,aA2E/B,CA3E6C,IA2E7C,GA3EoD,QA2EpD,CAAA;EAAI,gBAAG,CAAA,CAAA,EApEJ,QAoEI,EAAA;;;;AAvB0B;AAyCpD;;;;AAEO;AASP;;;;;;;;;;;;;;;AAgE0B,iBAhIV,IAgIU,CAAA,YAAA,CAAA,CAAA,OAAA,EA/Hf,oBA+He,EAAA,GAAA,MAAA,EAAA,OAAA,EAAA,CAAA,EA7HvB,IA6HuB,CAAA,OAAA,EA7HT,YA6HS,CAAA;;;;;;AAhE4B,cApDzC,SAoDyC,CAAA,YAAA,CAAA,YApDN,IAoDM,CAAA,QAAA,EApDS,YAoDT,CAAA,CAAA;EA2FtC,SAAA,IAAO,GAAA,QAAA;EAAA,SAAA,IAAA,EAAA,MAAA;EAAA;;AAEhB;AAUP;EAAuB,WAAA,CAAA,IAAA,EAAA,MAAA;EAAA,OACd,CAAA,QAAA,EAhJkB,OAgJlB,CAhJ0B,YAgJ1B,CAAA,CAAA,EAhJ0C,aAgJ1C,CAAA,MAAA,CAAA;EAAK,OAAG,CAAA,QAAA,EAtIH,OAsIG,CAtIK,YAsIL,CAAA,CAAA,EArIZ,aAqIY,CArIE,IAqIF,GArIS,QAqIT,CAAA;EAAG,gBACF,CAAA,CAAA,EAnII,QAmIJ,EAAA;;AAAX;AAYP;;;;;;AAGO;AAgFP;;AAAiE,iBAnNjD,SAmNiD,CAAA,YAAA,CAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EAjN9D,IAiN8D,CAAA,QAAA,EAjN/C,YAiN+C,CAAA;;;;;;AAsBD,cA9NnD,WA8NmD,CAAA,YAAA,CAAA,YA9Nd,IA8Nc,CAAA,QAAA,EA9NC,YA8ND,CAAA,CAAA;EAAI,CAAA,OAAG;EAAM,SAA3B,IAAA,GAAA,QAAA;EAAa;;AAtBT;AA4CtD;;EAAuB,WAEL,CAAA,KAAA,EAAA,MAAA,GAAA,CAAA,CAAA,OAAA,EAxOa,OAwOb,CAxOqB,YAwOrB,CAAA,EAAA,GAxOuC,OAwOvC,CAAA,MAAA,CAAA,CAAA,EAAA,KAAA,EAvOP,KAuOO,GAAA,CAAA,CAAA,OAAA,EAvOY,OAuOZ,CAvOoB,YAuOpB,CAAA,EAAA,GAvOsC,OAuOtC,CAvO8C,QAuO9C,GAAA,IAAA,CAAA,CAAA;EAAY,OAA3B,CAAA,OAAA,EAjNuB,OAiNvB,CAjN+B,YAiN/B,CAAA,CAAA,EAjN+C,aAiN/C,CAAA,MAAA,CAAA;EAAI,OAAA,CAAA,OAAA,EAtLmB,OAsLnB,CAtL2B,YAsL3B,CAAA,CAAA,EAtL2C,aAsL3C,CAtLyD,IAsLzD,GAtLgE,QAsLhE,CAAA;EASM,gBAAU,CAAA,CAAA,EApLD,QAoLC,EAAA;;;;;;;;;;;;;AAsBD,iBA1LN,OA0LM,CAAA,YAAA,CAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAxLnB,IAwLmB,CAAA,QAAA,EAxLJ,YAwLI,CAAA;;AAtB+B;AAmCrD;;;;;;AAEO,iBA7LS,OA6LT,CAAA,YAAA,CAAA,CAAA,KAAA,EA5LE,KA4LF,GA5LU,GA4LV,CAAA,EA3LJ,IA2LI,CAAA,QAAA,EA3LW,YA2LX,CAAA;AASP;;;;;;;;;;AAcyD,iBAtMzC,OAsMyC,CAAA,YAAA,CAAA,CAAA,KAAA,EAAA,MAAA,EAAA,KAAA,EApMhD,KAoMgD,GApMxC,GAoMwC,CAAA,EAnMtD,IAmMsD,CAAA,QAAA,EAnMvC,YAmMuC,CAAA;;;;;AAdR;AA+BjC,cApIH,WAoIK,CAAA,YAAA,CAAA,YApIgC,IAoIhC,CAAA,QAAA,EApI+C,YAoI/C,CAAA,CAAA;EAAA,CAAA,OAAA;EAAA,SACK,IAAA,GAAA,QAAA;EAAY;;;AAC5B;EASM,WAAQ,CAAA,GAAA,EAAA,MAAA;EAAA,OAAA,CAAA,OAAA,EAnIK,OAmIL,CAnIa,YAmIb,CAAA,CAAA,EAnI6B,aAmI7B,CAAA,MAAA,CAAA;EAAA,OAAyC,CAAA,OAAA,EAzHpC,OAyHoC,CAzH5B,YAyH4B,CAAA,CAAA,EAzHZ,aAyHY,CAzHE,IAyHF,GAzHS,QAyHT,CAAA;EAAY,gBAWhD,CAAA,CAAA,EAzHJ,QAyHI,EAAA;;;;;;;;AAe+B,iBA7HzC,OA6HyC,CAAA,YAAA,CAAA,CAAA,GAAA,EAAA,MAAA,CAAA,EA3HtD,IA2HsD,CAAA,QAAA,EA3HvC,YA2HuC,CAAA;;;;;AA1BN;AA2CnC,cAnIH,UAmIO,CAAA,YAAA,CAAA,YAnI6B,IAmI7B,CAAA,QAAA,EAnI4C,YAmI5C,CAAA,CAAA;EAAA,CAAA,OAAA;EAAA,SACI,IAAA,GAAA,QAAA;EAAY;;;;EAE7B,WAAA,CAAA,IAAA,EA9Ha,IA8Hb,CAAA,QAAA,EA9H4B,YA8H5B,CAAA,GAAA,MAAA;EASS,OAAI,CAAA,OAAA,EAnIM,OAmIN,CAnIc,YAmId,CAAA,CAAA,EAnI8B,aAmI9B,CAAA,MAAA,CAAA;EAAA,OAAA,CAAA,OAAA,EA7HD,OA6HC,CA7HO,YA6HP,CAAA,CAAA,EA7HuB,aA6HvB,CA7HqC,IA6HrC,GA7H4C,QA6H5C,CAAA;EAAA,gBACb,CAAA,CAAA,EA1He,QA0Hf,EAAA;;;AACA;AAmBP;;;;;;AAY0B,iBA7IV,MA6IU,CAAA,YAAA,CAAA,CAAA,IAAA,EA5IlB,IA4IkB,CAAA,QAAA,EA5IH,YA4IG,CAAA,GAAA,MAAA,CAAA,EA3IvB,IA2IuB,CAAA,QAAA,EA3IR,YA2IQ,CAAA;;;;;;AAMiB,cAxI9B,MAwI8B,CAAA,YAAA,CAAA,YAxIE,IAwIF,CAAA,QAAA,EAxIiB,YAwIjB,CAAA,CAAA;EAAa,CAAA,OAIlC;EAAM,SAtBmB,IAAA,GAAA,QAAA;EAAI,WAAA,CAAA,IAAA,EAlH/B,IAkH+B,CAAA,QAAA,EAlHhB,YAkHgB,CAAA,GAAA,MAAA;EAiCnC,OAAI,CAAA,OAAA,EA/IM,OA+IN,CA/Ic,YA+Id,CAAA,CAAA,EA/I8B,aA+I9B,CAAA,MAAA,CAAA;EAAA,OAAA,CAAA,OAAA,EAzID,OAyIC,CAzIO,YAyIP,CAAA,CAAA,EAzIuB,aAyIvB,CAzIqC,IAyIrC,GAzI4C,QAyI5C,CAAA;EAAA,gBACG,CAAA,CAAA,EAtID,QAsIC,EAAA;;;;AAChB;AAUP;;;;;AAS6B,iBA7Ib,EA6Ia,CAAA,YAAA,CAAA,CAAA,IAAA,EA5IrB,IA4IqB,CAAA,QAAA,EA5IN,YA4IM,CAAA,GAAA,MAAA,CAAA,EA3I1B,IA2I0B,CAAA,QAAA,EA3IX,YA2IW,CAAA;;;;;;AAeqB,cAjJrC,QAiJqC,CAAA,YAAA,CAAA,YAjJH,IAiJG,CAAA,QAAA,EAjJY,YAiJZ,CAAA,CAAA;EAAa,CAAA,OAS1C;EAAY,SAApB,IAAA,GAAA,QAAA;EAAO;;;;;EAhCH,WAAA,CAAA,KAAA,EA/GN,IA+GM,CAAA,QAAA,EA/GS,YA+GT,CAAA,GAAA,MAAA,EAAA,IAAA,EA9GP,GA8GO,GAAA,MAAA;EAkDD,OAAA,CAAA,OAAW,EA1JD,OA0JC,CA1JO,YA0JP,CAAA,CAAA,EA1JuB,aA0JvB,CAAA,MAAA,CAAA;EAAA,OAAA,CAAA,OAAA,EAlJR,OAkJQ,CAlJA,YAkJA,CAAA,CAAA,EAlJgB,aAkJhB,CAlJ8B,IAkJ9B,GAlJqC,QAkJrC,CAAA;EAAA,gBAClB,CAAA,CAAA,EA/Ia,QA+Ib,EAAA;;;;;AACF;AAOP;AAgCA;;;AAawC,iBAvLxB,IAuLwB,CAAA,YAAA,CAAA,CAAA,KAAA,EAtL/B,IAsL+B,CAAA,QAAA,EAtLhB,YAsLgB,CAAA,GAAA,MAAA,EAAA,IAAA,EArLhC,GAqLgC,GAAA,MAAA,CAAA,EApLrC,IAoLqC,CAAA,QAAA,EApLtB,YAoLsB,CAAA;;;;;;;;AAiHU,iBA5RlC,IA4RkC,CAAA,YAAA,CAAA,CAAA,GAAA,EA3R3C,GA2R2C,GAAA,MAAA,CAAA,EA1R/C,IA0R+C,CAAA,QAAA,EA1RhC,YA0RgC,CAAA;;;AA9HK;AAmKvD;;AAEW,cA9SE,QA8SF,CAAA,YAAA,CAAA,YA9SoC,IA8SpC,CAAA,QAAA,EA9SmD,YA8SnD,CAAA,CAAA;EAAwB,CAAA,OAClB;EAAY,SAA1B,IAAA,GAAA,QAAA;EAAI;;;;oBAvSa,eAAe;mBAIT,QAAQ,gBAAgB;mBAM/B,QAAQ,gBAAgB,cAAc,OAAO;sBAI1C;;;;;;;;iBAWN,yBACR,eAAe,yBACpB,eAAe;;;;;;;cAUL,yCACA,eAAe;;;;;;;qBAQP,QAAQ,oBAAoB;;;;;;;oBAU7B,QAAQ,gBAAgB;mBAKlB,QAAQ,gBAAgB;mBASrC,QAAQ,gBAChB,cAAc,OAAO;sBAIJ;;;;;;;;;;iBAaN,iCACP,QAAQ,oBAAoB,gBAClC,eAAe;;;;UAOD,mBAAA;;;;;;;;;;;;;;;;;;;;;cAgCJ,sCAAsC,cAAc;;;;;;;;yCAazB;mBAoFd,QAAQ,gBAAgB;mBA6BxB,QAAQ,gBAAgB,cAAc,OAAO;sBAuBjD;;;;;;;;;;;iBAcN,kDAEL,sBACR,cAAc"}
|
package/dist/text.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { Temporal, toTemporalInstant } from "@js-temporal/polyfill";
|
|
3
3
|
Date.prototype.toTemporalInstant = toTemporalInstant;
|
|
4
4
|
|
|
5
|
+
import { SessionImpl } from "./session-impl.js";
|
|
5
6
|
import { Emoji, Hashtag, Link, Mention, getActorHandle, isActor } from "@fedify/vocab";
|
|
6
7
|
import { encode } from "html-entities";
|
|
7
8
|
import { hashtag as hashtag$1 } from "@fedify/markdown-it-hashtag";
|
|
@@ -247,22 +248,35 @@ var MentionText = class {
|
|
|
247
248
|
function mention(a, b) {
|
|
248
249
|
if (b != null) return new MentionText(a, isActor(b) ? b : async (session) => {
|
|
249
250
|
if (session.actorId.href === b.href) return await session.getActor();
|
|
250
|
-
const documentLoader = await session.context.getDocumentLoader(session.bot);
|
|
251
|
+
const documentLoader = await session.context.getDocumentLoader({ identifier: session.bot.identifier });
|
|
251
252
|
return await session.context.lookupObject(b, { documentLoader });
|
|
252
253
|
});
|
|
253
254
|
else if (typeof a === "string") return new MentionText(a, async (session) => {
|
|
254
255
|
if (session.actorHandle === a) return await session.getActor();
|
|
255
|
-
const documentLoader = await session.context.getDocumentLoader(session.bot);
|
|
256
|
+
const documentLoader = await session.context.getDocumentLoader({ identifier: session.bot.identifier });
|
|
256
257
|
return await session.context.lookupObject(a, { documentLoader });
|
|
257
258
|
});
|
|
258
259
|
else if (isActor(a)) return new MentionText((session) => a.id?.href === session.actorId.href ? Promise.resolve(session.actorHandle) : getActorHandle(a, session.context), a);
|
|
259
260
|
return new MentionText((session) => a.href === session.actorId.href ? Promise.resolve(session.actorHandle) : getActorHandle(a, session.context), async (session) => {
|
|
260
261
|
if (a.href === session.actorId.href) return await session.getActor();
|
|
261
|
-
const documentLoader = await session.context.getDocumentLoader(session.bot);
|
|
262
|
+
const documentLoader = await session.context.getDocumentLoader({ identifier: session.bot.identifier });
|
|
262
263
|
return await session.context.lookupObject(a, { documentLoader });
|
|
263
264
|
});
|
|
264
265
|
}
|
|
265
266
|
/**
|
|
267
|
+
* The base URL (without a trailing slash) under which the hashtag pages of
|
|
268
|
+
* the session's bot live: the origin itself on a single-bot instance, and
|
|
269
|
+
* the bot's own web path (e.g. `https://host/@username`) on a multi-bot
|
|
270
|
+
* instance, where the root `/tags/` path is not served.
|
|
271
|
+
*/
|
|
272
|
+
function getHashtagPageBase(session) {
|
|
273
|
+
if (session instanceof SessionImpl) {
|
|
274
|
+
const url = session.bot.instance.getBotWebUrl(session.bot, session.context.origin);
|
|
275
|
+
return url.href.replace(/\/+$/, "");
|
|
276
|
+
}
|
|
277
|
+
return session.context.origin;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
266
280
|
* A text tree that renders a hashtag. You normally don't need to
|
|
267
281
|
* instantiate this directly; use the {@link hashtag} function instead.
|
|
268
282
|
* @typeParam TContextData The type of the context data.
|
|
@@ -279,7 +293,7 @@ var HashtagText = class {
|
|
|
279
293
|
}
|
|
280
294
|
async *getHtml(session) {
|
|
281
295
|
yield "<a href=\"";
|
|
282
|
-
yield encode(session
|
|
296
|
+
yield encode(getHashtagPageBase(session));
|
|
283
297
|
yield "/tags/";
|
|
284
298
|
yield encode(encodeURIComponent(this.#tag.toLowerCase()));
|
|
285
299
|
yield "\" class=\"mention hashtag\" rel=\"tag\" target=\"_blank\">#<span>";
|
|
@@ -288,7 +302,7 @@ var HashtagText = class {
|
|
|
288
302
|
}
|
|
289
303
|
async *getTags(session) {
|
|
290
304
|
yield new Hashtag({
|
|
291
|
-
href: new URL(
|
|
305
|
+
href: new URL(`${getHashtagPageBase(session)}/tags/${encodeURIComponent(this.#tag.toLowerCase())}`),
|
|
292
306
|
name: `#${this.#tag.toLowerCase()}`
|
|
293
307
|
});
|
|
294
308
|
}
|
|
@@ -539,7 +553,8 @@ var MarkdownText = class {
|
|
|
539
553
|
const env = {
|
|
540
554
|
mentions: [],
|
|
541
555
|
hashtags: [],
|
|
542
|
-
origin: "http://localhost"
|
|
556
|
+
origin: "http://localhost",
|
|
557
|
+
tagBase: "http://localhost"
|
|
543
558
|
};
|
|
544
559
|
md.render(content, env);
|
|
545
560
|
this.#mentions = env.mentions;
|
|
@@ -548,7 +563,7 @@ var MarkdownText = class {
|
|
|
548
563
|
md.use(hashtag$1, {
|
|
549
564
|
link(hashtag$2, env$1) {
|
|
550
565
|
const tag = hashtag$2.substring(1).toLowerCase();
|
|
551
|
-
return
|
|
566
|
+
return `${env$1.tagBase}/tags/${encodeURIComponent(tag)}`;
|
|
552
567
|
},
|
|
553
568
|
linkAttributes(_hashtag, _env) {
|
|
554
569
|
return {
|
|
@@ -565,7 +580,8 @@ var MarkdownText = class {
|
|
|
565
580
|
const env = {
|
|
566
581
|
mentions: [],
|
|
567
582
|
hashtags: [],
|
|
568
|
-
origin: "http://localhost"
|
|
583
|
+
origin: "http://localhost",
|
|
584
|
+
tagBase: "http://localhost"
|
|
569
585
|
};
|
|
570
586
|
md.render(content, env);
|
|
571
587
|
this.#hashtags = env.hashtags;
|
|
@@ -575,7 +591,7 @@ var MarkdownText = class {
|
|
|
575
591
|
async #getMentionedActors(session) {
|
|
576
592
|
if (this.#mentions == null) return {};
|
|
577
593
|
if (this.#actors != null) return this.#actors;
|
|
578
|
-
const documentLoader = await session.context.getDocumentLoader(session.bot);
|
|
594
|
+
const documentLoader = await session.context.getDocumentLoader({ identifier: session.bot.identifier });
|
|
579
595
|
const objects = await Promise.all(this.#mentions.map((m) => m === session.actorHandle ? session.getActor() : session.context.lookupObject(m, { documentLoader })));
|
|
580
596
|
const actors = {};
|
|
581
597
|
for (let i = 0; i < this.#mentions.length; i++) {
|
|
@@ -595,6 +611,7 @@ var MarkdownText = class {
|
|
|
595
611
|
mentions: [],
|
|
596
612
|
hashtags: [],
|
|
597
613
|
origin: session.context.origin,
|
|
614
|
+
tagBase: getHashtagPageBase(session),
|
|
598
615
|
actors
|
|
599
616
|
};
|
|
600
617
|
yield this.#markdownIt.render(this.#content, env);
|
|
@@ -613,7 +630,7 @@ var MarkdownText = class {
|
|
|
613
630
|
const tag = hashtag$2.substring(1).toLowerCase();
|
|
614
631
|
yield new Hashtag({
|
|
615
632
|
name: `#${tag}`,
|
|
616
|
-
href: new URL(
|
|
633
|
+
href: new URL(`${getHashtagPageBase(session)}/tags/${encodeURIComponent(tag)}`)
|
|
617
634
|
});
|
|
618
635
|
}
|
|
619
636
|
}
|