@fedify/botkit 0.3.0-dev.115 → 0.3.0-dev.119

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.
@@ -1 +1 @@
1
- {"version":3,"file":"bot-impl.d.ts","names":[],"sources":["../src/bot-impl.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;UAqGiB,qCACP,iBAAiB;;;cAId,iCAAiC,IAAI;;;EALjC,SAAA,KAAA,EAAA,OAOQ,OAPM,GAAA,OAOW,WAPX;EAAA,SAAA,QAAA,EAAA,MAAA;EAAA,SACJ,IAAA,CAAA,EAAA,MAAA;EAAY,SAA7B,OAAA,CAAA,EASW,IATX,CAAA,OAAA,EASyB,YATzB,CAAA;EAAgB,SAAA,IAAA,CAAA,EAWR,GAXQ,GAWF,KAXE;EAIb,SAAA,KAAO,CAAA,EAQD,GARC,GAQK,KARL;EAAA,SAAA,UAAA,EASG,MATH,CAAA,MAAA,EASkB,IATlB,CAAA,OAAA,GAAA,QAAA,EAS2C,YAT3C,CAAA,CAAA;EAAA,SAA8B,cAAA,EAAA,QAAA,GAAA,QAAA,GAAA,QAAA;EAAY,SAErC,YAAA,EAUA,MAVA,CAAA,MAAA,EAUe,WAVf,CAAA;EAAO,SAAU,UAAA,EAWnB,UAXmB;EAAW,SAGlB,QAAA,CAAA,EASb,QATa;EAAY,SAA1B,WAAA,EAAA,OAAA;EAAI,SAEP,KAAA,EASA,QATA,CASS,YATT,CAAA;EAAG,SAAG,gBAAA,EAAA,MAAA;EAAK,SACV,UAAA,EAUI,UAVJ,CAUe,YAVf,CAAA;EAAG,QAAG,CAAA,EAYZ,kBAZY,CAYO,YAZP,CAAA;EAAK,UACiC,CAAA,EAYhD,oBAZgD,CAY3B,YAZ2B,CAAA;EAAY,cAArC,CAAA,EAanB,kBAbmB,CAaA,YAbA,CAAA;EAAI,cAAnB,CAAA,EAcJ,kBAdI,CAce,YAdf,CAAA;EAAM,SAGW,CAAA,EAY1B,mBAZ0B,CAYN,YAZM,CAAA;EAAW,OAA1B,CAAA,EAab,iBAba,CAaK,YAbL,CAAA;EAAM,OACR,CAAA,EAaX,iBAbW,CAaO,YAbP,CAAA;EAAU,SACX,CAAA,EAaR,mBAbQ,CAaY,YAbZ,CAAA;EAAQ,eAEH,CAAA,EAYP,yBAZO,CAYmB,YAZnB,CAAA;EAAY,MAArB,CAAA,EAaP,gBAbO,CAaU,YAbV,CAAA;EAAQ,QAEQ,CAAA,EAYrB,kBAZqB,CAYF,YAZE,CAAA;EAAY,OAAvB,CAAA,EAaX,oBAbW,CAaU,YAbV,CAAA;EAAU,SAED,CAAA,EAYlB,0BAZkB,CAYS,YAZT,CAAA;EAAY,MAA/B,CAAA,EAaF,gBAbE,CAae,YAbf,CAAA;EAAkB,WACK,CAAA,OAAA,EAcb,cAda,CAcE,YAdF,CAAA;EAAY,UAAjC,CAAA,CAAA,EAAA,IAAA;EAAoB,eACG,CAAA,OAAA,EA2IzB,OA3IyB,CA2IjB,YA3IiB,CAAA,CAAA,EA4IjC,OA5IiC,CAAA;IAAnB,IAAA,EAAA,MAAA;IACmB,IAAA,EAAA,CA2IF,IA3IE,GA2IK,QA3IL,CAAA,EAAA;EAAY,CAAA,GAA/B,IAAA,CAAA;EAAkB,kBACH,CAAA,OAAA,EA2JrB,OA3JqB,CA2Jb,YA3Ja,CAAA,CAAA,EA4J7B,OA5J6B,CAAA;IAApB,KAAA,EA4JQ,aA5JR,EAAA;IACgB,IAAA,EAAA,CA2JgB,IA3JhB,GA2JuB,QA3JvB,CAAA,EAAA;EAAY,CAAA,CAAA;EAAb,aACC,CAAA,GAAA,EA6KrB,OA7KqB,CA6Kb,YA7Ka,CAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EA+KzB,OA/KyB,CA+KjB,KA/KiB,GAAA,IAAA,CAAA;EAAY,SAA9B,CAAA,IAAA,EA0NM,OA1NN,CA0Nc,YA1Nd,CAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAiB,qBACK,CAAA,IAAA,EA8NxB,OA9NwB,CA8NhB,YA9NgB,CAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAgO7B,OAhO6B,CAgOrB,aAhOqB,EAAA,CAAA;EAAY,iBAAhC,CAAA,IAAA,EA6OJ,OA7OI,CA6OI,YA7OJ,CAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAgPT,OAhPS,CAgPD,SAhPC,CAgPS,WAhPT,CAAA,GAAA,IAAA,CAAA;EAAmB,uBACa,CAAA,IAAA,EAyQpC,OAzQoC,CAyQ5B,YAzQ4B,CAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAY,cAAtC,CAAA,IAAA,EAiRV,OAjRU,CAiRF,YAjRE,CAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAmRf,OAnRe,CAAA,MAAA,GAAA,IAAA,CAAA;EAAyB,oBACjB,CAAA,GAAA,EAwRnB,cAxRmB,CAwRJ,YAxRI,CAAA,CAAA,EAyRvB,OAzRuB,CAAA,CAAA,MAAA,EAyRN,QAzRM,EAAA,GAAA,OAAA,CAAA;EAAY,cAA7B,CAAA,GAAA,EA+SF,cA/SE,CA+Sa,YA/Sb,CAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,GAAA,IAAA,CAAA,EAkTN,OAlTM,CAkTE,SAlTF,CAkTY,QAlTZ,CAAA,GAAA,IAAA,CAAA;EAAgB,oBACK,CAAA,IAAA,EA2UtB,OA3UsB,CA2Ud,YA3Uc,CAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAAY,WAA/B,CAAA,IAAA,EAmVH,OAnVG,CAmVK,YAnVL,CAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAqVR,OArVQ,CAAA,MAAA,GAAA,IAAA,CAAA;EAAkB,cACE,CAAA,IAAA,EA0VvB,cA1VuB,CA0VR,YA1VQ,CAAA,EAAA,MAAA,EAAA;IAArB,EAAA,EAAA,MAAA;EAAoB,CAAA,CAAA,EA4V3B,OA3VoC,CA2V5B,MA3V4B,GAAA,IAAA,CAAA;EAAY,eAAvC,CAAA,IAAA,EAkWJ,cAlWI,CAkWW,YAlWX,CAAA,EAAA,MAAA,EAAA;IACc,EAAA,EAAA,MAAA;EAAY,CAAA,EAA7B,UAAA,EAmWK,gBAnWL,GAAA,IAAA,EAAA,cAAA,EAoWS,KApWT,GAAA,IAAA,CAAA,EAqWN,OArWM,CAAA,OAAA,CAAA;EAAgB,cAEW,CAAA,GAAA,EA6W7B,cA7W6B,CA6Wd,YA7Wc,CAAA,EAAA,MAAA,EAAA;IAAf,EAAA,EAAA,MAAA;EAAc,CAAA,CAAA,EA+WhC,OAjPgB,CAiPR,MAjPQ,GAAA,IAAA,CAAA;EAAY,eAApB,CAAA,UAwPqB,YAxPrB,CAAA,CAAA,GAAA,EAAA,KAAA,MAAA,EAAA,GAAA,EAAA,GA0PiB,CA1PjB,EAAA,GAAA,EA2PJ,OA3PI,CA2PI,YA3PJ,CAAA,GA2PoB,cA3PpB,CA2PmC,YA3PnC,CAAA,EAAA,EAAA,EAAA,MAAA,CAAA,EA6PR,OA7PQ,CA6PA,CA7PA,GAAA,IAAA,CAAA;EAAO,gBACgB,CAAA,GAAA,EA0Q3B,cA1Q2B,CA0QZ,YA1QY,CAAA,EAAA,MAAA,EAAA;IAAO,EAAA,EAAA,MAAA;EAAM,CAAA,CAAA,EA4Q5C,OA5QA,CA4QQ,QA5QR,GAAA,IAAA,CAAA;EAAO,aAiBS,CAAA,GAAA,EAmQZ,OAnQY,CAmQJ,YAnQI,CAAA,EAAA,MAAA,EAAA;IAAR,IAAA,EAAA,MAAA;EAAO,CAAA,CAAA,EAqQf,KApQiB,GAAA,IAAA;EAAa,iBAAW,CAAA,IAAA,EA0QpB,OA1QoB,CA0QZ,YA1QY,CAAA,CAAA,EAAA;IAAO,UAAA,EAAA,MAAA;EAAM,CAAA;EAA/C,UAmBK,CAAA,GAAA,EA4PR,YA5PQ,CA4PK,YA5PL,CAAA,EAAA,MAAA,EA6PL,MA7PK,CAAA,EA8PZ,OA9PY,CAAA,IAAA,CAAA;EAAY,YAApB,CAAA,GAAA,EA0RA,YA1RA,CA0Ra,YA1Rb,CAAA,EAAA,IAAA,EA2RC,IA3RD,CAAA,EA4RJ,OA5RI,CAAA,IAAA,CAAA;EAAO,gBAEH,CAAA,GAAA,EAwSJ,YAxSI,CAwSS,YAxST,CAAA,EAAA,MAAA,EAySD,MAzSC,CAAA,EA0SR,OA1SQ,CAAA,IAAA,CAAA;EAAK,gBAAb,CAAA,GAAA,EAgUI,YAhUJ,CAgUiB,YAhUjB,CAAA,EAAA,MAAA,EAiUO,MAjUP,CAAA,EAkUA,OAlUA,CAAA,IAAA,CAAA;EAAO,SA2Cc,CAAA,GAAA,EA4SjB,YA5SiB,CA4SJ,YA5SI,CAAA,EAAA,MAAA,EA6Sd,MA7Sc,CAAA,EA8SrB,OA9SqB,CAAA,IAAA,CAAA;EAAY,WAApB,CAAA,GAAA,EAofT,YApfS,CAofI,YApfJ,CAAA,EAAA,QAAA,EAqfJ,QArfI,CAAA,EAsfb,OAtfa,CAAA,IAAA,CAAA;EAAO,OAKP,CAAA,GAAA,EAwjBG,YAxjBH,CAwjBgB,YAxjBhB,CAAA,EAAA,IAAA,EAwjBqC,IAxjBrC,CAAA,EAwjB+C,OAxjB/C,CAAA,IAAA,CAAA;EAAY,SAApB,CAAA,GAAA,EAikBa,YAjkBb,CAikB0B,YAjkB1B,CAAA,EAAA,IAAA,EAikB+C,IAjkB/C,CAAA,EAikBsD,OAjkBtD,CAAA,IAAA,CAAA;EAAO,SAEJ,CAAA,GAAA,EAooBJ,YApoBI,CAooBS,YApoBT,CAAA,EAAA,KAAA,EAqoBF,UAroBE,GAqoBW,IAroBX,CAAA,EAsoBR,OAtoBQ,CAAA,IAAA,CAAA;EAAa,WAArB,CAAA,GAAA,EA+oBI,YA/oBJ,CA+oBiB,YA/oBjB,CAAA,EAAA,IAAA,EAgpBK,IAhpBL,CAAA,EAipBA,OAjpBA,CAAA,IAAA,CAAA;EAAO,gBAaM,CAAA,IAAA,EA+oBO,OA/oBP,CA+oBe,YA/oBf,CAAA,CAAA,EA+oB+B,QA/oB/B;EAAY,UAApB,CAAA,MAAA,EAAA,MAAA,GAmqBW,GAnqBX,EAAA,WAAA,EAoqBO,YApqBP,CAAA,EAqqBL,WArqBK,CAqqBO,YArqBP,CAAA;EAAO,UAGM,CAAA,MAAA,EAAA,MAAA,GAmqBO,GAnqBP,CAAA,EAmqBa,WAnqBb,CAmqByB,YAnqBzB,CAAA;EAAS,UAAnB,CAAA,OAAA,EAoqBS,OApqBT,CAoqBiB,YApqBjB,CAAA,CAAA,EAoqBiC,WApqBjC,CAoqB6C,YApqB7C,CAAA;EAAS,KAAjB,CAAA,OAAA,EAgrBkB,OAhrBlB,EAAA,WAAA,EAgrBwC,YAhrBxC,CAAA,EAgrBuD,OAhrBvD,CAgrB+D,QAhrB/D,CAAA;EAAO,QA0BM,CAAA,GAAA,EAqsBT,OArsBS,CAqsBD,YArsBC,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAusBR,WAvsBQ,CAAA,EAwsBb,KAxsBa;EAAY,cAApB,CAAA,mBAAA,MAAA,CAAA,CAAA,IAAA,EAmuBA,UAnuBA,EAAA,IAAA,EAouBA,WApuBA,CAAA,EAquBL,mBAruBK,CAquBe,YAruBf,CAAA;EAAO,eAQC,CAAA,mBAAA,MAAA,CAAA,CAAA,MAAA,EAivBN,QAjvBM,CAivBG,MAjvBH,CAivBU,UAjvBV,EAivBsB,WAjvBtB,CAAA,CAAA,CAAA,EAkvBb,QAlvBa,CAkvBJ,MAlvBI,CAkvBG,UAlvBH,EAkvBe,mBAlvBf,CAkvBmC,YAlvBnC,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"bot-impl.d.ts","names":[],"sources":["../src/bot-impl.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/bot-impl.js CHANGED
@@ -372,10 +372,12 @@ var BotImpl = class {
372
372
  };
373
373
  const replyTarget = ctx.parseUri(object.replyTargetId);
374
374
  if (this.onVote != null && object instanceof Note && replyTarget?.type === "object" && messageClasses.includes(replyTarget.class) && object.name != null) {
375
- if (create.actorId?.href === session.actorId.href) return;
375
+ if (create.actorId == null || create.actorId.href === session.actorId.href) return;
376
+ const actorId = create.actorId;
376
377
  const actor = await create.getActor(ctx);
377
378
  if (actor == null) return;
378
- const pollMessage = await this.repository.getMessage(replyTarget.values.id);
379
+ const messageId = replyTarget.values.id;
380
+ const pollMessage = await this.repository.getMessage(messageId);
379
381
  if (!(pollMessage instanceof Create)) return;
380
382
  const question = await pollMessage.getObject(ctx);
381
383
  if (!(question instanceof Question) || question.endTime == null || Temporal.Instant.compare(question.endTime, Temporal.Now.instant()) < 0) return;
@@ -394,21 +396,27 @@ var BotImpl = class {
394
396
  }
395
397
  const option = object.name.toString();
396
398
  if (!options.includes(option)) return;
397
- const updatedOptionNotes = [...optionNotes];
398
- let i = 0;
399
- for (const note of updatedOptionNotes) {
400
- if (note.name === option) {
401
- const replies = await note.getReplies(ctx);
402
- if (replies != null && replies.totalItems != null) updatedOptionNotes[i] = note.clone({ replies: replies.clone({ totalItems: replies.totalItems + 1 }) });
399
+ let updatedQuestion = question;
400
+ let updatedPollMessage = pollMessage;
401
+ await this.repository.vote(messageId, actorId, option);
402
+ await this.repository.updateMessage(replyTarget.values.id, async () => {
403
+ const votes = await this.repository.countVotes(messageId);
404
+ const updatedOptionNotes = [...optionNotes];
405
+ let i = 0;
406
+ for (const note of updatedOptionNotes) {
407
+ if (note.name != null) {
408
+ const replies = await note.getReplies(ctx);
409
+ if (replies != null && replies.totalItems != null) updatedOptionNotes[i] = note.clone({ replies: replies.clone({ totalItems: votes[note.name.toString()] }) });
410
+ }
411
+ i++;
403
412
  }
404
- i++;
405
- }
406
- const updatedQuestion = question.clone({
407
- inclusiveOptions: multiple ? updatedOptionNotes : [],
408
- exclusiveOptions: !multiple ? updatedOptionNotes : []
413
+ updatedQuestion = question.clone({
414
+ inclusiveOptions: multiple ? updatedOptionNotes : [],
415
+ exclusiveOptions: !multiple ? updatedOptionNotes : [],
416
+ voters: await this.repository.countVoters(messageId)
417
+ });
418
+ return updatedPollMessage = pollMessage.clone({ object: updatedQuestion });
409
419
  });
410
- const updatedPollMessage = pollMessage.clone({ object: updatedQuestion });
411
- await this.repository.updateMessage(replyTarget.values.id, () => updatedPollMessage);
412
420
  const message = await createMessage(updatedQuestion, session, {});
413
421
  const vote = {
414
422
  raw: object,
@@ -1 +1 @@
1
- {"version":3,"file":"bot-impl.js","names":["options: BotImplOptions<TContextData>","#summary","#properties","metadata","APEmoji","RawLike","session: Session<TContextData>","tags: (Link | Object)[]","pairs: PropertyValue[]","ctx: Context<TContextData>","identifier: string","Object","_ctx: Context<TContextData>","username: string","cursor: string | null","followers: AsyncIterable<Actor>","nextCursor: string | null","items: Recipient[]","ctx: RequestContext<TContextData>","owner: Actor | null","object: Object","items: Activity[]","nextPublished: Temporal.Instant | null","_ctx: RequestContext<TContextData>","values: { id: string }","_signedKey: CryptographicKey | null","signedKeyOwner: Actor | null","cls: new (values: any) => T","ctx: Context<TContextData> | RequestContext<TContextData>","id: string","values: { name: string }","ctx: InboxContext<TContextData>","follow: Follow","undo: Undo","accept: Accept","reject: Reject","create: Create","messageCache: Message<MessageClass, TContextData> | null","optionNotes: Note[]","options: string[]","updatedOptionNotes: Note[]","vote: Vote<TContextData>","Update","quoteUrl: URL | null","announce: Announce","object: Object | null","sharedMessage: SharedMessage<MessageClass, TContextData>","#parseLike","like: RawLike","#parseReaction","react: EmojiReact | RawLike","emoji: Emoji | APEmoji | undefined","origin: string | URL | Context<TContextData>","contextData?: TContextData","request: Request","contextData: TContextData","file: fs.FileHandle","name: string","data: CustomEmoji","url: URL","name: TEmojiName","emojis: Readonly<Record<TEmojiName, CustomEmoji>>"],"sources":["../src/bot-impl.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 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 Context,\n createFederation,\n type Federation,\n generateCryptoKeyPair,\n type InboxContext,\n type NodeInfo,\n Object,\n type PageItems,\n type Recipient,\n type RequestContext,\n type Software,\n Update,\n} from \"@fedify/fedify\";\nimport {\n Accept,\n type Activity,\n type Actor,\n Announce,\n type Application,\n Article,\n ChatMessage,\n Create,\n type CryptographicKey,\n Emoji as APEmoji,\n EmojiReact,\n Endpoints,\n Follow,\n Image,\n isActor,\n Like as RawLike,\n Link,\n Mention,\n Note,\n PropertyValue,\n PUBLIC_COLLECTION,\n Question,\n Reject,\n Service,\n Undo,\n} from \"@fedify/fedify/vocab\";\nimport { getLogger } from \"@logtape/logtape\";\nimport mimeDb from \"mime-db\";\nimport fs from \"node:fs/promises\";\nimport { getXForwardedRequest } from \"x-forwarded-fetch\";\nimport metadata from \"../deno.json\" with { type: \"json\" };\nimport type { Bot, CreateBotOptions, PagesOptions } from \"./bot.ts\";\nimport {\n type CustomEmoji,\n type DeferredCustomEmoji,\n type Emoji,\n isEmoji,\n} from \"./emoji.ts\";\nimport type {\n AcceptEventHandler,\n FollowEventHandler,\n LikeEventHandler,\n MentionEventHandler,\n MessageEventHandler,\n QuoteEventHandler,\n ReactionEventHandler,\n RejectEventHandler,\n ReplyEventHandler,\n SharedMessageEventHandler,\n UndoneReactionEventHandler,\n UnfollowEventHandler,\n UnlikeEventHandler,\n VoteEventHandler,\n} from \"./events.ts\";\nimport { FollowRequestImpl } from \"./follow-impl.ts\";\nimport {\n createMessage,\n getMessageVisibility,\n isMessageObject,\n isQuoteLink,\n messageClasses,\n} from \"./message-impl.ts\";\nimport type { Message, MessageClass, SharedMessage } from \"./message.ts\";\nimport { app } from \"./pages.tsx\";\nimport type { Vote } from \"./poll.ts\";\nimport type { Like, Reaction } from \"./reaction.ts\";\nimport { KvRepository, type Repository, type Uuid } from \"./repository.ts\";\nimport { SessionImpl } from \"./session-impl.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { Text } from \"./text.ts\";\n\nexport interface BotImplOptions<TContextData>\n extends CreateBotOptions<TContextData> {\n collectionWindow?: number;\n}\n\nexport class BotImpl<TContextData> implements Bot<TContextData> {\n readonly identifier: string;\n readonly class: typeof Service | typeof Application;\n readonly username: string;\n readonly name?: string;\n readonly summary?: Text<\"block\", TContextData>;\n #summary: { text: string; tags: (Link | Object)[] } | null;\n readonly icon?: URL | Image;\n readonly image?: URL | Image;\n readonly properties: Record<string, Text<\"block\" | \"inline\", TContextData>>;\n #properties: { pairs: PropertyValue[]; tags: (Link | Object)[] } | null;\n readonly followerPolicy: \"accept\" | \"reject\" | \"manual\";\n readonly customEmojis: Record<string, CustomEmoji>;\n readonly repository: Repository;\n readonly software?: Software;\n readonly behindProxy: boolean;\n readonly pages: Required<PagesOptions>;\n readonly collectionWindow: number;\n readonly federation: Federation<TContextData>;\n\n onFollow?: FollowEventHandler<TContextData>;\n onUnfollow?: UnfollowEventHandler<TContextData>;\n onAcceptFollow?: AcceptEventHandler<TContextData>;\n onRejectFollow?: RejectEventHandler<TContextData>;\n onMention?: MentionEventHandler<TContextData>;\n onReply?: ReplyEventHandler<TContextData>;\n onQuote?: QuoteEventHandler<TContextData>;\n onMessage?: MessageEventHandler<TContextData>;\n onSharedMessage?: SharedMessageEventHandler<TContextData>;\n onLike?: LikeEventHandler<TContextData>;\n onUnlike?: UnlikeEventHandler<TContextData>;\n onReact?: ReactionEventHandler<TContextData>;\n onUnreact?: UndoneReactionEventHandler<TContextData>;\n onVote?: VoteEventHandler<TContextData>;\n\n constructor(options: BotImplOptions<TContextData>) {\n this.identifier = options.identifier ?? \"bot\";\n this.class = options.class ?? Service;\n this.username = options.username;\n this.name = options.name;\n this.summary = options.summary;\n this.#summary = null;\n this.icon = options.icon;\n this.image = options.image;\n this.properties = options.properties ?? {};\n this.#properties = null;\n this.followerPolicy = options.followerPolicy ?? \"accept\";\n this.customEmojis = {};\n this.repository = options.repository ?? new KvRepository(options.kv);\n this.software = options.software;\n this.pages = {\n color: \"green\",\n css: \"\",\n ...(options.pages ?? {}),\n };\n this.federation = createFederation<TContextData>({\n kv: options.kv,\n queue: options.queue,\n userAgent: {\n software: `BotKit/${metadata.version}`,\n },\n });\n this.behindProxy = options.behindProxy ?? false;\n this.collectionWindow = options.collectionWindow ?? 50;\n this.initialize();\n }\n\n initialize(): void {\n this.federation\n .setActorDispatcher(\n \"/ap/actor/{identifier}\",\n this.dispatchActor.bind(this),\n )\n .mapHandle(this.mapHandle.bind(this))\n .setKeyPairsDispatcher(this.dispatchActorKeyPairs.bind(this));\n this.federation\n .setFollowersDispatcher(\n \"/ap/actor/{identifier}/followers\",\n this.dispatchFollowers.bind(this),\n )\n .setFirstCursor(this.getFollowersFirstCursor.bind(this))\n .setCounter(this.countFollowers.bind(this));\n this.federation\n .setOutboxDispatcher(\n \"/ap/actor/{identifier}/outbox\",\n this.dispatchOutbox.bind(this),\n )\n .setFirstCursor(this.getOutboxFirstCursor.bind(this))\n .setCounter(this.countOutbox.bind(this));\n this.federation\n .setObjectDispatcher(\n Follow,\n \"/ap/follow/{id}\",\n this.dispatchFollow.bind(this),\n )\n .authorize(this.authorizeFollow.bind(this));\n this.federation.setObjectDispatcher(\n Create,\n \"/ap/create/{id}\",\n this.dispatchCreate.bind(this),\n );\n this.federation.setObjectDispatcher(\n Article,\n \"/ap/article/{id}\",\n (ctx, values) => this.dispatchMessage(Article, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n ChatMessage,\n \"/ap/chat-message/{id}\",\n (ctx, values) => this.dispatchMessage(ChatMessage, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n Note,\n \"/ap/note/{id}\",\n (ctx, values) => this.dispatchMessage(Note, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n Question,\n \"/ap/question/{id}\",\n (ctx, values) => this.dispatchMessage(Question, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n Announce,\n \"/ap/announce/{id}\",\n this.dispatchAnnounce.bind(this),\n );\n this.federation.setObjectDispatcher(\n APEmoji,\n \"/ap/emoji/{name}\",\n this.dispatchEmoji.bind(this),\n );\n this.federation\n .setInboxListeners(\"/ap/actor/{identifier}/inbox\", \"/ap/inbox\")\n .on(Follow, this.onFollowed.bind(this))\n .on(Undo, async (ctx, undo) => {\n const object = await undo.getObject(ctx);\n if (object instanceof Follow) await this.onUnfollowed(ctx, undo);\n else if (object instanceof RawLike) await this.onUnliked(ctx, undo);\n else {\n const logger = getLogger([\"botkit\", \"bot\", \"inbox\"]);\n logger.warn(\n \"The Undo object {undoId} is not about Follow or Like: {object}.\",\n { undoId: undo.id?.href, object },\n );\n }\n })\n .on(Accept, this.onFollowAccepted.bind(this))\n .on(Reject, this.onFollowRejected.bind(this))\n .on(Create, this.onCreated.bind(this))\n .on(Announce, this.onAnnounced.bind(this))\n .on(RawLike, this.onLiked.bind(this))\n .setSharedKeyDispatcher(this.dispatchSharedKey.bind(this));\n if (this.software != null) {\n this.federation.setNodeInfoDispatcher(\n \"/nodeinfo/2.1\",\n this.dispatchNodeInfo.bind(this),\n );\n }\n }\n\n async getActorSummary(\n session: Session<TContextData>,\n ): Promise<{ text: string; tags: (Link | Object)[] } | null> {\n if (this.summary == null) return null;\n if (this.#summary == null) {\n let summary = \"\";\n const tags: (Link | Object)[] = [];\n for await (const chunk of this.summary.getHtml(session)) {\n summary += chunk;\n }\n for await (const tag of this.summary.getTags(session)) {\n tags.push(tag);\n }\n return this.#summary = { text: summary, tags };\n }\n return this.#summary;\n }\n\n async getActorProperties(\n session: Session<TContextData>,\n ): Promise<{ pairs: PropertyValue[]; tags: (Link | Object)[] }> {\n if (this.#properties != null) return this.#properties;\n const pairs: PropertyValue[] = [];\n const tags: (Link | Object)[] = [];\n for (const name in this.properties) {\n const value = this.properties[name];\n const pair = new PropertyValue({\n name,\n value: (await Array.fromAsync(value.getHtml(session))).join(\"\"),\n });\n pairs.push(pair);\n for await (const tag of value.getTags(session)) {\n tags.push(tag);\n }\n }\n return this.#properties = { pairs, tags };\n }\n\n async dispatchActor(\n ctx: Context<TContextData>,\n identifier: string,\n ): Promise<Actor | null> {\n if (this.identifier !== identifier) return null;\n const session = this.getSession(ctx);\n const summary = await this.getActorSummary(session);\n const { pairs, tags } = await this.getActorProperties(session);\n const allTags = summary == null ? tags : [...tags, ...summary.tags];\n const keyPairs = await ctx.getActorKeyPairs(identifier);\n return new this.class({\n id: ctx.getActorUri(identifier),\n preferredUsername: this.username,\n name: this.name,\n summary: summary == null ? null : summary.text,\n attachments: pairs,\n tags: allTags.filter((tag, i) =>\n allTags.findIndex((t) =>\n t.name?.toString() === tag.name?.toString() &&\n (t instanceof Link\n ? tag instanceof Link && t.href?.href === tag.href?.href\n : tag instanceof Object && t.id?.href === tag.id?.href)\n ) === i\n ),\n icon: this.icon == null\n ? null\n : this.icon instanceof Image\n ? this.icon\n : new Image({ url: this.icon }),\n image: this.image == null\n ? null\n : this.image instanceof Image\n ? this.image\n : new Image({ url: this.image }),\n inbox: ctx.getInboxUri(identifier),\n endpoints: new Endpoints({\n sharedInbox: ctx.getInboxUri(),\n }),\n followers: ctx.getFollowersUri(identifier),\n outbox: ctx.getOutboxUri(identifier),\n publicKey: keyPairs[0].cryptographicKey,\n assertionMethods: keyPairs.map((pair) => pair.multikey),\n url: new URL(\"/\", ctx.origin),\n });\n }\n\n mapHandle(_ctx: Context<TContextData>, username: string): string | null {\n return username === this.username ? this.identifier : null;\n }\n\n async dispatchActorKeyPairs(\n _ctx: Context<TContextData>,\n identifier: string,\n ): Promise<CryptoKeyPair[]> {\n if (identifier !== this.identifier) return [];\n let keyPairs = await this.repository.getKeyPairs();\n if (keyPairs == null) {\n const rsa = await generateCryptoKeyPair(\"RSASSA-PKCS1-v1_5\");\n const ed25519 = await generateCryptoKeyPair(\"Ed25519\");\n keyPairs = [rsa, ed25519];\n await this.repository.setKeyPairs(keyPairs);\n }\n return keyPairs;\n }\n\n async dispatchFollowers(\n _ctx: Context<TContextData>,\n identifier: string,\n cursor: string | null,\n ): Promise<PageItems<Recipient> | null> {\n if (identifier !== this.identifier) return null;\n let followers: AsyncIterable<Actor>;\n let nextCursor: string | null;\n if (cursor == null) {\n followers = this.repository.getFollowers();\n nextCursor = null;\n } else {\n const offset = cursor.match(/^\\d+$/) ? parseInt(cursor) : 0;\n followers = this.repository.getFollowers({\n offset,\n limit: this.collectionWindow,\n });\n nextCursor = (offset + this.collectionWindow).toString();\n }\n const items: Recipient[] = [];\n let i = 0;\n for await (const follower of followers) {\n items.push(follower);\n i++;\n }\n if (i < this.collectionWindow) nextCursor = null;\n return { items, nextCursor };\n }\n\n getFollowersFirstCursor(\n _ctx: Context<TContextData>,\n identifier: string,\n ): string | null {\n if (identifier !== this.identifier) return null;\n return \"0\";\n }\n\n async countFollowers(\n _ctx: Context<TContextData>,\n identifier: string,\n ): Promise<number | null> {\n if (identifier !== this.identifier) return null;\n return await this.repository.countFollowers();\n }\n\n async getPermissionChecker(\n ctx: RequestContext<TContextData>,\n ): Promise<(object: Object) => boolean> {\n let owner: Actor | null;\n try {\n owner = await ctx.getSignedKeyOwner();\n } catch {\n owner = null;\n }\n let follower = false;\n const ownerUri = owner?.id;\n if (ownerUri != null) {\n follower = await this.repository.hasFollower(ownerUri);\n }\n const followersUri = ctx.getFollowersUri(this.identifier);\n return (object: Object): boolean => {\n const recipients = [...object.toIds, ...object.ccIds].map((u) => u.href);\n if (recipients.includes(PUBLIC_COLLECTION.href)) return true;\n if (recipients.includes(followersUri.href) && follower) return true;\n return ownerUri == null ? false : recipients.includes(ownerUri.href);\n };\n }\n\n async dispatchOutbox(\n ctx: RequestContext<TContextData>,\n identifier: string,\n cursor: string | null,\n ): Promise<PageItems<Activity> | null> {\n if (identifier !== this.identifier) return null;\n const activities = this.repository.getMessages({\n order: \"newest\",\n until: cursor == null || cursor === \"\"\n ? undefined\n : Temporal.Instant.from(cursor),\n limit: cursor == null ? undefined : this.collectionWindow + 1,\n });\n const items: Activity[] = [];\n const isVisible = await this.getPermissionChecker(ctx);\n let i = 0;\n let nextPublished: Temporal.Instant | null = null;\n for await (const activity of activities) {\n if (cursor != null && i >= this.collectionWindow) {\n nextPublished = activity.published ??\n (await activity.getObject())?.published ?? null;\n break;\n }\n if (isVisible(activity)) items.push(activity);\n i++;\n }\n return { items, nextCursor: nextPublished?.toString() ?? null };\n }\n\n getOutboxFirstCursor(\n _ctx: Context<TContextData>,\n identifier: string,\n ): string | null {\n if (identifier !== this.identifier) return null;\n return \"\";\n }\n\n async countOutbox(\n _ctx: Context<TContextData>,\n identifier: string,\n ): Promise<number | null> {\n if (identifier !== this.identifier) return null;\n return await this.repository.countMessages();\n }\n\n async dispatchFollow(\n _ctx: RequestContext<TContextData>,\n values: { id: string },\n ): Promise<Follow | null> {\n const id = values.id as Uuid;\n const follow = await this.repository.getSentFollow(id);\n return follow ?? null;\n }\n\n async authorizeFollow(\n _ctx: RequestContext<TContextData>,\n values: { id: string },\n _signedKey: CryptographicKey | null,\n signedKeyOwner: Actor | null,\n ): Promise<boolean> {\n if (signedKeyOwner == null || signedKeyOwner.id == null) return false;\n const id = values.id as Uuid;\n const follow = await this.repository.getSentFollow(id);\n if (follow == null) return false;\n return signedKeyOwner.id.href === follow.objectId?.href ||\n signedKeyOwner.id.href === follow.actorId?.href;\n }\n\n async dispatchCreate(\n ctx: RequestContext<TContextData>,\n values: { id: string },\n ): Promise<Create | null> {\n const activity = await this.repository.getMessage(values.id as Uuid);\n if (!(activity instanceof Create)) return null;\n const isVisible = await this.getPermissionChecker(ctx);\n return isVisible(activity) ? activity : null;\n }\n\n async dispatchMessage<T extends MessageClass>(\n // deno-lint-ignore no-explicit-any\n cls: new (values: any) => T,\n ctx: Context<TContextData> | RequestContext<TContextData>,\n id: string,\n ): Promise<T | null> {\n const activity = await this.repository.getMessage(id as Uuid);\n if (!(activity instanceof Create)) return null;\n if (\"request\" in ctx) {\n // TODO: Split this method into two\n const isVisible = await this.getPermissionChecker(ctx);\n if (!isVisible(activity)) return null;\n }\n const object = await activity.getObject(ctx);\n if (object == null || !(object instanceof cls)) return null;\n return object;\n }\n\n async dispatchAnnounce(\n ctx: RequestContext<TContextData>,\n values: { id: string },\n ): Promise<Announce | null> {\n const activity = await this.repository.getMessage(values.id as Uuid);\n if (!(activity instanceof Announce)) return null;\n const isVisible = await this.getPermissionChecker(ctx);\n return isVisible(activity) ? activity : null;\n }\n\n dispatchEmoji(\n ctx: Context<TContextData>,\n values: { name: string },\n ): APEmoji | null {\n const customEmoji = this.customEmojis[values.name];\n if (customEmoji == null) return null;\n return this.getEmoji(ctx, values.name, customEmoji);\n }\n\n dispatchSharedKey(_ctx: Context<TContextData>): { identifier: string } {\n return { identifier: this.identifier };\n }\n\n async onFollowed(\n ctx: InboxContext<TContextData>,\n follow: Follow,\n ): Promise<void> {\n const botUri = ctx.getActorUri(this.identifier);\n if (\n follow.actorId?.href === botUri.href ||\n follow.objectId?.href !== botUri.href\n ) {\n return;\n }\n const follower = await follow.getActor({\n contextLoader: ctx.contextLoader,\n documentLoader: ctx.documentLoader,\n suppressError: true,\n });\n if (follower == null || follower.id == null) return;\n const session = this.getSession(ctx);\n const followRequest = new FollowRequestImpl<TContextData>(\n session,\n follow,\n follower,\n );\n await this.onFollow?.(session, followRequest);\n if (followRequest.state === \"pending\") {\n if (this.followerPolicy === \"accept\") await followRequest.accept();\n else if (this.followerPolicy === \"reject\") await followRequest.reject();\n }\n }\n\n async onUnfollowed(\n ctx: InboxContext<TContextData>,\n undo: Undo,\n ): Promise<void> {\n const followId = undo.objectId;\n if (followId == null || undo.actorId == null) return;\n const follower = await this.repository.removeFollower(\n followId,\n undo.actorId,\n );\n if (this.onUnfollow != null && follower != null) {\n const session = this.getSession(ctx);\n await this.onUnfollow(session, follower);\n }\n }\n\n async onFollowAccepted(\n ctx: InboxContext<TContextData>,\n accept: Accept,\n ): Promise<void> {\n const parsedObj = ctx.parseUri(accept.objectId);\n if (parsedObj?.type !== \"object\" || parsedObj.class !== Follow) return;\n const follow = await this.repository.getSentFollow(\n parsedObj.values.id as Uuid,\n );\n if (follow == null) return;\n const followee = await follow.getObject(ctx);\n if (\n !isActor(followee) || followee.id == null ||\n followee.id.href !== accept.actorId?.href\n ) {\n return;\n }\n await this.repository.addFollowee(followee.id, follow);\n if (this.onAcceptFollow != null) {\n const session = this.getSession(ctx);\n await this.onAcceptFollow(session, followee);\n }\n }\n\n async onFollowRejected(\n ctx: InboxContext<TContextData>,\n reject: Reject,\n ): Promise<void> {\n const parsedObj = ctx.parseUri(reject.objectId);\n if (parsedObj?.type !== \"object\" || parsedObj.class !== Follow) return;\n const id = parsedObj.values.id as Uuid;\n const follow = await this.repository.getSentFollow(id);\n if (follow == null) return;\n const followee = await follow.getObject(ctx);\n if (\n !isActor(followee) || followee.id == null ||\n followee.id.href !== reject.actorId?.href\n ) {\n return;\n }\n await this.repository.removeSentFollow(id);\n if (this.onRejectFollow != null) {\n const session = this.getSession(ctx);\n await this.onRejectFollow(session, followee);\n }\n }\n\n async onCreated(\n ctx: InboxContext<TContextData>,\n create: Create,\n ): Promise<void> {\n const object = await create.getObject(ctx);\n if (\n !(object instanceof Article || object instanceof ChatMessage ||\n object instanceof Note || object instanceof Question) ||\n object.attributionId?.href !== create.actorId?.href\n ) {\n return;\n }\n const session = this.getSession(ctx);\n let messageCache: Message<MessageClass, TContextData> | null = null;\n const getMessage = async () => {\n if (messageCache != null) return messageCache;\n return messageCache = await createMessage(object, session, {});\n };\n const replyTarget = ctx.parseUri(object.replyTargetId);\n if (\n this.onVote != null &&\n object instanceof Note && replyTarget?.type === \"object\" &&\n // @ts-ignore: replyTarget.class satisfies (typeof messageClasses)[number]\n messageClasses.includes(replyTarget.class) &&\n object.name != null\n ) {\n if (create.actorId?.href === session.actorId.href) return;\n const actor = await create.getActor(ctx);\n if (actor == null) return;\n const pollMessage = await this.repository.getMessage(\n replyTarget.values.id as Uuid,\n );\n if (!(pollMessage instanceof Create)) return;\n const question = await pollMessage.getObject(ctx);\n if (\n !(question instanceof Question) || question.endTime == null ||\n Temporal.Instant.compare(question.endTime, Temporal.Now.instant()) < 0\n ) {\n return;\n }\n const optionNotes: Note[] = [];\n const options: string[] = [];\n for await (const note of question.getInclusiveOptions(ctx)) {\n if (!(note instanceof Note)) continue;\n optionNotes.push(note);\n if (note.name != null) options.push(note.name.toString());\n }\n const multiple = options.length > 0;\n for await (const note of question.getExclusiveOptions(ctx)) {\n if (!(note instanceof Note)) continue;\n optionNotes.push(note);\n if (note.name != null) options.push(note.name.toString());\n }\n const option = object.name.toString();\n if (!options.includes(option)) return;\n const updatedOptionNotes: Note[] = [...optionNotes];\n let i = 0;\n for (const note of updatedOptionNotes) {\n if (note.name === option) {\n const replies = await note.getReplies(ctx);\n if (replies != null && replies.totalItems != null) {\n updatedOptionNotes[i] = note.clone({\n replies: replies.clone({\n // FIXME: This way of updating vote count is not only inefficient,\n // but also can lead to incorrect counts if multiple votes are\n // cast at the same time.\n totalItems: replies.totalItems + 1,\n }),\n });\n }\n }\n i++;\n }\n const updatedQuestion = question.clone({\n inclusiveOptions: multiple ? updatedOptionNotes : [],\n exclusiveOptions: !multiple ? updatedOptionNotes : [],\n });\n const updatedPollMessage = pollMessage.clone({\n object: updatedQuestion,\n });\n await this.repository.updateMessage(\n replyTarget.values.id as Uuid,\n () => updatedPollMessage,\n );\n const message = await createMessage(updatedQuestion, session, {});\n const vote: Vote<TContextData> = {\n raw: object,\n actor,\n message,\n poll: {\n multiple,\n options,\n endTime: question.endTime,\n },\n option,\n };\n await this.onVote(session, vote);\n const update = new Update({\n id: new URL(\n `#update-votes/${crypto.randomUUID()}`,\n updatedQuestion.id ?? ctx.origin,\n ),\n actor: ctx.getActorUri(this.identifier),\n object: updatedPollMessage.id,\n tos: updatedPollMessage.toIds,\n ccs: updatedPollMessage.ccIds,\n });\n if (message.visibility === \"direct\") {\n await ctx.forwardActivity(this, [...message.mentions], {\n skipIfUnsigned: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n await ctx.sendActivity(\n this,\n [...message.mentions],\n update,\n { excludeBaseUris: [new URL(ctx.origin)] },\n );\n } else {\n await ctx.forwardActivity(this, \"followers\", {\n skipIfUnsigned: true,\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n await ctx.sendActivity(\n this,\n \"followers\",\n update,\n {\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n },\n );\n }\n return;\n }\n if (\n this.onReply != null &&\n replyTarget?.type === \"object\" &&\n // @ts-ignore: replyTarget.class satisfies (typeof messageClasses)[number]\n messageClasses.includes(replyTarget.class)\n ) {\n const message = await getMessage();\n if (\n message.visibility === \"public\" || message.visibility === \"unlisted\"\n ) {\n await ctx.forwardActivity(this, \"followers\", {\n skipIfUnsigned: true,\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n }\n await this.onReply(session, message);\n }\n let quoteUrl: URL | null = null;\n // FIXME: eliminate this duplication\n for await (const tag of object.getTags(ctx)) {\n if (tag instanceof Link && isQuoteLink(tag)) {\n quoteUrl = tag.href;\n break;\n }\n }\n if (quoteUrl == null) quoteUrl = object.quoteUrl;\n const quoteTarget = ctx.parseUri(quoteUrl);\n if (\n this.onQuote != null &&\n quoteTarget?.type === \"object\" &&\n // @ts-ignore: quoteTarget.class satisfies (typeof messageClasses)[number]\n messageClasses.includes(quoteTarget.class)\n ) {\n const message = await getMessage();\n if (\n message.visibility === \"public\" || message.visibility === \"unlisted\"\n ) {\n await ctx.forwardActivity(this, \"followers\", {\n skipIfUnsigned: true,\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n }\n await this.onQuote(session, message);\n }\n for await (const tag of object.getTags(ctx)) {\n if (\n tag instanceof Mention && tag.href != null && this.onMention != null\n ) {\n const parsed = ctx.parseUri(tag.href);\n if (\n parsed?.type === \"actor\" && parsed.identifier === this.identifier\n ) {\n await this.onMention(session, await getMessage());\n break;\n }\n }\n }\n if (this.onMessage != null) {\n await this.onMessage(session, await getMessage());\n }\n }\n\n async onAnnounced(\n ctx: InboxContext<TContextData>,\n announce: Announce,\n ): Promise<void> {\n if (\n this.onSharedMessage == null || announce.id == null ||\n announce.actorId == null\n ) return;\n const objectUri = ctx.parseUri(announce.objectId);\n let object: Object | null = null;\n if (\n objectUri?.type === \"object\" &&\n // deno-lint-ignore no-explicit-any\n messageClasses.includes(objectUri.class as any)\n ) {\n const msg = await this.repository.getMessage(objectUri.values.id as Uuid);\n if (msg instanceof Create) object = await msg.getObject(ctx);\n } else {\n object = await announce.getObject(ctx);\n }\n if (!isMessageObject(object)) return;\n const session = this.getSession(ctx);\n const actor = announce.actorId.href == session.actorId.href\n ? await session.getActor()\n : await announce.getActor(ctx);\n if (actor == null) return;\n const original = await createMessage(object, session, {});\n const sharedMessage: SharedMessage<MessageClass, TContextData> = {\n raw: announce,\n id: announce.id,\n actor,\n visibility: getMessageVisibility(announce.toIds, announce.ccIds, actor),\n original,\n };\n await this.onSharedMessage(session, sharedMessage);\n }\n\n async #parseLike(\n ctx: InboxContext<TContextData>,\n like: RawLike,\n ): Promise<\n { session: Session<TContextData>; like: Like<TContextData> } | undefined\n > {\n if (like.id == null || like.actorId == null) return undefined;\n const objectUri = ctx.parseUri(like.objectId);\n let object: Object | null = null;\n if (\n objectUri?.type === \"object\" &&\n // deno-lint-ignore no-explicit-any\n messageClasses.includes(objectUri.class as any)\n ) {\n const msg = await this.repository.getMessage(objectUri.values.id as Uuid);\n if (msg instanceof Create) object = await msg.getObject(ctx);\n } else {\n object = await like.getObject(ctx);\n }\n if (!isMessageObject(object)) return undefined;\n const session = this.getSession(ctx);\n const actor = like.actorId.href == session.actorId.href\n ? await session.getActor()\n : await like.getActor(ctx);\n if (actor == null) return;\n const message = await createMessage(object, session, {});\n return {\n session,\n like: {\n raw: like,\n id: like.id,\n actor,\n message,\n },\n };\n }\n\n async onLiked(ctx: InboxContext<TContextData>, like: RawLike): Promise<void> {\n if (like.name != null) return this.onReacted(ctx, like);\n if (this.onLike == null) return;\n const sessionAndLike = await this.#parseLike(ctx, like);\n if (sessionAndLike == null) return;\n const { session, like: likeObject } = sessionAndLike;\n await this.onLike(session, likeObject);\n }\n\n async onUnliked(ctx: InboxContext<TContextData>, undo: Undo): Promise<void> {\n const like = await undo.getObject(ctx);\n if (!(like instanceof RawLike)) return;\n if (like.name != null) return this.onUnreacted(ctx, undo);\n if (this.onUnlike == null) return;\n if (undo.actorId?.href !== like.actorId?.href) return;\n const sessionAndLike = await this.#parseLike(ctx, like);\n if (sessionAndLike == null) return;\n const { session, like: likeObject } = sessionAndLike;\n await this.onUnlike(session, likeObject);\n }\n\n async #parseReaction(\n ctx: InboxContext<TContextData>,\n react: EmojiReact | RawLike,\n ): Promise<\n | { session: Session<TContextData>; reaction: Reaction<TContextData> }\n | undefined\n > {\n if (react.id == null || react.actorId == null || react.name == null) {\n return undefined;\n }\n let emoji: Emoji | APEmoji | undefined;\n if (isEmoji(react.name)) {\n emoji = react.name;\n } else if (\n typeof react.name === \"string\" && react.name.startsWith(\":\") &&\n react.name.endsWith(\":\")\n ) {\n for await (const tag of react.getTags(ctx)) {\n if (tag instanceof APEmoji && tag.name === react.name) {\n emoji = tag;\n break;\n }\n }\n }\n if (emoji == null) return undefined;\n const objectUri = ctx.parseUri(react.objectId);\n let object: Object | null = null;\n if (\n objectUri?.type === \"object\" &&\n // deno-lint-ignore no-explicit-any\n messageClasses.includes(objectUri.class as any)\n ) {\n const msg = await this.repository.getMessage(objectUri.values.id as Uuid);\n if (msg instanceof Create) object = await msg.getObject(ctx);\n } else {\n object = await react.getObject(ctx);\n }\n if (!isMessageObject(object)) return undefined;\n const session = this.getSession(ctx);\n const actor = react.actorId.href == session.actorId.href\n ? await session.getActor()\n : await react.getActor(ctx);\n if (actor == null) return;\n const message = await createMessage(object, session, {});\n return {\n session,\n reaction: {\n raw: react,\n id: react.id,\n actor,\n message,\n emoji,\n },\n };\n }\n\n async onReacted(\n ctx: InboxContext<TContextData>,\n react: EmojiReact | RawLike,\n ): Promise<void> {\n if (this.onReact == null) return;\n const sessionAndReaction = await this.#parseReaction(ctx, react);\n if (sessionAndReaction == null) return;\n const { session, reaction } = sessionAndReaction;\n await this.onReact(session, reaction);\n }\n\n async onUnreacted(\n ctx: InboxContext<TContextData>,\n undo: Undo,\n ): Promise<void> {\n if (this.onUnreact == null) return;\n const react = await undo.getObject(ctx);\n if (!(react instanceof EmojiReact || react instanceof RawLike)) return;\n if (undo.actorId?.href !== react.actorId?.href) return;\n const sessionAndReaction = await this.#parseReaction(ctx, react);\n if (sessionAndReaction == null) return;\n const { session, reaction } = sessionAndReaction;\n await this.onUnreact(session, reaction);\n }\n\n dispatchNodeInfo(_ctx: Context<TContextData>): NodeInfo {\n return {\n software: this.software!,\n protocols: [\"activitypub\"],\n services: {\n outbound: [\"atom1.0\"], // TODO\n },\n usage: {\n users: {\n total: 1,\n activeMonth: 1, // FIXME\n activeHalfyear: 1, // FIXME\n },\n localPosts: 0, // FIXME\n localComments: 0,\n },\n };\n }\n\n getSession(\n origin: string | URL,\n contextData: TContextData,\n ): SessionImpl<TContextData>;\n getSession(origin: string | URL): SessionImpl<TContextData>;\n getSession(context: Context<TContextData>): SessionImpl<TContextData>;\n\n getSession(\n origin: string | URL | Context<TContextData>,\n contextData?: TContextData,\n ): SessionImpl<TContextData> {\n const ctx = typeof origin === \"string\" || origin instanceof URL\n ? this.federation.createContext(new URL(origin), contextData!)\n : origin;\n return new SessionImpl(this, ctx);\n }\n\n async fetch(request: Request, contextData: TContextData): Promise<Response> {\n if (this.behindProxy) {\n request = await getXForwardedRequest(request);\n }\n const url = new URL(request.url);\n if (\n url.pathname.startsWith(\"/.well-known/\") ||\n url.pathname.startsWith(\"/ap/\") ||\n url.pathname.startsWith(\"/nodeinfo/\")\n ) {\n return await this.federation.fetch(request, { contextData });\n }\n const match = /^\\/emojis\\/([a-z0-9-_]+)(?:$|\\.)/.exec(url.pathname);\n if (match != null) {\n const customEmoji = this.customEmojis[match[1]];\n if (customEmoji == null || !(\"file\" in customEmoji)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n let file: fs.FileHandle;\n try {\n file = await fs.open(customEmoji.file, \"r\");\n } catch (error) {\n if (\n typeof error === \"object\" && error != null && \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return new Response(\"Not Found\", { status: 404 });\n }\n throw error;\n }\n const fileInfo = await file.stat();\n return new Response(file.readableWebStream(), {\n headers: {\n \"Content-Type\": customEmoji.type,\n \"Content-Length\": fileInfo.size.toString(),\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Last-Modified\": (fileInfo.mtime ?? new Date()).toUTCString(),\n \"ETag\": `\"${fileInfo.mtime?.getTime().toString(36)}${\n fileInfo.size.toString(36)\n }\"`,\n },\n });\n }\n return await app.fetch(request, { bot: this, contextData });\n }\n\n getEmoji(\n ctx: Context<TContextData>,\n name: string,\n data: CustomEmoji,\n ): APEmoji {\n let url: URL;\n if (\"url\" in data) {\n url = new URL(data.url);\n } else {\n // @ts-ignore: data.type satisfies keyof typeof mimeDb\n const t = mimeDb[data.type];\n url = new URL(\n `/emojis/${name}${\n t == null || t.extensions == null || t.extensions.length < 1\n ? \"\"\n : `.${t.extensions[0]}`\n }`,\n ctx.origin,\n );\n }\n return new APEmoji({\n id: ctx.getObjectUri(APEmoji, { name }),\n name: `:${name}:`,\n icon: new Image({\n mediaType: data.type,\n url,\n }),\n });\n }\n\n addCustomEmoji<TEmojiName extends string>(\n name: TEmojiName,\n data: CustomEmoji,\n ): DeferredCustomEmoji<TContextData> {\n if (!name.match(/^[a-z0-9-_]+$/i)) {\n throw new TypeError(\n `Invalid custom emoji name: ${name}. It must match /^[a-z0-9-_]+$/i.`,\n );\n } else if (name in this.customEmojis) {\n throw new TypeError(`Duplicate custom emoji name: ${name}`);\n } else if (!data.type.startsWith(\"image/\")) {\n throw new TypeError(`Unsupported media type: ${data.type}`);\n }\n this.customEmojis[name] = data;\n return (session: Session<TContextData>) =>\n this.getEmoji(\n session.context,\n name,\n data,\n );\n }\n\n addCustomEmojis<TEmojiName extends string>(\n emojis: Readonly<Record<TEmojiName, CustomEmoji>>,\n ): Readonly<Record<TEmojiName, DeferredCustomEmoji<TContextData>>> {\n const emojiMap = {} as Record<\n TEmojiName,\n DeferredCustomEmoji<TContextData>\n >;\n for (const name in emojis) {\n emojiMap[name] = this.addCustomEmoji(name, emojis[name]);\n }\n return emojiMap;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bot-impl.js","names":["options: BotImplOptions<TContextData>","#summary","#properties","metadata","APEmoji","RawLike","session: Session<TContextData>","tags: (Link | Object)[]","pairs: PropertyValue[]","ctx: Context<TContextData>","identifier: string","Object","_ctx: Context<TContextData>","username: string","cursor: string | null","followers: AsyncIterable<Actor>","nextCursor: string | null","items: Recipient[]","ctx: RequestContext<TContextData>","owner: Actor | null","object: Object","items: Activity[]","nextPublished: Temporal.Instant | null","_ctx: RequestContext<TContextData>","values: { id: string }","_signedKey: CryptographicKey | null","signedKeyOwner: Actor | null","cls: new (values: any) => T","ctx: Context<TContextData> | RequestContext<TContextData>","id: string","values: { name: string }","ctx: InboxContext<TContextData>","follow: Follow","undo: Undo","accept: Accept","reject: Reject","create: Create","messageCache: Message<MessageClass, TContextData> | null","optionNotes: Note[]","options: string[]","updatedQuestion: Question","updatedOptionNotes: Note[]","vote: Vote<TContextData>","Update","quoteUrl: URL | null","announce: Announce","object: Object | null","sharedMessage: SharedMessage<MessageClass, TContextData>","#parseLike","like: RawLike","#parseReaction","react: EmojiReact | RawLike","emoji: Emoji | APEmoji | undefined","origin: string | URL | Context<TContextData>","contextData?: TContextData","request: Request","contextData: TContextData","file: fs.FileHandle","name: string","data: CustomEmoji","url: URL","name: TEmojiName","emojis: Readonly<Record<TEmojiName, CustomEmoji>>"],"sources":["../src/bot-impl.ts"],"sourcesContent":["// BotKit by Fedify: A framework for creating ActivityPub bots\n// Copyright (C) 2025 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 Context,\n createFederation,\n type Federation,\n generateCryptoKeyPair,\n type InboxContext,\n type NodeInfo,\n Object,\n type PageItems,\n type Recipient,\n type RequestContext,\n type Software,\n Update,\n} from \"@fedify/fedify\";\nimport {\n Accept,\n type Activity,\n type Actor,\n Announce,\n type Application,\n Article,\n ChatMessage,\n Create,\n type CryptographicKey,\n Emoji as APEmoji,\n EmojiReact,\n Endpoints,\n Follow,\n Image,\n isActor,\n Like as RawLike,\n Link,\n Mention,\n Note,\n PropertyValue,\n PUBLIC_COLLECTION,\n Question,\n Reject,\n Service,\n Undo,\n} from \"@fedify/fedify/vocab\";\nimport { getLogger } from \"@logtape/logtape\";\nimport mimeDb from \"mime-db\";\nimport fs from \"node:fs/promises\";\nimport { getXForwardedRequest } from \"x-forwarded-fetch\";\nimport metadata from \"../deno.json\" with { type: \"json\" };\nimport type { Bot, CreateBotOptions, PagesOptions } from \"./bot.ts\";\nimport {\n type CustomEmoji,\n type DeferredCustomEmoji,\n type Emoji,\n isEmoji,\n} from \"./emoji.ts\";\nimport type {\n AcceptEventHandler,\n FollowEventHandler,\n LikeEventHandler,\n MentionEventHandler,\n MessageEventHandler,\n QuoteEventHandler,\n ReactionEventHandler,\n RejectEventHandler,\n ReplyEventHandler,\n SharedMessageEventHandler,\n UndoneReactionEventHandler,\n UnfollowEventHandler,\n UnlikeEventHandler,\n VoteEventHandler,\n} from \"./events.ts\";\nimport { FollowRequestImpl } from \"./follow-impl.ts\";\nimport {\n createMessage,\n getMessageVisibility,\n isMessageObject,\n isQuoteLink,\n messageClasses,\n} from \"./message-impl.ts\";\nimport type { Message, MessageClass, SharedMessage } from \"./message.ts\";\nimport { app } from \"./pages.tsx\";\nimport type { Vote } from \"./poll.ts\";\nimport type { Like, Reaction } from \"./reaction.ts\";\nimport { KvRepository, type Repository, type Uuid } from \"./repository.ts\";\nimport { SessionImpl } from \"./session-impl.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { Text } from \"./text.ts\";\n\nexport interface BotImplOptions<TContextData>\n extends CreateBotOptions<TContextData> {\n collectionWindow?: number;\n}\n\nexport class BotImpl<TContextData> implements Bot<TContextData> {\n readonly identifier: string;\n readonly class: typeof Service | typeof Application;\n readonly username: string;\n readonly name?: string;\n readonly summary?: Text<\"block\", TContextData>;\n #summary: { text: string; tags: (Link | Object)[] } | null;\n readonly icon?: URL | Image;\n readonly image?: URL | Image;\n readonly properties: Record<string, Text<\"block\" | \"inline\", TContextData>>;\n #properties: { pairs: PropertyValue[]; tags: (Link | Object)[] } | null;\n readonly followerPolicy: \"accept\" | \"reject\" | \"manual\";\n readonly customEmojis: Record<string, CustomEmoji>;\n readonly repository: Repository;\n readonly software?: Software;\n readonly behindProxy: boolean;\n readonly pages: Required<PagesOptions>;\n readonly collectionWindow: number;\n readonly federation: Federation<TContextData>;\n\n onFollow?: FollowEventHandler<TContextData>;\n onUnfollow?: UnfollowEventHandler<TContextData>;\n onAcceptFollow?: AcceptEventHandler<TContextData>;\n onRejectFollow?: RejectEventHandler<TContextData>;\n onMention?: MentionEventHandler<TContextData>;\n onReply?: ReplyEventHandler<TContextData>;\n onQuote?: QuoteEventHandler<TContextData>;\n onMessage?: MessageEventHandler<TContextData>;\n onSharedMessage?: SharedMessageEventHandler<TContextData>;\n onLike?: LikeEventHandler<TContextData>;\n onUnlike?: UnlikeEventHandler<TContextData>;\n onReact?: ReactionEventHandler<TContextData>;\n onUnreact?: UndoneReactionEventHandler<TContextData>;\n onVote?: VoteEventHandler<TContextData>;\n\n constructor(options: BotImplOptions<TContextData>) {\n this.identifier = options.identifier ?? \"bot\";\n this.class = options.class ?? Service;\n this.username = options.username;\n this.name = options.name;\n this.summary = options.summary;\n this.#summary = null;\n this.icon = options.icon;\n this.image = options.image;\n this.properties = options.properties ?? {};\n this.#properties = null;\n this.followerPolicy = options.followerPolicy ?? \"accept\";\n this.customEmojis = {};\n this.repository = options.repository ?? new KvRepository(options.kv);\n this.software = options.software;\n this.pages = {\n color: \"green\",\n css: \"\",\n ...(options.pages ?? {}),\n };\n this.federation = createFederation<TContextData>({\n kv: options.kv,\n queue: options.queue,\n userAgent: {\n software: `BotKit/${metadata.version}`,\n },\n });\n this.behindProxy = options.behindProxy ?? false;\n this.collectionWindow = options.collectionWindow ?? 50;\n this.initialize();\n }\n\n initialize(): void {\n this.federation\n .setActorDispatcher(\n \"/ap/actor/{identifier}\",\n this.dispatchActor.bind(this),\n )\n .mapHandle(this.mapHandle.bind(this))\n .setKeyPairsDispatcher(this.dispatchActorKeyPairs.bind(this));\n this.federation\n .setFollowersDispatcher(\n \"/ap/actor/{identifier}/followers\",\n this.dispatchFollowers.bind(this),\n )\n .setFirstCursor(this.getFollowersFirstCursor.bind(this))\n .setCounter(this.countFollowers.bind(this));\n this.federation\n .setOutboxDispatcher(\n \"/ap/actor/{identifier}/outbox\",\n this.dispatchOutbox.bind(this),\n )\n .setFirstCursor(this.getOutboxFirstCursor.bind(this))\n .setCounter(this.countOutbox.bind(this));\n this.federation\n .setObjectDispatcher(\n Follow,\n \"/ap/follow/{id}\",\n this.dispatchFollow.bind(this),\n )\n .authorize(this.authorizeFollow.bind(this));\n this.federation.setObjectDispatcher(\n Create,\n \"/ap/create/{id}\",\n this.dispatchCreate.bind(this),\n );\n this.federation.setObjectDispatcher(\n Article,\n \"/ap/article/{id}\",\n (ctx, values) => this.dispatchMessage(Article, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n ChatMessage,\n \"/ap/chat-message/{id}\",\n (ctx, values) => this.dispatchMessage(ChatMessage, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n Note,\n \"/ap/note/{id}\",\n (ctx, values) => this.dispatchMessage(Note, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n Question,\n \"/ap/question/{id}\",\n (ctx, values) => this.dispatchMessage(Question, ctx, values.id),\n );\n this.federation.setObjectDispatcher(\n Announce,\n \"/ap/announce/{id}\",\n this.dispatchAnnounce.bind(this),\n );\n this.federation.setObjectDispatcher(\n APEmoji,\n \"/ap/emoji/{name}\",\n this.dispatchEmoji.bind(this),\n );\n this.federation\n .setInboxListeners(\"/ap/actor/{identifier}/inbox\", \"/ap/inbox\")\n .on(Follow, this.onFollowed.bind(this))\n .on(Undo, async (ctx, undo) => {\n const object = await undo.getObject(ctx);\n if (object instanceof Follow) await this.onUnfollowed(ctx, undo);\n else if (object instanceof RawLike) await this.onUnliked(ctx, undo);\n else {\n const logger = getLogger([\"botkit\", \"bot\", \"inbox\"]);\n logger.warn(\n \"The Undo object {undoId} is not about Follow or Like: {object}.\",\n { undoId: undo.id?.href, object },\n );\n }\n })\n .on(Accept, this.onFollowAccepted.bind(this))\n .on(Reject, this.onFollowRejected.bind(this))\n .on(Create, this.onCreated.bind(this))\n .on(Announce, this.onAnnounced.bind(this))\n .on(RawLike, this.onLiked.bind(this))\n .setSharedKeyDispatcher(this.dispatchSharedKey.bind(this));\n if (this.software != null) {\n this.federation.setNodeInfoDispatcher(\n \"/nodeinfo/2.1\",\n this.dispatchNodeInfo.bind(this),\n );\n }\n }\n\n async getActorSummary(\n session: Session<TContextData>,\n ): Promise<{ text: string; tags: (Link | Object)[] } | null> {\n if (this.summary == null) return null;\n if (this.#summary == null) {\n let summary = \"\";\n const tags: (Link | Object)[] = [];\n for await (const chunk of this.summary.getHtml(session)) {\n summary += chunk;\n }\n for await (const tag of this.summary.getTags(session)) {\n tags.push(tag);\n }\n return this.#summary = { text: summary, tags };\n }\n return this.#summary;\n }\n\n async getActorProperties(\n session: Session<TContextData>,\n ): Promise<{ pairs: PropertyValue[]; tags: (Link | Object)[] }> {\n if (this.#properties != null) return this.#properties;\n const pairs: PropertyValue[] = [];\n const tags: (Link | Object)[] = [];\n for (const name in this.properties) {\n const value = this.properties[name];\n const pair = new PropertyValue({\n name,\n value: (await Array.fromAsync(value.getHtml(session))).join(\"\"),\n });\n pairs.push(pair);\n for await (const tag of value.getTags(session)) {\n tags.push(tag);\n }\n }\n return this.#properties = { pairs, tags };\n }\n\n async dispatchActor(\n ctx: Context<TContextData>,\n identifier: string,\n ): Promise<Actor | null> {\n if (this.identifier !== identifier) return null;\n const session = this.getSession(ctx);\n const summary = await this.getActorSummary(session);\n const { pairs, tags } = await this.getActorProperties(session);\n const allTags = summary == null ? tags : [...tags, ...summary.tags];\n const keyPairs = await ctx.getActorKeyPairs(identifier);\n return new this.class({\n id: ctx.getActorUri(identifier),\n preferredUsername: this.username,\n name: this.name,\n summary: summary == null ? null : summary.text,\n attachments: pairs,\n tags: allTags.filter((tag, i) =>\n allTags.findIndex((t) =>\n t.name?.toString() === tag.name?.toString() &&\n (t instanceof Link\n ? tag instanceof Link && t.href?.href === tag.href?.href\n : tag instanceof Object && t.id?.href === tag.id?.href)\n ) === i\n ),\n icon: this.icon == null\n ? null\n : this.icon instanceof Image\n ? this.icon\n : new Image({ url: this.icon }),\n image: this.image == null\n ? null\n : this.image instanceof Image\n ? this.image\n : new Image({ url: this.image }),\n inbox: ctx.getInboxUri(identifier),\n endpoints: new Endpoints({\n sharedInbox: ctx.getInboxUri(),\n }),\n followers: ctx.getFollowersUri(identifier),\n outbox: ctx.getOutboxUri(identifier),\n publicKey: keyPairs[0].cryptographicKey,\n assertionMethods: keyPairs.map((pair) => pair.multikey),\n url: new URL(\"/\", ctx.origin),\n });\n }\n\n mapHandle(_ctx: Context<TContextData>, username: string): string | null {\n return username === this.username ? this.identifier : null;\n }\n\n async dispatchActorKeyPairs(\n _ctx: Context<TContextData>,\n identifier: string,\n ): Promise<CryptoKeyPair[]> {\n if (identifier !== this.identifier) return [];\n let keyPairs = await this.repository.getKeyPairs();\n if (keyPairs == null) {\n const rsa = await generateCryptoKeyPair(\"RSASSA-PKCS1-v1_5\");\n const ed25519 = await generateCryptoKeyPair(\"Ed25519\");\n keyPairs = [rsa, ed25519];\n await this.repository.setKeyPairs(keyPairs);\n }\n return keyPairs;\n }\n\n async dispatchFollowers(\n _ctx: Context<TContextData>,\n identifier: string,\n cursor: string | null,\n ): Promise<PageItems<Recipient> | null> {\n if (identifier !== this.identifier) return null;\n let followers: AsyncIterable<Actor>;\n let nextCursor: string | null;\n if (cursor == null) {\n followers = this.repository.getFollowers();\n nextCursor = null;\n } else {\n const offset = cursor.match(/^\\d+$/) ? parseInt(cursor) : 0;\n followers = this.repository.getFollowers({\n offset,\n limit: this.collectionWindow,\n });\n nextCursor = (offset + this.collectionWindow).toString();\n }\n const items: Recipient[] = [];\n let i = 0;\n for await (const follower of followers) {\n items.push(follower);\n i++;\n }\n if (i < this.collectionWindow) nextCursor = null;\n return { items, nextCursor };\n }\n\n getFollowersFirstCursor(\n _ctx: Context<TContextData>,\n identifier: string,\n ): string | null {\n if (identifier !== this.identifier) return null;\n return \"0\";\n }\n\n async countFollowers(\n _ctx: Context<TContextData>,\n identifier: string,\n ): Promise<number | null> {\n if (identifier !== this.identifier) return null;\n return await this.repository.countFollowers();\n }\n\n async getPermissionChecker(\n ctx: RequestContext<TContextData>,\n ): Promise<(object: Object) => boolean> {\n let owner: Actor | null;\n try {\n owner = await ctx.getSignedKeyOwner();\n } catch {\n owner = null;\n }\n let follower = false;\n const ownerUri = owner?.id;\n if (ownerUri != null) {\n follower = await this.repository.hasFollower(ownerUri);\n }\n const followersUri = ctx.getFollowersUri(this.identifier);\n return (object: Object): boolean => {\n const recipients = [...object.toIds, ...object.ccIds].map((u) => u.href);\n if (recipients.includes(PUBLIC_COLLECTION.href)) return true;\n if (recipients.includes(followersUri.href) && follower) return true;\n return ownerUri == null ? false : recipients.includes(ownerUri.href);\n };\n }\n\n async dispatchOutbox(\n ctx: RequestContext<TContextData>,\n identifier: string,\n cursor: string | null,\n ): Promise<PageItems<Activity> | null> {\n if (identifier !== this.identifier) return null;\n const activities = this.repository.getMessages({\n order: \"newest\",\n until: cursor == null || cursor === \"\"\n ? undefined\n : Temporal.Instant.from(cursor),\n limit: cursor == null ? undefined : this.collectionWindow + 1,\n });\n const items: Activity[] = [];\n const isVisible = await this.getPermissionChecker(ctx);\n let i = 0;\n let nextPublished: Temporal.Instant | null = null;\n for await (const activity of activities) {\n if (cursor != null && i >= this.collectionWindow) {\n nextPublished = activity.published ??\n (await activity.getObject())?.published ?? null;\n break;\n }\n if (isVisible(activity)) items.push(activity);\n i++;\n }\n return { items, nextCursor: nextPublished?.toString() ?? null };\n }\n\n getOutboxFirstCursor(\n _ctx: Context<TContextData>,\n identifier: string,\n ): string | null {\n if (identifier !== this.identifier) return null;\n return \"\";\n }\n\n async countOutbox(\n _ctx: Context<TContextData>,\n identifier: string,\n ): Promise<number | null> {\n if (identifier !== this.identifier) return null;\n return await this.repository.countMessages();\n }\n\n async dispatchFollow(\n _ctx: RequestContext<TContextData>,\n values: { id: string },\n ): Promise<Follow | null> {\n const id = values.id as Uuid;\n const follow = await this.repository.getSentFollow(id);\n return follow ?? null;\n }\n\n async authorizeFollow(\n _ctx: RequestContext<TContextData>,\n values: { id: string },\n _signedKey: CryptographicKey | null,\n signedKeyOwner: Actor | null,\n ): Promise<boolean> {\n if (signedKeyOwner == null || signedKeyOwner.id == null) return false;\n const id = values.id as Uuid;\n const follow = await this.repository.getSentFollow(id);\n if (follow == null) return false;\n return signedKeyOwner.id.href === follow.objectId?.href ||\n signedKeyOwner.id.href === follow.actorId?.href;\n }\n\n async dispatchCreate(\n ctx: RequestContext<TContextData>,\n values: { id: string },\n ): Promise<Create | null> {\n const activity = await this.repository.getMessage(values.id as Uuid);\n if (!(activity instanceof Create)) return null;\n const isVisible = await this.getPermissionChecker(ctx);\n return isVisible(activity) ? activity : null;\n }\n\n async dispatchMessage<T extends MessageClass>(\n // deno-lint-ignore no-explicit-any\n cls: new (values: any) => T,\n ctx: Context<TContextData> | RequestContext<TContextData>,\n id: string,\n ): Promise<T | null> {\n const activity = await this.repository.getMessage(id as Uuid);\n if (!(activity instanceof Create)) return null;\n if (\"request\" in ctx) {\n // TODO: Split this method into two\n const isVisible = await this.getPermissionChecker(ctx);\n if (!isVisible(activity)) return null;\n }\n const object = await activity.getObject(ctx);\n if (object == null || !(object instanceof cls)) return null;\n return object;\n }\n\n async dispatchAnnounce(\n ctx: RequestContext<TContextData>,\n values: { id: string },\n ): Promise<Announce | null> {\n const activity = await this.repository.getMessage(values.id as Uuid);\n if (!(activity instanceof Announce)) return null;\n const isVisible = await this.getPermissionChecker(ctx);\n return isVisible(activity) ? activity : null;\n }\n\n dispatchEmoji(\n ctx: Context<TContextData>,\n values: { name: string },\n ): APEmoji | null {\n const customEmoji = this.customEmojis[values.name];\n if (customEmoji == null) return null;\n return this.getEmoji(ctx, values.name, customEmoji);\n }\n\n dispatchSharedKey(_ctx: Context<TContextData>): { identifier: string } {\n return { identifier: this.identifier };\n }\n\n async onFollowed(\n ctx: InboxContext<TContextData>,\n follow: Follow,\n ): Promise<void> {\n const botUri = ctx.getActorUri(this.identifier);\n if (\n follow.actorId?.href === botUri.href ||\n follow.objectId?.href !== botUri.href\n ) {\n return;\n }\n const follower = await follow.getActor({\n contextLoader: ctx.contextLoader,\n documentLoader: ctx.documentLoader,\n suppressError: true,\n });\n if (follower == null || follower.id == null) return;\n const session = this.getSession(ctx);\n const followRequest = new FollowRequestImpl<TContextData>(\n session,\n follow,\n follower,\n );\n await this.onFollow?.(session, followRequest);\n if (followRequest.state === \"pending\") {\n if (this.followerPolicy === \"accept\") await followRequest.accept();\n else if (this.followerPolicy === \"reject\") await followRequest.reject();\n }\n }\n\n async onUnfollowed(\n ctx: InboxContext<TContextData>,\n undo: Undo,\n ): Promise<void> {\n const followId = undo.objectId;\n if (followId == null || undo.actorId == null) return;\n const follower = await this.repository.removeFollower(\n followId,\n undo.actorId,\n );\n if (this.onUnfollow != null && follower != null) {\n const session = this.getSession(ctx);\n await this.onUnfollow(session, follower);\n }\n }\n\n async onFollowAccepted(\n ctx: InboxContext<TContextData>,\n accept: Accept,\n ): Promise<void> {\n const parsedObj = ctx.parseUri(accept.objectId);\n if (parsedObj?.type !== \"object\" || parsedObj.class !== Follow) return;\n const follow = await this.repository.getSentFollow(\n parsedObj.values.id as Uuid,\n );\n if (follow == null) return;\n const followee = await follow.getObject(ctx);\n if (\n !isActor(followee) || followee.id == null ||\n followee.id.href !== accept.actorId?.href\n ) {\n return;\n }\n await this.repository.addFollowee(followee.id, follow);\n if (this.onAcceptFollow != null) {\n const session = this.getSession(ctx);\n await this.onAcceptFollow(session, followee);\n }\n }\n\n async onFollowRejected(\n ctx: InboxContext<TContextData>,\n reject: Reject,\n ): Promise<void> {\n const parsedObj = ctx.parseUri(reject.objectId);\n if (parsedObj?.type !== \"object\" || parsedObj.class !== Follow) return;\n const id = parsedObj.values.id as Uuid;\n const follow = await this.repository.getSentFollow(id);\n if (follow == null) return;\n const followee = await follow.getObject(ctx);\n if (\n !isActor(followee) || followee.id == null ||\n followee.id.href !== reject.actorId?.href\n ) {\n return;\n }\n await this.repository.removeSentFollow(id);\n if (this.onRejectFollow != null) {\n const session = this.getSession(ctx);\n await this.onRejectFollow(session, followee);\n }\n }\n\n async onCreated(\n ctx: InboxContext<TContextData>,\n create: Create,\n ): Promise<void> {\n const object = await create.getObject(ctx);\n if (\n !(object instanceof Article || object instanceof ChatMessage ||\n object instanceof Note || object instanceof Question) ||\n object.attributionId?.href !== create.actorId?.href\n ) {\n return;\n }\n const session = this.getSession(ctx);\n let messageCache: Message<MessageClass, TContextData> | null = null;\n const getMessage = async () => {\n if (messageCache != null) return messageCache;\n return messageCache = await createMessage(object, session, {});\n };\n const replyTarget = ctx.parseUri(object.replyTargetId);\n if (\n this.onVote != null &&\n object instanceof Note && replyTarget?.type === \"object\" &&\n // @ts-ignore: replyTarget.class satisfies (typeof messageClasses)[number]\n messageClasses.includes(replyTarget.class) &&\n object.name != null\n ) {\n if (\n create.actorId == null || create.actorId.href === session.actorId.href\n ) {\n return;\n }\n const actorId = create.actorId;\n const actor = await create.getActor(ctx);\n if (actor == null) return;\n const messageId = replyTarget.values.id as Uuid;\n const pollMessage = await this.repository.getMessage(messageId);\n if (!(pollMessage instanceof Create)) return;\n const question = await pollMessage.getObject(ctx);\n if (\n !(question instanceof Question) || question.endTime == null ||\n Temporal.Instant.compare(question.endTime, Temporal.Now.instant()) < 0\n ) {\n return;\n }\n const optionNotes: Note[] = [];\n const options: string[] = [];\n for await (const note of question.getInclusiveOptions(ctx)) {\n if (!(note instanceof Note)) continue;\n optionNotes.push(note);\n if (note.name != null) options.push(note.name.toString());\n }\n const multiple = options.length > 0;\n for await (const note of question.getExclusiveOptions(ctx)) {\n if (!(note instanceof Note)) continue;\n optionNotes.push(note);\n if (note.name != null) options.push(note.name.toString());\n }\n const option = object.name.toString();\n if (!options.includes(option)) return;\n let updatedQuestion: Question = question;\n let updatedPollMessage = pollMessage;\n await this.repository.vote(messageId, actorId, option);\n await this.repository.updateMessage(\n replyTarget.values.id as Uuid,\n async () => {\n const votes = await this.repository.countVotes(messageId);\n const updatedOptionNotes: Note[] = [...optionNotes];\n let i = 0;\n for (const note of updatedOptionNotes) {\n if (note.name != null) {\n const replies = await note.getReplies(ctx);\n if (replies != null && replies.totalItems != null) {\n updatedOptionNotes[i] = note.clone({\n replies: replies.clone({\n totalItems: votes[note.name.toString()],\n }),\n });\n }\n }\n i++;\n }\n updatedQuestion = question.clone({\n inclusiveOptions: multiple ? updatedOptionNotes : [],\n exclusiveOptions: !multiple ? updatedOptionNotes : [],\n voters: await this.repository.countVoters(messageId),\n });\n return updatedPollMessage = pollMessage.clone({\n object: updatedQuestion,\n });\n },\n );\n const message = await createMessage(updatedQuestion, session, {});\n const vote: Vote<TContextData> = {\n raw: object,\n actor,\n message,\n poll: {\n multiple,\n options,\n endTime: question.endTime,\n },\n option,\n };\n await this.onVote(session, vote);\n const update = new Update({\n id: new URL(\n `#update-votes/${crypto.randomUUID()}`,\n updatedQuestion.id ?? ctx.origin,\n ),\n actor: ctx.getActorUri(this.identifier),\n object: updatedPollMessage.id,\n tos: updatedPollMessage.toIds,\n ccs: updatedPollMessage.ccIds,\n });\n if (message.visibility === \"direct\") {\n await ctx.forwardActivity(this, [...message.mentions], {\n skipIfUnsigned: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n await ctx.sendActivity(\n this,\n [...message.mentions],\n update,\n { excludeBaseUris: [new URL(ctx.origin)] },\n );\n } else {\n await ctx.forwardActivity(this, \"followers\", {\n skipIfUnsigned: true,\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n await ctx.sendActivity(\n this,\n \"followers\",\n update,\n {\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n },\n );\n }\n return;\n }\n if (\n this.onReply != null &&\n replyTarget?.type === \"object\" &&\n // @ts-ignore: replyTarget.class satisfies (typeof messageClasses)[number]\n messageClasses.includes(replyTarget.class)\n ) {\n const message = await getMessage();\n if (\n message.visibility === \"public\" || message.visibility === \"unlisted\"\n ) {\n await ctx.forwardActivity(this, \"followers\", {\n skipIfUnsigned: true,\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n }\n await this.onReply(session, message);\n }\n let quoteUrl: URL | null = null;\n // FIXME: eliminate this duplication\n for await (const tag of object.getTags(ctx)) {\n if (tag instanceof Link && isQuoteLink(tag)) {\n quoteUrl = tag.href;\n break;\n }\n }\n if (quoteUrl == null) quoteUrl = object.quoteUrl;\n const quoteTarget = ctx.parseUri(quoteUrl);\n if (\n this.onQuote != null &&\n quoteTarget?.type === \"object\" &&\n // @ts-ignore: quoteTarget.class satisfies (typeof messageClasses)[number]\n messageClasses.includes(quoteTarget.class)\n ) {\n const message = await getMessage();\n if (\n message.visibility === \"public\" || message.visibility === \"unlisted\"\n ) {\n await ctx.forwardActivity(this, \"followers\", {\n skipIfUnsigned: true,\n preferSharedInbox: true,\n excludeBaseUris: [new URL(ctx.origin)],\n });\n }\n await this.onQuote(session, message);\n }\n for await (const tag of object.getTags(ctx)) {\n if (\n tag instanceof Mention && tag.href != null && this.onMention != null\n ) {\n const parsed = ctx.parseUri(tag.href);\n if (\n parsed?.type === \"actor\" && parsed.identifier === this.identifier\n ) {\n await this.onMention(session, await getMessage());\n break;\n }\n }\n }\n if (this.onMessage != null) {\n await this.onMessage(session, await getMessage());\n }\n }\n\n async onAnnounced(\n ctx: InboxContext<TContextData>,\n announce: Announce,\n ): Promise<void> {\n if (\n this.onSharedMessage == null || announce.id == null ||\n announce.actorId == null\n ) return;\n const objectUri = ctx.parseUri(announce.objectId);\n let object: Object | null = null;\n if (\n objectUri?.type === \"object\" &&\n // deno-lint-ignore no-explicit-any\n messageClasses.includes(objectUri.class as any)\n ) {\n const msg = await this.repository.getMessage(objectUri.values.id as Uuid);\n if (msg instanceof Create) object = await msg.getObject(ctx);\n } else {\n object = await announce.getObject(ctx);\n }\n if (!isMessageObject(object)) return;\n const session = this.getSession(ctx);\n const actor = announce.actorId.href == session.actorId.href\n ? await session.getActor()\n : await announce.getActor(ctx);\n if (actor == null) return;\n const original = await createMessage(object, session, {});\n const sharedMessage: SharedMessage<MessageClass, TContextData> = {\n raw: announce,\n id: announce.id,\n actor,\n visibility: getMessageVisibility(announce.toIds, announce.ccIds, actor),\n original,\n };\n await this.onSharedMessage(session, sharedMessage);\n }\n\n async #parseLike(\n ctx: InboxContext<TContextData>,\n like: RawLike,\n ): Promise<\n { session: Session<TContextData>; like: Like<TContextData> } | undefined\n > {\n if (like.id == null || like.actorId == null) return undefined;\n const objectUri = ctx.parseUri(like.objectId);\n let object: Object | null = null;\n if (\n objectUri?.type === \"object\" &&\n // deno-lint-ignore no-explicit-any\n messageClasses.includes(objectUri.class as any)\n ) {\n const msg = await this.repository.getMessage(objectUri.values.id as Uuid);\n if (msg instanceof Create) object = await msg.getObject(ctx);\n } else {\n object = await like.getObject(ctx);\n }\n if (!isMessageObject(object)) return undefined;\n const session = this.getSession(ctx);\n const actor = like.actorId.href == session.actorId.href\n ? await session.getActor()\n : await like.getActor(ctx);\n if (actor == null) return;\n const message = await createMessage(object, session, {});\n return {\n session,\n like: {\n raw: like,\n id: like.id,\n actor,\n message,\n },\n };\n }\n\n async onLiked(ctx: InboxContext<TContextData>, like: RawLike): Promise<void> {\n if (like.name != null) return this.onReacted(ctx, like);\n if (this.onLike == null) return;\n const sessionAndLike = await this.#parseLike(ctx, like);\n if (sessionAndLike == null) return;\n const { session, like: likeObject } = sessionAndLike;\n await this.onLike(session, likeObject);\n }\n\n async onUnliked(ctx: InboxContext<TContextData>, undo: Undo): Promise<void> {\n const like = await undo.getObject(ctx);\n if (!(like instanceof RawLike)) return;\n if (like.name != null) return this.onUnreacted(ctx, undo);\n if (this.onUnlike == null) return;\n if (undo.actorId?.href !== like.actorId?.href) return;\n const sessionAndLike = await this.#parseLike(ctx, like);\n if (sessionAndLike == null) return;\n const { session, like: likeObject } = sessionAndLike;\n await this.onUnlike(session, likeObject);\n }\n\n async #parseReaction(\n ctx: InboxContext<TContextData>,\n react: EmojiReact | RawLike,\n ): Promise<\n | { session: Session<TContextData>; reaction: Reaction<TContextData> }\n | undefined\n > {\n if (react.id == null || react.actorId == null || react.name == null) {\n return undefined;\n }\n let emoji: Emoji | APEmoji | undefined;\n if (isEmoji(react.name)) {\n emoji = react.name;\n } else if (\n typeof react.name === \"string\" && react.name.startsWith(\":\") &&\n react.name.endsWith(\":\")\n ) {\n for await (const tag of react.getTags(ctx)) {\n if (tag instanceof APEmoji && tag.name === react.name) {\n emoji = tag;\n break;\n }\n }\n }\n if (emoji == null) return undefined;\n const objectUri = ctx.parseUri(react.objectId);\n let object: Object | null = null;\n if (\n objectUri?.type === \"object\" &&\n // deno-lint-ignore no-explicit-any\n messageClasses.includes(objectUri.class as any)\n ) {\n const msg = await this.repository.getMessage(objectUri.values.id as Uuid);\n if (msg instanceof Create) object = await msg.getObject(ctx);\n } else {\n object = await react.getObject(ctx);\n }\n if (!isMessageObject(object)) return undefined;\n const session = this.getSession(ctx);\n const actor = react.actorId.href == session.actorId.href\n ? await session.getActor()\n : await react.getActor(ctx);\n if (actor == null) return;\n const message = await createMessage(object, session, {});\n return {\n session,\n reaction: {\n raw: react,\n id: react.id,\n actor,\n message,\n emoji,\n },\n };\n }\n\n async onReacted(\n ctx: InboxContext<TContextData>,\n react: EmojiReact | RawLike,\n ): Promise<void> {\n if (this.onReact == null) return;\n const sessionAndReaction = await this.#parseReaction(ctx, react);\n if (sessionAndReaction == null) return;\n const { session, reaction } = sessionAndReaction;\n await this.onReact(session, reaction);\n }\n\n async onUnreacted(\n ctx: InboxContext<TContextData>,\n undo: Undo,\n ): Promise<void> {\n if (this.onUnreact == null) return;\n const react = await undo.getObject(ctx);\n if (!(react instanceof EmojiReact || react instanceof RawLike)) return;\n if (undo.actorId?.href !== react.actorId?.href) return;\n const sessionAndReaction = await this.#parseReaction(ctx, react);\n if (sessionAndReaction == null) return;\n const { session, reaction } = sessionAndReaction;\n await this.onUnreact(session, reaction);\n }\n\n dispatchNodeInfo(_ctx: Context<TContextData>): NodeInfo {\n return {\n software: this.software!,\n protocols: [\"activitypub\"],\n services: {\n outbound: [\"atom1.0\"], // TODO\n },\n usage: {\n users: {\n total: 1,\n activeMonth: 1, // FIXME\n activeHalfyear: 1, // FIXME\n },\n localPosts: 0, // FIXME\n localComments: 0,\n },\n };\n }\n\n getSession(\n origin: string | URL,\n contextData: TContextData,\n ): SessionImpl<TContextData>;\n getSession(origin: string | URL): SessionImpl<TContextData>;\n getSession(context: Context<TContextData>): SessionImpl<TContextData>;\n\n getSession(\n origin: string | URL | Context<TContextData>,\n contextData?: TContextData,\n ): SessionImpl<TContextData> {\n const ctx = typeof origin === \"string\" || origin instanceof URL\n ? this.federation.createContext(new URL(origin), contextData!)\n : origin;\n return new SessionImpl(this, ctx);\n }\n\n async fetch(request: Request, contextData: TContextData): Promise<Response> {\n if (this.behindProxy) {\n request = await getXForwardedRequest(request);\n }\n const url = new URL(request.url);\n if (\n url.pathname.startsWith(\"/.well-known/\") ||\n url.pathname.startsWith(\"/ap/\") ||\n url.pathname.startsWith(\"/nodeinfo/\")\n ) {\n return await this.federation.fetch(request, { contextData });\n }\n const match = /^\\/emojis\\/([a-z0-9-_]+)(?:$|\\.)/.exec(url.pathname);\n if (match != null) {\n const customEmoji = this.customEmojis[match[1]];\n if (customEmoji == null || !(\"file\" in customEmoji)) {\n return new Response(\"Not Found\", { status: 404 });\n }\n let file: fs.FileHandle;\n try {\n file = await fs.open(customEmoji.file, \"r\");\n } catch (error) {\n if (\n typeof error === \"object\" && error != null && \"code\" in error &&\n error.code === \"ENOENT\"\n ) {\n return new Response(\"Not Found\", { status: 404 });\n }\n throw error;\n }\n const fileInfo = await file.stat();\n return new Response(file.readableWebStream(), {\n headers: {\n \"Content-Type\": customEmoji.type,\n \"Content-Length\": fileInfo.size.toString(),\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n \"Last-Modified\": (fileInfo.mtime ?? new Date()).toUTCString(),\n \"ETag\": `\"${fileInfo.mtime?.getTime().toString(36)}${\n fileInfo.size.toString(36)\n }\"`,\n },\n });\n }\n return await app.fetch(request, { bot: this, contextData });\n }\n\n getEmoji(\n ctx: Context<TContextData>,\n name: string,\n data: CustomEmoji,\n ): APEmoji {\n let url: URL;\n if (\"url\" in data) {\n url = new URL(data.url);\n } else {\n // @ts-ignore: data.type satisfies keyof typeof mimeDb\n const t = mimeDb[data.type];\n url = new URL(\n `/emojis/${name}${\n t == null || t.extensions == null || t.extensions.length < 1\n ? \"\"\n : `.${t.extensions[0]}`\n }`,\n ctx.origin,\n );\n }\n return new APEmoji({\n id: ctx.getObjectUri(APEmoji, { name }),\n name: `:${name}:`,\n icon: new Image({\n mediaType: data.type,\n url,\n }),\n });\n }\n\n addCustomEmoji<TEmojiName extends string>(\n name: TEmojiName,\n data: CustomEmoji,\n ): DeferredCustomEmoji<TContextData> {\n if (!name.match(/^[a-z0-9-_]+$/i)) {\n throw new TypeError(\n `Invalid custom emoji name: ${name}. It must match /^[a-z0-9-_]+$/i.`,\n );\n } else if (name in this.customEmojis) {\n throw new TypeError(`Duplicate custom emoji name: ${name}`);\n } else if (!data.type.startsWith(\"image/\")) {\n throw new TypeError(`Unsupported media type: ${data.type}`);\n }\n this.customEmojis[name] = data;\n return (session: Session<TContextData>) =>\n this.getEmoji(\n session.context,\n name,\n data,\n );\n }\n\n addCustomEmojis<TEmojiName extends string>(\n emojis: Readonly<Record<TEmojiName, CustomEmoji>>,\n ): Readonly<Record<TEmojiName, DeferredCustomEmoji<TContextData>>> {\n const emojiMap = {} as Record<\n TEmojiName,\n DeferredCustomEmoji<TContextData>\n >;\n for (const name in emojis) {\n emojiMap[name] = this.addCustomEmoji(name, emojis[name]);\n }\n return emojiMap;\n }\n}\n"],"mappings":"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"}
package/dist/deno.js CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  //#region deno.json
6
6
  var name = "@fedify/botkit";
7
- var version = "0.3.0-dev.115+d719ad73";
7
+ var version = "0.3.0-dev.119+a1068dd9";
8
8
  var license = "AGPL-3.0-only";
9
9
  var unstable = ["kv", "temporal"];
10
10
  var exports = {
@@ -21,7 +21,7 @@ var exports = {
21
21
  "./text": "./src/text.ts"
22
22
  };
23
23
  var imports = {
24
- "@fedify/fedify": "jsr:@fedify/fedify@^1.7.1",
24
+ "@fedify/fedify": "jsr:@fedify/fedify@^1.8.0-dev.910+8a000b1c",
25
25
  "@fedify/markdown-it-hashtag": "jsr:@fedify/markdown-it-hashtag@^0.3.0",
26
26
  "@fedify/markdown-it-mention": "jsr:@fedify/markdown-it-mention@^0.3.0",
27
27
  "@logtape/logtape": "jsr:@logtape/logtape@^1.0.0",
package/dist/deno.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@fedify/botkit\",\n \"version\": \"0.3.0-dev.115+d719ad73\",\n \"license\": \"AGPL-3.0-only\",\n \"unstable\": [\n \"kv\",\n \"temporal\"\n ],\n \"exports\": {\n \".\": \"./src/mod.ts\",\n \"./bot\": \"./src/bot.ts\",\n \"./emoji\": \"./src/emoji.ts\",\n \"./events\": \"./src/events.ts\",\n \"./follow\": \"./src/follow.ts\",\n \"./message\": \"./src/message.ts\",\n \"./poll\": \"./src/poll.ts\",\n \"./reaction\": \"./src/reaction.ts\",\n \"./repository\": \"./src/repository.ts\",\n \"./session\": \"./src/session.ts\",\n \"./text\": \"./src/text.ts\"\n },\n \"imports\": {\n \"@fedify/fedify\": \"jsr:@fedify/fedify@^1.7.1\",\n \"@fedify/markdown-it-hashtag\": \"jsr:@fedify/markdown-it-hashtag@^0.3.0\",\n \"@fedify/markdown-it-mention\": \"jsr:@fedify/markdown-it-mention@^0.3.0\",\n \"@logtape/logtape\": \"jsr:@logtape/logtape@^1.0.0\",\n \"@phensley/language-tag\": \"npm:@phensley/language-tag@^1.12.2\",\n \"hono\": \"jsr:@hono/hono@^4.8.2\",\n \"html-entities\": \"npm:html-entities@^2.6.0\",\n \"markdown-it\": \"npm:markdown-it@^14.1.0\",\n \"mime-db\": \"npm:mime-db@^1.54.0\",\n \"tsdown\": \"npm:tsdown@^0.12.8\",\n \"uuid\": \"npm:uuid@^11.1.0\",\n \"x-forwarded-fetch\": \"jsr:@hongminhee/x-forwarded-fetch@^0.2.0\",\n \"xss\": \"npm:xss@^1.0.15\"\n },\n \"nodeModulesDir\": \"none\",\n \"exclude\": [\n \".github\",\n \".vscode\",\n \"dist\",\n \"docs\",\n \"src/css\"\n ],\n \"fmt\": {\n \"exclude\": [\n \"*.md\",\n \"*.yaml\",\n \"*.yml\",\n \"src/static/*.ts\"\n ]\n },\n \"tasks\": {\n \"check\": \"deno check src/ && deno lint && deno fmt --check && deno publish --dry-run --allow-dirty && deno run scripts/check_versions.ts\",\n \"test\": \"deno test --allow-env=NODE_V8_COVERAGE,JEST_WORKER_ID --allow-net=hollo.social --parallel\",\n \"test:node\": \"pnpm install && pnpm test\",\n \"test-all\": {\n \"dependencies\": [\n \"check\",\n \"test\",\n \"test:node\"\n ]\n },\n \"coverage\": \"deno task test --coverage --clean && deno coverage --html\",\n \"hooks:install\": \"deno run --allow-read=deno.json,.git/hooks/ --allow-write=.git/hooks/ jsr:@hongminhee/deno-task-hooks\",\n \"hooks:pre-commit\": \"deno task check\"\n }\n}\n"],"mappings":";;;;;WACU;cACG;cACA;eACC,CACV,MACA,UACD;cACU;CACT,KAAK;CACL,SAAS;CACT,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,UAAU;CACV,cAAc;CACd,gBAAgB;CAChB,aAAa;CACb,UAAU;AACX;cACU;CACT,kBAAkB;CAClB,+BAA+B;CAC/B,+BAA+B;CAC/B,oBAAoB;CACpB,0BAA0B;CAC1B,QAAQ;CACR,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,UAAU;CACV,QAAQ;CACR,qBAAqB;CACrB,OAAO;AACR;qBACiB;cACP;CACT;CACA;CACA;CACA;CACA;AACD;UACM,EACL,WAAW;CACT;CACA;CACA;CACA;AACD,EACF;YACQ;CACP,SAAS;CACT,QAAQ;CACR,aAAa;CACb,YAAY,EACV,gBAAgB;EACd;EACA;EACA;CACD,EACF;CACD,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;AACrB;mBAlEH;;;;;;;;;;;AAmEC"}
1
+ {"version":3,"file":"deno.js","names":[],"sources":["../deno.json"],"sourcesContent":["{\n \"name\": \"@fedify/botkit\",\n \"version\": \"0.3.0-dev.119+a1068dd9\",\n \"license\": \"AGPL-3.0-only\",\n \"unstable\": [\n \"kv\",\n \"temporal\"\n ],\n \"exports\": {\n \".\": \"./src/mod.ts\",\n \"./bot\": \"./src/bot.ts\",\n \"./emoji\": \"./src/emoji.ts\",\n \"./events\": \"./src/events.ts\",\n \"./follow\": \"./src/follow.ts\",\n \"./message\": \"./src/message.ts\",\n \"./poll\": \"./src/poll.ts\",\n \"./reaction\": \"./src/reaction.ts\",\n \"./repository\": \"./src/repository.ts\",\n \"./session\": \"./src/session.ts\",\n \"./text\": \"./src/text.ts\"\n },\n \"imports\": {\n \"@fedify/fedify\": \"jsr:@fedify/fedify@^1.8.0-dev.910+8a000b1c\",\n \"@fedify/markdown-it-hashtag\": \"jsr:@fedify/markdown-it-hashtag@^0.3.0\",\n \"@fedify/markdown-it-mention\": \"jsr:@fedify/markdown-it-mention@^0.3.0\",\n \"@logtape/logtape\": \"jsr:@logtape/logtape@^1.0.0\",\n \"@phensley/language-tag\": \"npm:@phensley/language-tag@^1.12.2\",\n \"hono\": \"jsr:@hono/hono@^4.8.2\",\n \"html-entities\": \"npm:html-entities@^2.6.0\",\n \"markdown-it\": \"npm:markdown-it@^14.1.0\",\n \"mime-db\": \"npm:mime-db@^1.54.0\",\n \"tsdown\": \"npm:tsdown@^0.12.8\",\n \"uuid\": \"npm:uuid@^11.1.0\",\n \"x-forwarded-fetch\": \"jsr:@hongminhee/x-forwarded-fetch@^0.2.0\",\n \"xss\": \"npm:xss@^1.0.15\"\n },\n \"nodeModulesDir\": \"none\",\n \"exclude\": [\n \".github\",\n \".vscode\",\n \"dist\",\n \"docs\",\n \"src/css\"\n ],\n \"fmt\": {\n \"exclude\": [\n \"*.md\",\n \"*.yaml\",\n \"*.yml\",\n \"src/static/*.ts\"\n ]\n },\n \"tasks\": {\n \"check\": \"deno check src/ && deno lint && deno fmt --check && deno publish --dry-run --allow-dirty && deno run scripts/check_versions.ts\",\n \"test\": \"deno test --allow-env=NODE_V8_COVERAGE,JEST_WORKER_ID --allow-net=hollo.social --parallel\",\n \"test:node\": \"pnpm install && pnpm test\",\n \"test-all\": {\n \"dependencies\": [\n \"check\",\n \"test\",\n \"test:node\"\n ]\n },\n \"coverage\": \"deno task test --coverage --clean && deno coverage --html\",\n \"hooks:install\": \"deno run --allow-read=deno.json,.git/hooks/ --allow-write=.git/hooks/ jsr:@hongminhee/deno-task-hooks\",\n \"hooks:pre-commit\": \"deno task check\"\n }\n}\n"],"mappings":";;;;;WACU;cACG;cACA;eACC,CACV,MACA,UACD;cACU;CACT,KAAK;CACL,SAAS;CACT,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,UAAU;CACV,cAAc;CACd,gBAAgB;CAChB,aAAa;CACb,UAAU;AACX;cACU;CACT,kBAAkB;CAClB,+BAA+B;CAC/B,+BAA+B;CAC/B,oBAAoB;CACpB,0BAA0B;CAC1B,QAAQ;CACR,iBAAiB;CACjB,eAAe;CACf,WAAW;CACX,UAAU;CACV,QAAQ;CACR,qBAAqB;CACrB,OAAO;AACR;qBACiB;cACP;CACT;CACA;CACA;CACA;CACA;AACD;UACM,EACL,WAAW;CACT;CACA;CACA;CACA;AACD,EACF;YACQ;CACP,SAAS;CACT,QAAQ;CACR,aAAa;CACb,YAAY,EACV,gBAAgB;EACd;EACA;EACA;CACD,EACF;CACD,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;AACrB;mBAlEH;;;;;;;;;;;AAmEC"}
@@ -141,6 +141,40 @@ interface Repository {
141
141
  * exist.
142
142
  */
143
143
  getFollowee(followeeId: URL): Promise<Follow | undefined>;
144
+ /**
145
+ * Records a vote in a poll. If the same voter had already voted for the
146
+ * same option in a poll, the vote will be silently ignored.
147
+ * @param messageId The UUID of the poll message to vote on.
148
+ * @param voterId The ID of the voter. It should be a URL of the actor who is
149
+ * voting.
150
+ * @param option The option that the voter is voting for. It should be one of
151
+ * the options in the poll. If the poll allows multiple
152
+ * selections, this should be a single option that the voter is
153
+ * voting for, which is one of multiple calls to this method.
154
+ * @since 0.3.0
155
+ */
156
+ vote(messageId: Uuid, voterId: URL, option: string): Promise<void>;
157
+ /**
158
+ * Counts the number of voters in a poll. Even if the poll allows multiple
159
+ * selections, each voter is counted only once.
160
+ * @param messageId The UUID of the poll message to count voters for.
161
+ * @returns The number of voters in the poll. If the poll does not exist,
162
+ * 0 will be returned.
163
+ * @since 0.3.0
164
+ */
165
+ countVoters(messageId: Uuid): Promise<number>;
166
+ /**
167
+ * Counts the votes for each option in a poll. If the poll allows multiple
168
+ * selections, each option is counted separately, and the same voter can
169
+ * vote for multiple options.
170
+ * @param messageId The UUID of the poll message to count votes for.
171
+ * @returns A record where the keys are the options and the values are
172
+ * the number of votes for each option. If the poll does not exist,
173
+ * an empty record will be returned. Some options may not be
174
+ * present in the record if no votes were cast for them.
175
+ * @since 0.3.0
176
+ */
177
+ countVotes(messageId: Uuid): Promise<Readonly<Record<string, number>>>;
144
178
  }
145
179
  /**
146
180
  * Options for getting messages from the repository.
@@ -218,6 +252,12 @@ interface KvStoreRepositoryPrefixes {
218
252
  * @default `["_botkit", "follows"]`
219
253
  */
220
254
  readonly follows: KvKey$1;
255
+ /**
256
+ * The key prefix used for storing poll votes.
257
+ * @default `["_botkit", "polls"]`
258
+ * @since 0.3.0
259
+ */
260
+ readonly polls: KvKey$1;
221
261
  }
222
262
  /**
223
263
  * A repository for storing bot data using a key-value store.
@@ -250,6 +290,9 @@ declare class KvRepository implements Repository {
250
290
  addFollowee(followeeId: URL, follow: Follow): Promise<void>;
251
291
  removeFollowee(followeeId: URL): Promise<Follow | undefined>;
252
292
  getFollowee(followeeId: URL): Promise<Follow | undefined>;
293
+ vote(messageId: Uuid, voterId: URL, option: string): Promise<void>;
294
+ countVoters(messageId: Uuid): Promise<number>;
295
+ countVotes(messageId: Uuid): Promise<Readonly<Record<string, number>>>;
253
296
  }
254
297
  /**
255
298
  * A repository for storing bot data in memory. This repository is not
@@ -262,6 +305,7 @@ declare class MemoryRepository implements Repository {
262
305
  followRequests: Record<string, string>;
263
306
  sentFollows: Record<string, Follow>;
264
307
  followees: Record<string, Follow>;
308
+ polls: Record<Uuid, Record<string, Set<string>>>;
265
309
  setKeyPairs(keyPairs: CryptoKeyPair[]): Promise<void>;
266
310
  getKeyPairs(): Promise<CryptoKeyPair[] | undefined>;
267
311
  addMessage(id: Uuid, activity: Create$1 | Announce$1): Promise<void>;
@@ -281,6 +325,9 @@ declare class MemoryRepository implements Repository {
281
325
  addFollowee(followeeId: URL, follow: Follow): Promise<void>;
282
326
  removeFollowee(followeeId: URL): Promise<Follow | undefined>;
283
327
  getFollowee(followeeId: URL): Promise<Follow | undefined>;
328
+ vote(messageId: Uuid, voterId: URL, option: string): Promise<void>;
329
+ countVoters(messageId: Uuid): Promise<number>;
330
+ countVotes(messageId: Uuid): Promise<Readonly<Record<string, number>>>;
284
331
  }
285
332
  /**
286
333
  * A repository decorator that adds an in-memory cache layer on top of another
@@ -322,6 +369,9 @@ declare class MemoryCachedRepository implements Repository {
322
369
  addFollowee(followeeId: URL, follow: Follow): Promise<void>;
323
370
  removeFollowee(followeeId: URL): Promise<Follow | undefined>;
324
371
  getFollowee(followeeId: URL): Promise<Follow | undefined>;
372
+ vote(messageId: Uuid, voterId: URL, option: string): Promise<void>;
373
+ countVoters(messageId: Uuid): Promise<number>;
374
+ countVotes(messageId: Uuid): Promise<Readonly<Record<string, number>>>;
325
375
  }
326
376
  //# sourceMappingURL=repository.d.ts.map
327
377
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","names":[],"sources":["../src/repository.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.d.ts","names":[],"sources":["../src/repository.ts"],"sourcesContent":[],"mappings":"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"}