@fedify/botkit 0.3.0-dev.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +75 -0
  3. package/dist/bot-impl.d.ts +111 -0
  4. package/dist/bot-impl.d.ts.map +1 -0
  5. package/dist/bot-impl.js +602 -0
  6. package/dist/bot-impl.js.map +1 -0
  7. package/dist/bot-impl.test.d.ts +2 -0
  8. package/dist/bot-impl.test.js +1642 -0
  9. package/dist/bot-impl.test.js.map +1 -0
  10. package/dist/bot.d.ts +270 -0
  11. package/dist/bot.d.ts.map +1 -0
  12. package/dist/bot.js +118 -0
  13. package/dist/bot.js.map +1 -0
  14. package/dist/bot.test.d.ts +2 -0
  15. package/dist/bot.test.js +80 -0
  16. package/dist/bot.test.js.map +1 -0
  17. package/dist/components/Layout.d.ts +26 -0
  18. package/dist/components/Layout.d.ts.map +1 -0
  19. package/dist/components/Layout.js +36 -0
  20. package/dist/components/Layout.js.map +1 -0
  21. package/dist/components/Message.d.ts +21 -0
  22. package/dist/components/Message.d.ts.map +1 -0
  23. package/dist/components/Message.js +99 -0
  24. package/dist/components/Message.js.map +1 -0
  25. package/dist/components/Message.test.d.ts +2 -0
  26. package/dist/components/Message.test.js +32 -0
  27. package/dist/components/Message.test.js.map +1 -0
  28. package/dist/deno.js +73 -0
  29. package/dist/deno.js.map +1 -0
  30. package/dist/emoji.d.ts +87 -0
  31. package/dist/emoji.d.ts.map +1 -0
  32. package/dist/emoji.js +37 -0
  33. package/dist/emoji.js.map +1 -0
  34. package/dist/emoji.test.d.ts +2 -0
  35. package/dist/emoji.test.js +109 -0
  36. package/dist/emoji.test.js.map +1 -0
  37. package/dist/events.d.ts +110 -0
  38. package/dist/events.d.ts.map +1 -0
  39. package/dist/events.js +4 -0
  40. package/dist/follow-impl.d.ts +23 -0
  41. package/dist/follow-impl.d.ts.map +1 -0
  42. package/dist/follow-impl.js +51 -0
  43. package/dist/follow-impl.js.map +1 -0
  44. package/dist/follow-impl.test.d.ts +2 -0
  45. package/dist/follow-impl.test.js +110 -0
  46. package/dist/follow-impl.test.js.map +1 -0
  47. package/dist/follow.d.ts +44 -0
  48. package/dist/follow.d.ts.map +1 -0
  49. package/dist/follow.js +4 -0
  50. package/dist/message-impl.d.ts +54 -0
  51. package/dist/message-impl.d.ts.map +1 -0
  52. package/dist/message-impl.js +439 -0
  53. package/dist/message-impl.js.map +1 -0
  54. package/dist/message-impl.test.d.ts +2 -0
  55. package/dist/message-impl.test.js +519 -0
  56. package/dist/message-impl.test.js.map +1 -0
  57. package/dist/message.d.ts +223 -0
  58. package/dist/message.d.ts.map +1 -0
  59. package/dist/message.js +8 -0
  60. package/dist/mod.d.ts +13 -0
  61. package/dist/mod.js +13 -0
  62. package/dist/pages.d.ts +20 -0
  63. package/dist/pages.d.ts.map +1 -0
  64. package/dist/pages.js +361 -0
  65. package/dist/pages.js.map +1 -0
  66. package/dist/reaction.d.ts +90 -0
  67. package/dist/reaction.d.ts.map +1 -0
  68. package/dist/reaction.js +7 -0
  69. package/dist/repository.d.ts +323 -0
  70. package/dist/repository.d.ts.map +1 -0
  71. package/dist/repository.js +483 -0
  72. package/dist/repository.js.map +1 -0
  73. package/dist/repository.test.d.ts +2 -0
  74. package/dist/repository.test.js +336 -0
  75. package/dist/repository.test.js.map +1 -0
  76. package/dist/session-impl.d.ts +32 -0
  77. package/dist/session-impl.d.ts.map +1 -0
  78. package/dist/session-impl.js +195 -0
  79. package/dist/session-impl.js.map +1 -0
  80. package/dist/session-impl.test.d.ts +20 -0
  81. package/dist/session-impl.test.d.ts.map +1 -0
  82. package/dist/session-impl.test.js +464 -0
  83. package/dist/session-impl.test.js.map +1 -0
  84. package/dist/session.d.ts +139 -0
  85. package/dist/session.d.ts.map +1 -0
  86. package/dist/session.js +4 -0
  87. package/dist/text.d.ts +391 -0
  88. package/dist/text.d.ts.map +1 -0
  89. package/dist/text.js +640 -0
  90. package/dist/text.js.map +1 -0
  91. package/dist/text.test.d.ts +2 -0
  92. package/dist/text.test.js +473 -0
  93. package/dist/text.test.js.map +1 -0
  94. package/package.json +137 -0
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ <img src="./logo.svg" alt="BotKit by Fedify" width="203" height="165">
2
+
3
+ [BotKit] by Fedify
4
+ ==================
5
+
6
+ [![JSR][JSR badge]][JSR]
7
+ [![GitHub Actions][GitHub Actions badge]][GitHub Actions]
8
+ [![Codecov][Codecov badge]][Codecov]
9
+ [![Fediverse][Fediverse badge]][Fediverse]
10
+
11
+ > [!NOTE]
12
+ > BotKit is still in early development. The API may change in the future.
13
+ > Although it currently supports only Deno, it will support Node.js and Bun
14
+ > later.
15
+
16
+ [BotKit] is a framework for creating [ActivityPub] bots. It is powered by
17
+ [Fedify], a lower-level library for creating ActivityPub server applications.
18
+ Unlike Mastodon bots, BotKit is designed to create a standalone ActivityPub bot,
19
+ which is a complete ActivityPub server in itself and not limited to Mastodon's
20
+ capabilities (such as the 500-character limit per post).
21
+
22
+ BotKit's API is so simple and easy to use that you can create a complete bot in
23
+ a single TypeScript file. Here's an example of a simple bot that just greets:
24
+
25
+ ~~~~ typescript
26
+ import { createBot, mention, text } from "@fedify/botkit";
27
+ import { RedisKvStore } from "@fedify/redis";
28
+ import { Redis } from "ioredis";
29
+
30
+ // Create a bot instance:
31
+ const bot = createBot<void>({
32
+ // The bot will have fediverse handle "@greetbot@mydomain":
33
+ username: "greetbot",
34
+ // Set the display name:
35
+ name: "Greet Bot",
36
+ // Set the profile icon (avatar):
37
+ icon: new URL("https://mydomain/icon.png"),
38
+ // Set the bio:
39
+ summary: text`Hi, there! I'm a simple fediverse bot created by ${
40
+ mention("@hongminhee@hollo.social")}.`,
41
+ // Use Redis as a key-value store:
42
+ kv: new RedisKvStore(new Redis()),
43
+ // Use Redis as a message queue:
44
+ queue: new RedisMessageQueue(() => new Redis()),
45
+ });
46
+
47
+ // A bot can respond to a mention:
48
+ bot.onMention = async (session, message) => {
49
+ await message.reply(text`Hi, ${message.actor}!`);
50
+ };
51
+
52
+ // Or, a bot also can actively publish a post:
53
+ const session = bot.getSession("https://mydomain/");
54
+ setInterval(async () => {
55
+ await session.publish(text`Hi, folks! It's an hourly greeting.`);
56
+ }, 1000 * 60 * 60);
57
+
58
+ export default bot;
59
+ ~~~~
60
+
61
+ For more information, see the [BotKit docs][BotKit].
62
+
63
+ [BotKit]: https://botkit.fedify.dev/
64
+ [JSR]: https://jsr.io/@fedify/botkit
65
+ [JSR badge]: https://jsr.io/badges/@fedify/botkit
66
+ [GitHub Actions]: https://github.com/fedify-dev/botkit/actions/workflows/main.yaml
67
+ [GitHub Actions badge]: https://github.com/fedify-dev/botkit/actions/workflows/main.yaml/badge.svg
68
+ [Codecov]: https://codecov.io/gh/fedify-dev/botkit
69
+ [Codecov badge]: https://codecov.io/gh/fedify-dev/botkit/graph/badge.svg?token=1KVVER1626
70
+ [Fediverse]: https://hollo.social/@botkit
71
+ [Fediverse badge]: https://fedi-badge.deno.dev/@botkit@hollo.social/followers.svg
72
+ [ActivityPub]: https://activitypub.rocks/
73
+ [Fedify]: https://fedify.dev/
74
+
75
+ <!-- cSpell: ignore greetbot mydomain -->
@@ -0,0 +1,111 @@
1
+ import { Temporal, toTemporalInstant } from "@js-temporal/polyfill";
2
+ Date.prototype.toTemporalInstant = toTemporalInstant;
3
+ import { Text } from "./text.js";
4
+ import { MessageClass } from "./message.js";
5
+ import { Repository } from "./repository.js";
6
+ import { Session } from "./session.js";
7
+ import { CustomEmoji, DeferredCustomEmoji } from "./emoji.js";
8
+ import { AcceptEventHandler, FollowEventHandler, LikeEventHandler, MentionEventHandler, MessageEventHandler, QuoteEventHandler, ReactionEventHandler, RejectEventHandler, ReplyEventHandler, SharedMessageEventHandler, UndoneReactionEventHandler, UnfollowEventHandler, UnlikeEventHandler } from "./events.js";
9
+ import { Bot, CreateBotOptions, PagesOptions } from "./bot.js";
10
+ import { SessionImpl } from "./session-impl.js";
11
+ import { Accept, Activity, Actor, Announce, Application, Create, CryptographicKey, Emoji, EmojiReact, Follow, Image, Like, Link, PropertyValue, Reject, Service, Undo } from "@fedify/fedify/vocab";
12
+ import { Context, Federation, InboxContext, NodeInfo, Object as Object$2, PageItems, Recipient as Recipient$1, RequestContext, Software } from "@fedify/fedify";
13
+
14
+ //#region src/bot-impl.d.ts
15
+ interface BotImplOptions<TContextData> extends CreateBotOptions<TContextData> {
16
+ collectionWindow?: number;
17
+ }
18
+ declare class BotImpl<TContextData> implements Bot<TContextData> {
19
+ #private;
20
+ readonly identifier: string;
21
+ readonly class: typeof Service | typeof Application;
22
+ readonly username: string;
23
+ readonly name?: string;
24
+ readonly summary?: Text<"block", TContextData>;
25
+ readonly icon?: URL | Image;
26
+ readonly image?: URL | Image;
27
+ readonly properties: Record<string, Text<"block" | "inline", TContextData>>;
28
+ readonly followerPolicy: "accept" | "reject" | "manual";
29
+ readonly customEmojis: Record<string, CustomEmoji>;
30
+ readonly repository: Repository;
31
+ readonly software?: Software;
32
+ readonly behindProxy: boolean;
33
+ readonly pages: Required<PagesOptions>;
34
+ readonly collectionWindow: number;
35
+ readonly federation: Federation<TContextData>;
36
+ onFollow?: FollowEventHandler<TContextData>;
37
+ onUnfollow?: UnfollowEventHandler<TContextData>;
38
+ onAcceptFollow?: AcceptEventHandler<TContextData>;
39
+ onRejectFollow?: RejectEventHandler<TContextData>;
40
+ onMention?: MentionEventHandler<TContextData>;
41
+ onReply?: ReplyEventHandler<TContextData>;
42
+ onQuote?: QuoteEventHandler<TContextData>;
43
+ onMessage?: MessageEventHandler<TContextData>;
44
+ onSharedMessage?: SharedMessageEventHandler<TContextData>;
45
+ onLike?: LikeEventHandler<TContextData>;
46
+ onUnlike?: UnlikeEventHandler<TContextData>;
47
+ onReact?: ReactionEventHandler<TContextData>;
48
+ onUnreact?: UndoneReactionEventHandler<TContextData>;
49
+ constructor(options: BotImplOptions<TContextData>);
50
+ initialize(): void;
51
+ getActorSummary(session: Session<TContextData>): Promise<{
52
+ text: string;
53
+ tags: (Link | Object$2)[];
54
+ } | null>;
55
+ getActorProperties(session: Session<TContextData>): Promise<{
56
+ pairs: PropertyValue[];
57
+ tags: (Link | Object$2)[];
58
+ }>;
59
+ dispatchActor(ctx: Context<TContextData>, identifier: string): Promise<Actor | null>;
60
+ mapHandle(_ctx: Context<TContextData>, username: string): string | null;
61
+ dispatchActorKeyPairs(_ctx: Context<TContextData>, identifier: string): Promise<CryptoKeyPair[]>;
62
+ dispatchFollowers(_ctx: Context<TContextData>, identifier: string, cursor: string | null): Promise<PageItems<Recipient$1> | null>;
63
+ getFollowersFirstCursor(_ctx: Context<TContextData>, identifier: string): string | null;
64
+ countFollowers(_ctx: Context<TContextData>, identifier: string): Promise<number | null>;
65
+ getPermissionChecker(ctx: RequestContext<TContextData>): Promise<(object: Object$2) => boolean>;
66
+ dispatchOutbox(ctx: RequestContext<TContextData>, identifier: string, cursor: string | null): Promise<PageItems<Activity> | null>;
67
+ getOutboxFirstCursor(_ctx: Context<TContextData>, identifier: string): string | null;
68
+ countOutbox(_ctx: Context<TContextData>, identifier: string): Promise<number | null>;
69
+ dispatchFollow(_ctx: RequestContext<TContextData>, values: {
70
+ id: string;
71
+ }): Promise<Follow | null>;
72
+ authorizeFollow(_ctx: RequestContext<TContextData>, values: {
73
+ id: string;
74
+ }, _signedKey: CryptographicKey | null, signedKeyOwner: Actor | null): Promise<boolean>;
75
+ dispatchCreate(ctx: RequestContext<TContextData>, values: {
76
+ id: string;
77
+ }): Promise<Create | null>;
78
+ dispatchMessage<T extends MessageClass>(cls: new (values: any) => T, ctx: Context<TContextData> | RequestContext<TContextData>, id: string): Promise<T | null>;
79
+ dispatchAnnounce(ctx: RequestContext<TContextData>, values: {
80
+ id: string;
81
+ }): Promise<Announce | null>;
82
+ dispatchEmoji(ctx: Context<TContextData>, values: {
83
+ name: string;
84
+ }): Emoji | null;
85
+ dispatchSharedKey(_ctx: Context<TContextData>): {
86
+ identifier: string;
87
+ };
88
+ onFollowed(ctx: InboxContext<TContextData>, follow: Follow): Promise<void>;
89
+ onUnfollowed(ctx: InboxContext<TContextData>, undo: Undo): Promise<void>;
90
+ onFollowAccepted(ctx: InboxContext<TContextData>, accept: Accept): Promise<void>;
91
+ onFollowRejected(ctx: InboxContext<TContextData>, reject: Reject): Promise<void>;
92
+ onCreated(ctx: InboxContext<TContextData>, create: Create): Promise<void>;
93
+ onAnnounced(ctx: InboxContext<TContextData>, announce: Announce): Promise<void>;
94
+ onLiked(ctx: InboxContext<TContextData>, like: Like): Promise<void>;
95
+ onUnliked(ctx: InboxContext<TContextData>, undo: Undo): Promise<void>;
96
+ onReacted(ctx: InboxContext<TContextData>, react: EmojiReact | Like): Promise<void>;
97
+ onUnreacted(ctx: InboxContext<TContextData>, undo: Undo): Promise<void>;
98
+ dispatchNodeInfo(_ctx: Context<TContextData>): NodeInfo;
99
+ getSession(origin: string | URL, contextData: TContextData): SessionImpl<TContextData>;
100
+ getSession(origin: string | URL): SessionImpl<TContextData>;
101
+ getSession(context: Context<TContextData>): SessionImpl<TContextData>;
102
+ fetch(request: Request, contextData: TContextData): Promise<Response>;
103
+ getEmoji(ctx: Context<TContextData>, name: string, data: CustomEmoji): Emoji;
104
+ addCustomEmoji<TEmojiName extends string>(name: TEmojiName, data: CustomEmoji): DeferredCustomEmoji<TContextData>;
105
+ addCustomEmojis<TEmojiName extends string>(emojis: Readonly<Record<TEmojiName, CustomEmoji>>): Readonly<Record<TEmojiName, DeferredCustomEmoji<TContextData>>>;
106
+ }
107
+ //# sourceMappingURL=bot-impl.d.ts.map
108
+
109
+ //#endregion
110
+ export { BotImpl, BotImplOptions };
111
+ //# sourceMappingURL=bot-impl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot-impl.d.ts","names":[],"sources":["../src/bot-impl.ts"],"sourcesContent":[],"mappings":"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"}