@botpress/sdk 1.3.2 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +3 -3
- package/dist/bot/client/index.d.ts +4 -2
- package/dist/bot/client/types.d.ts +10 -0
- package/dist/bot/definition.d.ts +15 -4
- package/dist/bot/implementation.d.ts +478 -3
- package/dist/bot/server/index.d.ts +1 -1
- package/dist/bot/server/types.d.ts +115 -12
- package/dist/bot/types/generic.d.ts +2 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +4 -4
- package/dist/utils/array-utils.d.ts +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -11,27 +11,56 @@ export type BotContext = {
|
|
|
11
11
|
payload: string;
|
|
12
12
|
};
|
|
13
13
|
};
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
type IncomingEvents<TBot extends types.BaseBot> = {
|
|
15
|
+
[K in keyof types.EnumerateEvents<TBot>]: utils.Merge<client.Event, {
|
|
16
|
+
type: K;
|
|
17
|
+
payload: types.EnumerateEvents<TBot>[K];
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
type IncomingMessages<TBot extends types.BaseBot> = {
|
|
21
|
+
[K in keyof types.GetMessages<TBot>]: utils.Merge<client.Message, {
|
|
22
|
+
type: K;
|
|
23
|
+
payload: types.GetMessages<TBot>[K];
|
|
24
|
+
}>;
|
|
21
25
|
};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
type OutgoingMessageRequests<TBot extends types.BaseBot> = {
|
|
27
|
+
[K in keyof types.GetMessages<TBot>]: utils.Merge<client.ClientInputs['createMessage'], {
|
|
28
|
+
type: K;
|
|
29
|
+
payload: types.GetMessages<TBot>[K];
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
32
|
+
type OutgoingMessageResponses<TBot extends types.BaseBot> = {
|
|
33
|
+
[K in keyof types.GetMessages<TBot>]: utils.Merge<client.ClientOutputs['createMessage'], {
|
|
34
|
+
message: utils.Merge<client.Message, {
|
|
25
35
|
type: K;
|
|
26
36
|
payload: types.GetMessages<TBot>[K];
|
|
27
37
|
}>;
|
|
28
38
|
}>;
|
|
29
39
|
};
|
|
40
|
+
type OutgoingCallActionRequests<TBot extends types.BaseBot> = {
|
|
41
|
+
[K in keyof types.EnumerateActionInputs<TBot>]: utils.Merge<client.ClientInputs['callAction'], {
|
|
42
|
+
type: K;
|
|
43
|
+
input: types.EnumerateActionInputs<TBot>[K];
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
type OutgoingCallActionResponses<TBot extends types.BaseBot> = {
|
|
47
|
+
[K in keyof types.EnumerateActionOutputs<TBot>]: utils.Merge<client.ClientOutputs['callAction'], {
|
|
48
|
+
output: types.EnumerateActionOutputs<TBot>[K];
|
|
49
|
+
}>;
|
|
50
|
+
};
|
|
51
|
+
export type IncomingEvent<TBot extends types.BaseBot> = utils.ValueOf<IncomingEvents<TBot>>;
|
|
52
|
+
export type IncomingMessage<TBot extends types.BaseBot> = utils.ValueOf<IncomingMessages<TBot>>;
|
|
53
|
+
export type OutgoingMessageRequest<TBot extends types.BaseBot> = utils.ValueOf<OutgoingMessageRequests<TBot>>;
|
|
54
|
+
export type OutgoingMessageResponse<TBot extends types.BaseBot> = utils.ValueOf<OutgoingMessageResponses<TBot>>;
|
|
55
|
+
export type OutgoingCallActionRequest<TBot extends types.BaseBot> = utils.ValueOf<OutgoingCallActionRequests<TBot>>;
|
|
56
|
+
export type OutgoingCallActionResponse<TBot extends types.BaseBot> = utils.ValueOf<OutgoingCallActionResponses<TBot>>;
|
|
30
57
|
export type CommonHandlerProps<TBot extends types.BaseBot> = {
|
|
31
58
|
ctx: BotContext;
|
|
32
59
|
client: BotSpecificClient<TBot>;
|
|
60
|
+
self: BotHandlers<TBot>;
|
|
33
61
|
};
|
|
34
|
-
export type MessagePayload<TBot extends types.BaseBot> =
|
|
62
|
+
export type MessagePayload<TBot extends types.BaseBot> = {
|
|
63
|
+
message: IncomingMessage<TBot>;
|
|
35
64
|
user: client.User;
|
|
36
65
|
conversation: client.Conversation;
|
|
37
66
|
event: client.Event;
|
|
@@ -44,7 +73,9 @@ export type MessagePayload<TBot extends types.BaseBot> = MessageRequest<TBot> &
|
|
|
44
73
|
};
|
|
45
74
|
export type MessageHandlerProps<TBot extends types.BaseBot> = CommonHandlerProps<TBot> & MessagePayload<TBot>;
|
|
46
75
|
export type MessageHandler<TBot extends types.BaseBot> = (args: MessageHandlerProps<TBot>) => Promise<void>;
|
|
47
|
-
export type EventPayload<TBot extends types.BaseBot> =
|
|
76
|
+
export type EventPayload<TBot extends types.BaseBot> = {
|
|
77
|
+
event: IncomingEvent<TBot>;
|
|
78
|
+
};
|
|
48
79
|
export type EventHandlerProps<TBot extends types.BaseBot> = CommonHandlerProps<TBot> & EventPayload<TBot>;
|
|
49
80
|
export type EventHandler<TBot extends types.BaseBot> = (args: EventHandlerProps<TBot>) => Promise<void>;
|
|
50
81
|
export type StateExpiredPayload<_TBot extends types.BaseBot> = {
|
|
@@ -52,8 +83,80 @@ export type StateExpiredPayload<_TBot extends types.BaseBot> = {
|
|
|
52
83
|
};
|
|
53
84
|
export type StateExpiredHandlerProps<TBot extends types.BaseBot> = CommonHandlerProps<TBot> & StateExpiredPayload<TBot>;
|
|
54
85
|
export type StateExpiredHandler<TBot extends types.BaseBot> = (args: StateExpiredHandlerProps<TBot>) => Promise<void>;
|
|
86
|
+
export type ActionHandlerPayloads<TBot extends types.BaseBot> = {
|
|
87
|
+
[K in keyof TBot['actions']]: {
|
|
88
|
+
type?: K;
|
|
89
|
+
input: TBot['actions'][K]['input'];
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
export type ActionHandlerProps<TBot extends types.BaseBot> = {
|
|
93
|
+
[K in keyof TBot['actions']]: CommonHandlerProps<TBot> & ActionHandlerPayloads<TBot>[K];
|
|
94
|
+
};
|
|
95
|
+
export type ActionHandlers<TBot extends types.BaseBot> = {
|
|
96
|
+
[K in keyof TBot['actions']]: (props: ActionHandlerProps<TBot>[K]) => Promise<TBot['actions'][K]['output']>;
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* TODO:
|
|
100
|
+
* - add concept of stoppable / un-stoppable hooks (e.g. before_incoming_message Vs before_outgoing_message)
|
|
101
|
+
* - add "before_register", "after_register", "before_state_expired", "after_state_expired" hooks
|
|
102
|
+
*/
|
|
103
|
+
export type HookDefinitions<TBot extends types.BaseBot> = {
|
|
104
|
+
before_incoming_event: IncomingEvents<TBot> & {
|
|
105
|
+
'*': IncomingEvent<TBot>;
|
|
106
|
+
};
|
|
107
|
+
before_incoming_message: IncomingMessages<TBot> & {
|
|
108
|
+
'*': IncomingMessage<TBot>;
|
|
109
|
+
};
|
|
110
|
+
before_outgoing_message: OutgoingMessageRequests<TBot> & {
|
|
111
|
+
'*': OutgoingMessageRequest<TBot>;
|
|
112
|
+
};
|
|
113
|
+
before_call_action: OutgoingCallActionRequests<TBot> & {
|
|
114
|
+
'*': OutgoingCallActionRequest<TBot>;
|
|
115
|
+
};
|
|
116
|
+
after_incoming_event: IncomingEvents<TBot> & {
|
|
117
|
+
'*': IncomingEvent<TBot>;
|
|
118
|
+
};
|
|
119
|
+
after_incoming_message: IncomingMessages<TBot> & {
|
|
120
|
+
'*': IncomingMessage<TBot>;
|
|
121
|
+
};
|
|
122
|
+
after_outgoing_message: OutgoingMessageResponses<TBot> & {
|
|
123
|
+
'*': OutgoingMessageResponse<TBot>;
|
|
124
|
+
};
|
|
125
|
+
after_call_action: OutgoingCallActionResponses<TBot> & {
|
|
126
|
+
'*': OutgoingCallActionResponse<TBot>;
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
export type HookInputs<TBot extends types.BaseBot> = {
|
|
130
|
+
[H in keyof HookDefinitions<TBot>]: {
|
|
131
|
+
[T in keyof HookDefinitions<TBot>[H]]: {
|
|
132
|
+
client: BotSpecificClient<TBot>;
|
|
133
|
+
ctx: BotContext;
|
|
134
|
+
data: HookDefinitions<TBot>[H][T];
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
export type HookOutputs<TBot extends types.BaseBot> = {
|
|
139
|
+
[H in keyof HookDefinitions<TBot>]: {
|
|
140
|
+
[T in keyof HookDefinitions<TBot>[H]]: {
|
|
141
|
+
data: HookDefinitions<TBot>[H][T];
|
|
142
|
+
};
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
export type HookImplementations<TBot extends types.BaseBot> = {
|
|
146
|
+
[H in keyof HookDefinitions<TBot>]: {
|
|
147
|
+
[T in keyof HookDefinitions<TBot>[H]]: (input: HookInputs<TBot>[H][T]) => Promise<HookOutputs<TBot>[H][T] | undefined | void>;
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
export type HookImplementationsMap<TBot extends types.BaseBot> = {
|
|
151
|
+
[H in keyof HookDefinitions<TBot>]: {
|
|
152
|
+
[T in keyof HookDefinitions<TBot>[H]]?: HookImplementations<TBot>[H][T][];
|
|
153
|
+
};
|
|
154
|
+
};
|
|
55
155
|
export type BotHandlers<TBot extends types.BaseBot> = {
|
|
156
|
+
actionHandlers: ActionHandlers<TBot>;
|
|
56
157
|
messageHandlers: MessageHandler<TBot>[];
|
|
57
158
|
eventHandlers: EventHandler<TBot>[];
|
|
58
159
|
stateExpiredHandlers: StateExpiredHandler<TBot>[];
|
|
160
|
+
hooks: HookImplementationsMap<TBot>;
|
|
59
161
|
};
|
|
162
|
+
export {};
|
|
@@ -5,6 +5,7 @@ export type BaseBot = {
|
|
|
5
5
|
integrations: Record<string, BaseIntegration>;
|
|
6
6
|
events: Record<string, any>;
|
|
7
7
|
states: Record<string, any>;
|
|
8
|
+
actions: Record<string, Record<'input' | 'output', any>>;
|
|
8
9
|
};
|
|
9
10
|
/**
|
|
10
11
|
* Usefull for tests, allows to create a bot with only the properties you want to override
|
|
@@ -13,4 +14,5 @@ export type MakeBot<B extends Partial<BaseBot>> = {
|
|
|
13
14
|
integrations: utils.Default<B['integrations'], BaseBot['integrations']>;
|
|
14
15
|
events: utils.Default<B['events'], BaseBot['events']>;
|
|
15
16
|
states: utils.Default<B['states'], BaseBot['states']>;
|
|
17
|
+
actions: utils.Default<B['actions'], BaseBot['actions']>;
|
|
16
18
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -9,6 +9,6 @@ export {
|
|
|
9
9
|
* @deprecated use Context exported from '.botpress' instead
|
|
10
10
|
*/
|
|
11
11
|
IntegrationContext, } from './integration/server';
|
|
12
|
-
export { BotDefinition, BotDefinitionProps, BotImplementation as Bot, BotImplementationProps as BotProps, BotSpecificClient, TagDefinition as BotTagDefinition, StateType as BotStateType, StateDefinition as BotStateDefinition, RecurringEventDefinition as BotRecurringEventDefinition, EventDefinition as BotEventDefinition, ConfigurationDefinition as BotConfigurationDefinition, UserDefinition as BotUserDefinition, ConversationDefinition as BotConversationDefinition, MessageDefinition as BotMessageDefinition, } from './bot';
|
|
12
|
+
export { BotDefinition, BotDefinitionProps, BotImplementation as Bot, BotImplementationProps as BotProps, BotSpecificClient, TagDefinition as BotTagDefinition, StateType as BotStateType, StateDefinition as BotStateDefinition, RecurringEventDefinition as BotRecurringEventDefinition, EventDefinition as BotEventDefinition, ConfigurationDefinition as BotConfigurationDefinition, UserDefinition as BotUserDefinition, ConversationDefinition as BotConversationDefinition, MessageDefinition as BotMessageDefinition, ActionDefinition as BotActionDefinition, } from './bot';
|
|
13
13
|
export { InterfaceDeclaration, InterfaceDeclarationProps, } from './interface';
|
|
14
14
|
export { IntegrationPackage, InterfacePackage, } from './package';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var Be=Object.create;var x=Object.defineProperty;var ve=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Ie=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var P=(t,e)=>{for(var n in e)x(t,n,{get:e[n],enumerable:!0})},S=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of Ce(e))!Ee.call(t,a)&&a!==n&&x(t,a,{get:()=>e[a],enumerable:!(s=ve(e,a))||s.enumerable});return t},l=(t,e,n)=>(S(t,e,"default"),n&&S(n,e,"default")),J=(t,e,n)=>(n=t!=null?Be(Ie(t)):{},S(e||!t||!t.__esModule?x(n,"default",{value:t,enumerable:!0}):n,t)),Se=t=>S(x({},"__esModule",{value:!0}),t);var m={};P(m,{Bot:()=>O,BotDefinition:()=>A,BotSpecificClient:()=>B,Integration:()=>k,IntegrationDefinition:()=>D,IntegrationSpecificClient:()=>b,InterfaceDeclaration:()=>H,RuntimeError:()=>F.RuntimeError,botIdHeader:()=>v,botUserIdHeader:()=>j,configurationHeader:()=>C,configurationTypeHeader:()=>Z,integrationIdHeader:()=>N,isApiError:()=>F.isApiError,messages:()=>G,operationHeader:()=>I,parseBody:()=>y,serve:()=>E,typeHeader:()=>z,webhookIdHeader:()=>L});module.exports=Se(m);var G={};P(G,{defaults:()=>_e,markdown:()=>De});var i={};P(i,{default:()=>K});var W=require("@bpinternal/zui");l(i,require("@bpinternal/zui"));var K=W.z;var g=i.z.string().min(1),X=i.z.object({text:g}),Y=i.z.object({markdown:g}),ee=i.z.object({imageUrl:g}),te=i.z.object({audioUrl:g}),ne=i.z.object({videoUrl:g}),ie=i.z.object({fileUrl:g,title:g.optional()}),se=i.z.object({latitude:i.z.number(),longitude:i.z.number(),address:i.z.string().optional(),title:i.z.string().optional()}),oe=i.z.object({title:g,subtitle:g.optional(),imageUrl:g.optional(),actions:i.z.array(i.z.object({action:i.z.enum(["postback","url","say"]),label:g,value:g}))}),Q=i.z.object({text:g,options:i.z.array(i.z.object({label:g,value:g}))}),xe=i.z.object({items:i.z.array(oe)}),Pe=i.z.union([i.z.object({type:i.z.literal("text"),payload:X}),i.z.object({type:i.z.literal("markdown"),payload:Y}),i.z.object({type:i.z.literal("image"),payload:ee}),i.z.object({type:i.z.literal("audio"),payload:te}),i.z.object({type:i.z.literal("video"),payload:ne}),i.z.object({type:i.z.literal("file"),payload:ie}),i.z.object({type:i.z.literal("location"),payload:se})]),we=i.z.object({items:i.z.array(Pe)}),De={schema:Y},_e={text:{schema:X},image:{schema:ee},audio:{schema:te},video:{schema:ne},file:{schema:ie},location:{schema:se},carousel:{schema:xe},card:{schema:oe},dropdown:{schema:Q},choice:{schema:Q},bloc:{schema:we}};var v="x-bot-id",j="x-bot-user-id",N="x-integration-id",L="x-webhook-id",Z="x-bp-configuration-type",C="x-bp-configuration",I="x-bp-operation",z="x-bp-type";var ae=require("node:http");var T=console;function y(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}async function E(t,e=8072,n=ke){let s=(0,ae.createServer)(async(a,r)=>{try{let o=await Ue(a);if(o.path==="/health"){r.writeHead(200).end("ok");return}let c=await t(o);r.writeHead(c?.status??200,c?.headers??{}).end(c?.body??"{}")}catch(o){T.error("Error while handling request",{error:o?.message??"Internal error occured"}),r.writeHead(500).end(JSON.stringify({error:o?.message??"Internal error occured"}))}});return s.listen(e,()=>n(e)),s}async function Ue(t){let e=await Re(t),n={};for(let a=0;a<t.rawHeaders.length;a+=2){let r=t.rawHeaders[a].toLowerCase(),o=t.rawHeaders[a+1];n[r]=o}let s=new URL(t.url??"",t.headers.host?`http://${t.headers.host}`:"http://botpress.cloud");return{body:e,path:s.pathname,query:Me(s.search,"?"),headers:n,method:t.method?.toUpperCase()??"GET"}}function Me(t,e){return t.indexOf(e)===0?t.slice(e.length):t}async function Re(t){return new Promise((e,n)=>{if(t.method!=="POST"&&t.method!=="PUT"&&t.method!=="PATCH")return e(void 0);let s="";t.on("data",a=>s+=a.toString()),t.on("error",a=>n(a)),t.on("end",()=>e(s))})}function ke(t){T.info(`Listening on port ${t}`)}l(m,i,module.exports);var F=require("@botpress/client");var u={};P(u,{mapValues:()=>Ae,pairs:()=>re});var re=t=>Object.entries(t),Ae=(t,e)=>Object.fromEntries(re(t).map(([n,s])=>[n,e(s,n)]));var w=Symbol("schemaName"),ce=t=>t?u.mapValues(t,(n,s)=>({...n,[w]:s})):{},pe=t=>w in t&&t[w]!==void 0,le=t=>t[w];var D=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.identifier=e.identifier,this.description=e.description,this.configuration=e.configuration,this.configurations=e.configurations,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities,this.interfaces=e.interfaces}name;version;title;description;icon;readme;configuration;configurations;events;actions;channels;states;user;secrets;identifier;entities;interfaces;extend(e,n){let s=n(ce(this.entities)),a=u.pairs(s).find(([p,h])=>!pe(h));if(a)throw new Error(`Cannot extend interface "${e.definition.name}" with entity "${a[0]}"; the provided schema is not part of the integration's entities.`);let r=this;r.interfaces??={};let o=u.mapValues(s,p=>({name:le(p),schema:p.schema})),c=Object.values(o).map(p=>p.name),d=c.length===0?e.definition.name:`${e.definition.name}<${c.join(",")}>`;return r.interfaces[d]={...e,entities:o},this}};var f=require("@botpress/client");var ge=require("@botpress/client"),_={retries:3,retryCondition:t=>ge.axiosRetry.isNetworkOrIdempotentRequestError(t)||[429,502].includes(t.response?.status??0),retryDelay:t=>t*1e3};var b=class{constructor(e){this._client=e}createConversation=e=>this._client.createConversation(e);getConversation=e=>this._client.getConversation(e);listConversations=e=>this._client.listConversations(e);getOrCreateConversation=e=>this._client.getOrCreateConversation(e);updateConversation=e=>this._client.updateConversation(e);deleteConversation=e=>this._client.deleteConversation(e);listParticipants=e=>this._client.listParticipants(e);addParticipant=e=>this._client.addParticipant(e);getParticipant=e=>this._client.getParticipant(e);removeParticipant=e=>this._client.removeParticipant(e);createEvent=e=>this._client.createEvent(e);getEvent=e=>this._client.getEvent(e);listEvents=e=>this._client.listEvents(e);createMessage=e=>this._client.createMessage(e);getOrCreateMessage=e=>this._client.getOrCreateMessage(e);getMessage=e=>this._client.getMessage(e);updateMessage=e=>this._client.updateMessage(e);listMessages=e=>this._client.listMessages(e);deleteMessage=e=>this._client.deleteMessage(e);createUser=e=>this._client.createUser(e);getUser=e=>this._client.getUser(e);listUsers=e=>this._client.listUsers(e);getOrCreateUser=e=>this._client.getOrCreateUser(e);updateUser=e=>this._client.updateUser(e);deleteUser=e=>this._client.deleteUser(e);getState=e=>this._client.getState(e);setState=e=>this._client.setState(e);getOrSetState=e=>this._client.getOrSetState(e);patchState=e=>this._client.patchState(e);configureIntegration=e=>this._client.configureIntegration(e);uploadFile=e=>this._client.uploadFile(e);upsertFile=e=>this._client.upsertFile(e);deleteFile=e=>this._client.deleteFile(e);listFiles=e=>this._client.listFiles(e);getFile=e=>this._client.getFile(e);updateFileMetadata=e=>this._client.updateFileMetadata(e)};var U=class{_cost=0;get cost(){return this._cost}setCost(e){this._cost=e}toJSON(){return{cost:this.cost}}};var de=require("@bpinternal/zui");var Oe=de.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),ue=t=>{let e=t[v],n=t[j],s=t[N],a=t[L],r=t[Z],o=t[C],c=Oe.parse(t[I]);if(!e)throw new Error("Missing bot headers");if(!n)throw new Error("Missing bot user headers");if(!s)throw new Error("Missing integration headers");if(!a)throw new Error("Missing webhook headers");if(!o)throw new Error("Missing configuration headers");if(!c)throw new Error("Missing operation headers");return{botId:e,botUserId:n,integrationId:s,webhookId:a,operation:c,configurationType:r??null,configuration:o?JSON.parse(Buffer.from(o,"base64").toString("utf-8")):{}}};var $=J(require("util")),M=t=>{if(process.env.BP_LOG_FORMAT==="json")return JSON.stringify({msg:$.default.format(...t),visible_to_bot_owner:!0});{let[e,...n]=t;return $.default.format(`[For Bot Owner] ${e}`,...n)}},R={forBot:()=>({info:(...t)=>{console.info(M(t))},warn:(...t)=>{console.warn(M(t))},error:(...t)=>{console.error(M(t))},debug:(...t)=>{console.debug(M(t))}})};var me=t=>async e=>{let n=ue(e.headers),s=new f.Client({botId:n.botId,integrationId:n.integrationId,retry:_}),a=new b(s),r={ctx:n,req:e,client:a,logger:R,instance:t};try{let o;switch(n.operation){case"webhook_received":o=await Fe(r);break;case"register":o=await Ke(r);break;case"unregister":o=await Ge(r);break;case"message_created":o=await Le(r);break;case"action_triggered":o=await Ze(r);break;case"ping":o=await He(r);break;case"create_user":o=await je(r);break;case"create_conversation":o=await Ne(r);break;default:throw new Error(`Unknown operation ${n.operation}`)}return o?{...o,status:o.status??200}:{status:200}}catch(o){if((0,f.isApiError)(o)){let d=new f.RuntimeError(o.message,o);return R.forBot().error(d.message),{status:d.code,body:JSON.stringify(d.toJSON())}}console.error(o);let c=new f.RuntimeError("An unexpected error occurred in the integration. Bot owners: Check logs for more informations. Integration owners: throw a RuntimeError to return a custom error message instead.");return R.forBot().error(c.message),{status:c.code,body:JSON.stringify(c.toJSON())}}},He=async t=>{},Fe=async({client:t,ctx:e,req:n,logger:s,instance:a})=>{let{req:r}=y(n);return a.webhook({client:t,ctx:e,req:r,logger:s})},Ke=async({client:t,ctx:e,req:n,logger:s,instance:a})=>{if(!a.register)return;let{webhookUrl:r}=y(n);await a.register({client:t,ctx:e,webhookUrl:r,logger:s})},Ge=async({client:t,ctx:e,req:n,logger:s,instance:a})=>{if(!a.unregister)return;let{webhookUrl:r}=y(n);await a.unregister({ctx:e,webhookUrl:r,client:t,logger:s})},je=async({client:t,ctx:e,req:n,logger:s,instance:a})=>{if(!a.createUser)return;let{tags:r}=y(n);return await a.createUser({ctx:e,client:t,tags:r,logger:s})},Ne=async({client:t,ctx:e,req:n,logger:s,instance:a})=>{if(!a.createConversation)return;let{channel:r,tags:o}=y(n);return await a.createConversation({ctx:e,client:t,channel:r,tags:o,logger:s})},Le=async({ctx:t,req:e,client:n,logger:s,instance:a})=>{let{conversation:r,user:o,type:c,payload:d,message:p}=y(e),h=a.channels[r.channel];if(!h)throw new Error(`Channel ${r.channel} not found`);let V=h.messages[c];if(!V)throw new Error(`Message of type ${c} not found in channel ${r.channel}`);await V({ctx:t,conversation:r,message:p,user:o,type:c,client:n,payload:d,ack:async({tags:be})=>{await n.updateMessage({id:p.id,tags:be})},logger:s})},Ze=async({req:t,ctx:e,client:n,logger:s,instance:a})=>{let{input:r,type:o}=y(t);if(!o)throw new Error("Missing action type");let c=a.actions[o];if(!c)throw new Error(`Action ${o} not found`);let d=new U,h={output:await c({ctx:e,input:r,client:n,type:o,logger:s,metadata:d}),meta:d.toJSON()};return{body:JSON.stringify(h)}};var k=class{constructor(e){this.props=e;this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler}actions;channels;register;unregister;createUser;createConversation;webhook;handler=me(this);start=e=>E(this.handler,e)};var A=class{constructor(e){this.props=e;this.integrations=e.integrations,this.user=e.user,this.conversation=e.conversation,this.message=e.message,this.states=e.states,this.configuration=e.configuration,this.events=e.events,this.recurringEvents=e.recurringEvents}integrations;user;conversation;message;states;configuration;events;recurringEvents;add(e,n){let s=this;return s.integrations||(s.integrations={}),s.integrations[e.definition.name]={enabled:n.enabled,...e,configurationType:n.configurationType,configuration:n.configuration},this}};var he=J(require("@botpress/client"));var B=class{constructor(e){this._client=e}getConversation=e=>this._client.getConversation(e);listConversations=e=>this._client.listConversations(e);updateConversation=e=>this._client.updateConversation(e);deleteConversation=e=>this._client.deleteConversation(e);listParticipants=e=>this._client.listParticipants(e);addParticipant=e=>this._client.addParticipant(e);getParticipant=e=>this._client.getParticipant(e);removeParticipant=e=>this._client.removeParticipant(e);getEvent=e=>this._client.getEvent(e);listEvents=e=>this._client.listEvents(e);createMessage=e=>this._client.createMessage(e);getOrCreateMessage=e=>this._client.getOrCreateMessage(e);getMessage=e=>this._client.getMessage(e);updateMessage=e=>this._client.updateMessage(e);listMessages=e=>this._client.listMessages(e);deleteMessage=e=>this._client.deleteMessage(e);getUser=e=>this._client.getUser(e);listUsers=e=>this._client.listUsers(e);updateUser=e=>this._client.updateUser(e);deleteUser=e=>this._client.deleteUser(e);getState=e=>this._client.getState(e);setState=e=>this._client.setState(e);getOrSetState=e=>this._client.getOrSetState(e);patchState=e=>this._client.patchState(e);callAction=e=>this._client.callAction(e);uploadFile=e=>this._client.uploadFile(e);upsertFile=e=>this._client.upsertFile(e);deleteFile=e=>this._client.deleteFile(e);listFiles=e=>this._client.listFiles(e);getFile=e=>this._client.getFile(e);updateFileMetadata=e=>this._client.updateFileMetadata(e);searchFiles=e=>this._client.searchFiles(e);createConversation=e=>this._client.createConversation(e);getOrCreateConversation=e=>this._client.getOrCreateConversation(e);createUser=e=>this._client.createUser(e);getOrCreateUser=e=>this._client.getOrCreateUser(e)};var ye=require("@bpinternal/zui");var ze=ye.z.enum(["event_received","register","unregister","ping","action_triggered"]),fe=t=>{let e=t[v],n=t[C],s=t[z],a=ze.parse(t[I]);if(!e)throw new Error("Missing bot headers");if(!s)throw new Error("Missing type headers");if(!n)throw new Error("Missing configuration headers");if(!a)throw new Error("Missing operation headers");return{botId:e,operation:a,type:s,configuration:n?JSON.parse(Buffer.from(n,"base64").toString("utf-8")):{}}};var Te=t=>async e=>{let n=fe(e.headers);n.operation!=="ping"&&T.info(`Received ${n.operation} operation for bot ${n.botId} of type ${n.type}`);let s=new he.Client({botId:n.botId,retry:_}),a=new B(s),r={req:e,ctx:n,client:a,instance:t};switch(n.operation){case"action_triggered":throw new Error(`Operation ${n.operation} not supported yet`);case"event_received":await Je(r);break;case"register":await $e(r);break;case"unregister":await Ve(r);break;case"ping":await qe(r);break;default:throw new Error(`Unknown operation ${n.operation}`)}return{status:200}},qe=async t=>{},$e=async t=>{},Ve=async t=>{},Je=async({ctx:t,req:e,client:n,instance:s})=>{T.debug(`Received event ${t.type}`);let a=y(e),r=a.event;switch(t.type){case"message_created":let o={user:r.payload.user,conversation:r.payload.conversation,message:r.payload.message,states:r.payload.states,event:r};await Promise.all(s.messageHandlers.map(p=>p({client:n,ctx:t,...o})));break;case"state_expired":let c={state:r.payload.state};await Promise.all(s.stateExpiredHandlers.map(p=>p({client:n,ctx:t,...c})));break;default:let d={event:a.event};await Promise.all(s.eventHandlers.map(p=>p({client:n,ctx:t,...d})))}};var O=class{constructor(e){this.props=e}_state={messageHandlers:[],eventHandlers:[],stateExpiredHandlers:[]};message=e=>{this._state.messageHandlers.push(e)};event=e=>{this._state.eventHandlers.push(e)};stateExpired=e=>{this._state.stateExpiredHandlers.push(e)};handler=Te(this._state);start=e=>E(this.handler,e)};var H=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.entities=e.entities??{},this.templateName=e.templateName;let n=this._getEntityReference(this.entities),s=e.events===void 0?{}:u.mapValues(e.events,o=>({...o,schema:o.schema(n)})),a=e.actions===void 0?{}:u.mapValues(e.actions,o=>({...o,input:{...o.input,schema:o.input.schema(n)},output:{...o.output,schema:o.output.schema(n)}})),r=e.channels===void 0?{}:u.mapValues(e.channels,o=>({...o,messages:u.mapValues(o.messages,c=>({...c,schema:c.schema(n)}))}));this.events=s,this.actions=a,this.channels=r}name;version;entities;events;actions;channels;templateName;_getEntityReference=e=>{let n={};for(let s of Object.keys(e))n[s]=K.ref(s);return n}};0&&(module.exports={Bot,BotDefinition,BotSpecificClient,Integration,IntegrationDefinition,IntegrationSpecificClient,InterfaceDeclaration,RuntimeError,botIdHeader,botUserIdHeader,configurationHeader,configurationTypeHeader,integrationIdHeader,isApiError,messages,operationHeader,parseBody,serve,typeHeader,webhookIdHeader});
|
|
1
|
+
"use strict";var Ce=Object.create;var w=Object.defineProperty;var Ie=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Ee=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var I=(t,e)=>{for(var n in e)w(t,n,{get:e[n],enumerable:!0})},P=(t,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of _e(e))!Se.call(t,a)&&a!==n&&w(t,a,{get:()=>e[a],enumerable:!(i=Ie(e,a))||i.enumerable});return t},l=(t,e,n)=>(P(t,e,"default"),n&&P(n,e,"default")),Q=(t,e,n)=>(n=t!=null?Ce(Ee(t)):{},P(e||!t||!t.__esModule?w(n,"default",{value:t,enumerable:!0}):n,t)),xe=t=>P(w({},"__esModule",{value:!0}),t);var h={};I(h,{Bot:()=>G,BotDefinition:()=>F,BotSpecificClient:()=>T,Integration:()=>K,IntegrationDefinition:()=>U,IntegrationSpecificClient:()=>v,InterfaceDeclaration:()=>j,RuntimeError:()=>N.RuntimeError,botIdHeader:()=>_,botUserIdHeader:()=>z,configurationHeader:()=>E,configurationTypeHeader:()=>J,integrationIdHeader:()=>$,isApiError:()=>N.isApiError,messages:()=>Z,operationHeader:()=>S,parseBody:()=>f,serve:()=>x,typeHeader:()=>q,webhookIdHeader:()=>V});module.exports=xe(h);var Z={};I(Z,{defaults:()=>Ae,markdown:()=>De});var r={};I(r,{default:()=>L});var X=require("@bpinternal/zui");l(r,require("@bpinternal/zui"));var L=X.z;var g=r.z.string().min(1),ee=r.z.object({text:g}),te=r.z.object({markdown:g}),ne=r.z.object({imageUrl:g}),se=r.z.object({audioUrl:g}),ie=r.z.object({videoUrl:g}),oe=r.z.object({fileUrl:g,title:g.optional()}),ae=r.z.object({latitude:r.z.number(),longitude:r.z.number(),address:r.z.string().optional(),title:r.z.string().optional()}),re=r.z.object({title:g,subtitle:g.optional(),imageUrl:g.optional(),actions:r.z.array(r.z.object({action:r.z.enum(["postback","url","say"]),label:g,value:g}))}),Y=r.z.object({text:g,options:r.z.array(r.z.object({label:g,value:g}))}),ke=r.z.object({items:r.z.array(re)}),Pe=r.z.union([r.z.object({type:r.z.literal("text"),payload:ee}),r.z.object({type:r.z.literal("markdown"),payload:te}),r.z.object({type:r.z.literal("image"),payload:ne}),r.z.object({type:r.z.literal("audio"),payload:se}),r.z.object({type:r.z.literal("video"),payload:ie}),r.z.object({type:r.z.literal("file"),payload:oe}),r.z.object({type:r.z.literal("location"),payload:ae})]),we=r.z.object({items:r.z.array(Pe)}),De={schema:te},Ae={text:{schema:ee},image:{schema:ne},audio:{schema:se},video:{schema:ie},file:{schema:oe},location:{schema:ae},carousel:{schema:ke},card:{schema:re},dropdown:{schema:Y},choice:{schema:Y},bloc:{schema:we}};var _="x-bot-id",z="x-bot-user-id",$="x-integration-id",V="x-webhook-id",J="x-bp-configuration-type",E="x-bp-configuration",S="x-bp-operation",q="x-bp-type";var ce=require("node:http");var B=console;function f(t){if(!t.body)throw new Error("Missing body");return JSON.parse(t.body)}async function x(t,e=8072,n=Oe){let i=(0,ce.createServer)(async(a,o)=>{try{let s=await Ue(a);if(s.path==="/health"){o.writeHead(200).end("ok");return}let c=await t(s);o.writeHead(c?.status??200,c?.headers??{}).end(c?.body??"{}")}catch(s){B.error("Error while handling request",{error:s?.message??"Internal error occured"}),o.writeHead(500).end(JSON.stringify({error:s?.message??"Internal error occured"}))}});return i.listen(e,()=>n(e)),i}async function Ue(t){let e=await Re(t),n={};for(let a=0;a<t.rawHeaders.length;a+=2){let o=t.rawHeaders[a].toLowerCase(),s=t.rawHeaders[a+1];n[o]=s}let i=new URL(t.url??"",t.headers.host?`http://${t.headers.host}`:"http://botpress.cloud");return{body:e,path:i.pathname,query:Me(i.search,"?"),headers:n,method:t.method?.toUpperCase()??"GET"}}function Me(t,e){return t.indexOf(e)===0?t.slice(e.length):t}async function Re(t){return new Promise((e,n)=>{if(t.method!=="POST"&&t.method!=="PUT"&&t.method!=="PATCH")return e(void 0);let i="";t.on("data",a=>i+=a.toString()),t.on("error",a=>n(a)),t.on("end",()=>e(i))})}function Oe(t){B.info(`Listening on port ${t}`)}l(h,r,module.exports);var N=require("@botpress/client");var m={};I(m,{mapValues:()=>He,pairs:()=>pe});var pe=t=>Object.entries(t),He=(t,e)=>Object.fromEntries(pe(t).map(([n,i])=>[n,e(i,n)]));var y={};I(y,{safePush:()=>Ke});var Ke=(t,e)=>t?[...t,e]:[e];var A=Symbol("schemaName"),le=t=>t?m.mapValues(t,(n,i)=>({...n,[A]:i})):{},ge=t=>A in t&&t[A]!==void 0,de=t=>t[A];var U=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.icon=e.icon,this.readme=e.readme,this.title=e.title,this.identifier=e.identifier,this.description=e.description,this.configuration=e.configuration,this.configurations=e.configurations,this.events=e.events,this.actions=e.actions,this.channels=e.channels,this.states=e.states,this.user=e.user,this.secrets=e.secrets,this.entities=e.entities,this.interfaces=e.interfaces}name;version;title;description;icon;readme;configuration;configurations;events;actions;channels;states;user;secrets;identifier;entities;interfaces;extend(e,n){let i=n(le(this.entities)),a=m.pairs(i).find(([d,u])=>!ge(u));if(a)throw new Error(`Cannot extend interface "${e.definition.name}" with entity "${a[0]}"; the provided schema is not part of the integration's entities.`);let o=this;o.interfaces??={};let s=m.mapValues(i,d=>({name:de(d),schema:d.schema})),c=Object.values(s).map(d=>d.name),p=c.length===0?e.definition.name:`${e.definition.name}<${c.join(",")}>`;return o.interfaces[p]={...e,entities:s},this}};var b=require("@botpress/client");var ue=require("@botpress/client"),M={retries:3,retryCondition:t=>ue.axiosRetry.isNetworkOrIdempotentRequestError(t)||[429,502].includes(t.response?.status??0),retryDelay:t=>t*1e3};var v=class{constructor(e){this._client=e}createConversation=e=>this._client.createConversation(e);getConversation=e=>this._client.getConversation(e);listConversations=e=>this._client.listConversations(e);getOrCreateConversation=e=>this._client.getOrCreateConversation(e);updateConversation=e=>this._client.updateConversation(e);deleteConversation=e=>this._client.deleteConversation(e);listParticipants=e=>this._client.listParticipants(e);addParticipant=e=>this._client.addParticipant(e);getParticipant=e=>this._client.getParticipant(e);removeParticipant=e=>this._client.removeParticipant(e);createEvent=e=>this._client.createEvent(e);getEvent=e=>this._client.getEvent(e);listEvents=e=>this._client.listEvents(e);createMessage=e=>this._client.createMessage(e);getOrCreateMessage=e=>this._client.getOrCreateMessage(e);getMessage=e=>this._client.getMessage(e);updateMessage=e=>this._client.updateMessage(e);listMessages=e=>this._client.listMessages(e);deleteMessage=e=>this._client.deleteMessage(e);createUser=e=>this._client.createUser(e);getUser=e=>this._client.getUser(e);listUsers=e=>this._client.listUsers(e);getOrCreateUser=e=>this._client.getOrCreateUser(e);updateUser=e=>this._client.updateUser(e);deleteUser=e=>this._client.deleteUser(e);getState=e=>this._client.getState(e);setState=e=>this._client.setState(e);getOrSetState=e=>this._client.getOrSetState(e);patchState=e=>this._client.patchState(e);configureIntegration=e=>this._client.configureIntegration(e);uploadFile=e=>this._client.uploadFile(e);upsertFile=e=>this._client.upsertFile(e);deleteFile=e=>this._client.deleteFile(e);listFiles=e=>this._client.listFiles(e);getFile=e=>this._client.getFile(e);updateFileMetadata=e=>this._client.updateFileMetadata(e)};var R=class{_cost=0;get cost(){return this._cost}setCost(e){this._cost=e}toJSON(){return{cost:this.cost}}};var fe=require("@bpinternal/zui");var Fe=fe.z.enum(["webhook_received","message_created","action_triggered","register","unregister","ping","create_user","create_conversation"]),me=t=>{let e=t[_],n=t[z],i=t[$],a=t[V],o=t[J],s=t[E],c=Fe.parse(t[S]);if(!e)throw new Error("Missing bot headers");if(!n)throw new Error("Missing bot user headers");if(!i)throw new Error("Missing integration headers");if(!a)throw new Error("Missing webhook headers");if(!s)throw new Error("Missing configuration headers");if(!c)throw new Error("Missing operation headers");return{botId:e,botUserId:n,integrationId:i,webhookId:a,operation:c,configurationType:o??null,configuration:s?JSON.parse(Buffer.from(s,"base64").toString("utf-8")):{}}};var W=Q(require("util")),O=t=>{if(process.env.BP_LOG_FORMAT==="json")return JSON.stringify({msg:W.default.format(...t),visible_to_bot_owner:!0});{let[e,...n]=t;return W.default.format(`[For Bot Owner] ${e}`,...n)}},H={forBot:()=>({info:(...t)=>{console.info(O(t))},warn:(...t)=>{console.warn(O(t))},error:(...t)=>{console.error(O(t))},debug:(...t)=>{console.debug(O(t))}})};var he=t=>async e=>{let n=me(e.headers),i=new b.Client({botId:n.botId,integrationId:n.integrationId,retry:M}),a=new v(i),o={ctx:n,req:e,client:a,logger:H,instance:t};try{let s;switch(n.operation){case"webhook_received":s=await je(o);break;case"register":s=await Ne(o);break;case"unregister":s=await Le(o);break;case"message_created":s=await $e(o);break;case"action_triggered":s=await Ve(o);break;case"ping":s=await Ge(o);break;case"create_user":s=await Ze(o);break;case"create_conversation":s=await ze(o);break;default:throw new Error(`Unknown operation ${n.operation}`)}return s?{...s,status:s.status??200}:{status:200}}catch(s){if((0,b.isApiError)(s)){let p=new b.RuntimeError(s.message,s);return H.forBot().error(p.message),{status:p.code,body:JSON.stringify(p.toJSON())}}console.error(s);let c=new b.RuntimeError("An unexpected error occurred in the integration. Bot owners: Check logs for more informations. Integration owners: throw a RuntimeError to return a custom error message instead.");return H.forBot().error(c.message),{status:c.code,body:JSON.stringify(c.toJSON())}}},Ge=async t=>{},je=async({client:t,ctx:e,req:n,logger:i,instance:a})=>{let{req:o}=f(n);return a.webhook({client:t,ctx:e,req:o,logger:i})},Ne=async({client:t,ctx:e,req:n,logger:i,instance:a})=>{if(!a.register)return;let{webhookUrl:o}=f(n);await a.register({client:t,ctx:e,webhookUrl:o,logger:i})},Le=async({client:t,ctx:e,req:n,logger:i,instance:a})=>{if(!a.unregister)return;let{webhookUrl:o}=f(n);await a.unregister({ctx:e,webhookUrl:o,client:t,logger:i})},Ze=async({client:t,ctx:e,req:n,logger:i,instance:a})=>{if(!a.createUser)return;let{tags:o}=f(n);return await a.createUser({ctx:e,client:t,tags:o,logger:i})},ze=async({client:t,ctx:e,req:n,logger:i,instance:a})=>{if(!a.createConversation)return;let{channel:o,tags:s}=f(n);return await a.createConversation({ctx:e,client:t,channel:o,tags:s,logger:i})},$e=async({ctx:t,req:e,client:n,logger:i,instance:a})=>{let{conversation:o,user:s,type:c,payload:p,message:d}=f(e),u=a.channels[o.channel];if(!u)throw new Error(`Channel ${o.channel} not found`);let k=u.messages[c];if(!k)throw new Error(`Message of type ${c} not found in channel ${o.channel}`);await k({ctx:t,conversation:o,message:d,user:s,type:c,client:n,payload:p,ack:async({tags:ve})=>{await n.updateMessage({id:d.id,tags:ve})},logger:i})},Ve=async({req:t,ctx:e,client:n,logger:i,instance:a})=>{let{input:o,type:s}=f(t);if(!s)throw new Error("Missing action type");let c=a.actions[s];if(!c)throw new Error(`Action ${s} not found`);let p=new R,u={output:await c({ctx:e,input:o,client:n,type:s,logger:i,metadata:p}),meta:p.toJSON()};return{body:JSON.stringify(u)}};var K=class{constructor(e){this.props=e;this.actions=e.actions,this.channels=e.channels,this.register=e.register,this.unregister=e.unregister,this.createUser=e.createUser,this.createConversation=e.createConversation,this.webhook=e.handler}actions;channels;register;unregister;createUser;createConversation;webhook;handler=he(this);start=e=>x(this.handler,e)};var F=class{constructor(e){this.props=e;this.integrations=e.integrations,this.user=e.user,this.conversation=e.conversation,this.message=e.message,this.states=e.states,this.configuration=e.configuration,this.events=e.events,this.recurringEvents=e.recurringEvents,this.actions=e.actions}integrations;user;conversation;message;states;configuration;events;recurringEvents;actions;add(e,n){let i=this;return i.integrations||(i.integrations={}),i.integrations[e.definition.name]={enabled:n.enabled,...e,configurationType:n.configurationType,configuration:n.configuration},this}};var be=Q(require("@botpress/client"));var T=class{constructor(e,n={before:{},after:{}}){this._client=e;this._hooks=n}getConversation=e=>this._run("getConversation",e);listConversations=e=>this._run("listConversations",e);updateConversation=e=>this._run("updateConversation",e);deleteConversation=e=>this._run("deleteConversation",e);listParticipants=e=>this._run("listParticipants",e);addParticipant=e=>this._run("addParticipant",e);getParticipant=e=>this._run("getParticipant",e);removeParticipant=e=>this._run("removeParticipant",e);getEvent=e=>this._run("getEvent",e);listEvents=e=>this._run("listEvents",e);createMessage=e=>this._run("createMessage",e);getOrCreateMessage=e=>this._run("getOrCreateMessage",e);getMessage=e=>this._run("getMessage",e);updateMessage=e=>this._run("updateMessage",e);listMessages=e=>this._run("listMessages",e);deleteMessage=e=>this._run("deleteMessage",e);getUser=e=>this._run("getUser",e);listUsers=e=>this._run("listUsers",e);updateUser=e=>this._run("updateUser",e);deleteUser=e=>this._run("deleteUser",e);getState=e=>this._run("getState",e);setState=e=>this._run("setState",e);getOrSetState=e=>this._run("getOrSetState",e);patchState=e=>this._run("patchState",e);callAction=e=>this._run("callAction",e);uploadFile=e=>this._run("uploadFile",e);upsertFile=e=>this._run("upsertFile",e);deleteFile=e=>this._run("deleteFile",e);listFiles=e=>this._run("listFiles",e);getFile=e=>this._run("getFile",e);updateFileMetadata=e=>this._run("updateFileMetadata",e);searchFiles=e=>this._run("searchFiles",e);createConversation=e=>this._client.createConversation(e);getOrCreateConversation=e=>this._client.getOrCreateConversation(e);createUser=e=>this._client.createUser(e);getOrCreateUser=e=>this._client.getOrCreateUser(e);_run=async(e,n)=>{let i=this._hooks.before[e];i&&(n=await i(n));let a=await this._client[e](n),o=this._hooks.after[e];return o&&(a=await o(a)),a}};var ye=require("@bpinternal/zui");var Je=ye.z.enum(["event_received","register","unregister","ping","action_triggered"]),Te=t=>{let e=t[_],n=t[E],i=t[q],a=Je.parse(t[S]);if(!e)throw new Error("Missing bot headers");if(!i)throw new Error("Missing type headers");if(!n)throw new Error("Missing configuration headers");if(!a)throw new Error("Missing operation headers");return{botId:e,operation:a,type:i,configuration:n?JSON.parse(Buffer.from(n,"base64").toString("utf-8")):{}}};var C={status:200},Be=t=>async e=>{let n=Te(e.headers),i=new be.Client({botId:n.botId,retry:M}),a=new T(i,{before:{createMessage:async s=>{for(let c of t.hooks.before_outgoing_message[s.type]??[])s=(await c({client:new T(i),ctx:n,data:s}))?.data??s;return s},callAction:async s=>{for(let c of t.hooks.before_call_action[s.type]??[])s=(await c({client:new T(i),ctx:n,data:s}))?.data??s;return s}},after:{createMessage:async s=>{for(let c of t.hooks.after_outgoing_message[s.message.type]??[])s=(await c({client:new T(i),ctx:n,data:s}))?.data??s;return s},callAction:async s=>{for(let c of t.hooks.after_call_action[s.output.type]??[])s=(await c({client:new T(i),ctx:n,data:s}))?.data??s;return s}}}),o={req:e,ctx:n,client:a,self:t};switch(n.operation){case"action_triggered":return await Ye(o);case"event_received":return await Xe(o);case"register":return await We(o);case"unregister":return await Qe(o);case"ping":return await qe(o);default:throw new Error(`Unknown operation ${n.operation}`)}},qe=async({ctx:t})=>(B.info(`Received ${t.operation} operation for bot ${t.botId} of type ${t.type}`),C),We=async t=>C,Qe=async t=>C,Xe=async({ctx:t,req:e,client:n,self:i})=>{B.debug(`Received event ${t.type}`);let a=f(e);if(t.type==="message_created"){let c=a.event,p=c.payload.message;for(let u of i.hooks.before_incoming_message[p.type]??[])p=(await u({client:n,ctx:t,data:p}))?.data??p;let d={user:c.payload.user,conversation:c.payload.conversation,states:c.payload.states,message:p,event:c};for(let u of i.messageHandlers)await u({...d,client:n,ctx:t,self:i});for(let u of i.hooks.after_incoming_message[p.type]??[])p=(await u({client:n,ctx:t,data:p}))?.data??p;return C}if(t.type==="state_expired"){let p={state:a.event.payload.state};for(let d of i.stateExpiredHandlers)await d({...p,client:n,ctx:t,self:i});return C}let o=a.event;for(let c of i.hooks.before_incoming_event[o.type]??[])o=(await c({client:n,ctx:t,data:o}))?.data??o;let s={event:o};for(let c of i.eventHandlers)await c({...s,client:n,ctx:t,self:i});for(let c of i.hooks.after_incoming_event[o.type]??[])o=(await c({client:n,ctx:t,data:o}))?.data??o;return C},Ye=async({ctx:t,req:e,client:n,self:i})=>{let{input:a,type:o}=f(e);if(!o)throw new Error("Missing action type");let s=i.actionHandlers[o];if(!s)throw new Error(`Action ${o} not found`);let p={output:await s({ctx:t,input:a,client:n,type:o,self:i})};return{status:200,body:JSON.stringify(p)}};var G=class{constructor(e){this.props=e;this.actionHandlers=e.actions}actionHandlers;messageHandlers=[];eventHandlers=[];stateExpiredHandlers=[];hooks={before_incoming_event:{},before_incoming_message:{},before_outgoing_message:{},before_call_action:{},after_incoming_event:{},after_incoming_message:{},after_outgoing_message:{},after_call_action:{}};message=e=>{this.messageHandlers.push(e)};event=e=>{this.eventHandlers.push(e)};stateExpired=e=>{this.stateExpiredHandlers.push(e)};hook={before_incoming_event:(e,n)=>{this.hooks.before_incoming_event[e]=y.safePush(this.hooks.before_incoming_event[e],n)},before_incoming_message:(e,n)=>{this.hooks.before_incoming_message[e]=y.safePush(this.hooks.before_incoming_message[e],n)},before_outgoing_message:(e,n)=>{this.hooks.before_outgoing_message[e]=y.safePush(this.hooks.before_outgoing_message[e],n)},before_call_action:(e,n)=>{this.hooks.before_call_action[e]=y.safePush(this.hooks.before_call_action[e],n)},after_incoming_event:(e,n)=>{this.hooks.after_incoming_event[e]=y.safePush(this.hooks.after_incoming_event[e],n)},after_incoming_message:(e,n)=>{this.hooks.after_incoming_message[e]=y.safePush(this.hooks.after_incoming_message[e],n)},after_outgoing_message:(e,n)=>{this.hooks.after_outgoing_message[e]=y.safePush(this.hooks.after_outgoing_message[e],n)},after_call_action:(e,n)=>{this.hooks.after_call_action[e]=y.safePush(this.hooks.after_call_action[e],n)}};handler=Be(this);start=e=>x(this.handler,e)};var j=class{constructor(e){this.props=e;this.name=e.name,this.version=e.version,this.entities=e.entities??{},this.templateName=e.templateName;let n=this._getEntityReference(this.entities),i=e.events===void 0?{}:m.mapValues(e.events,s=>({...s,schema:s.schema(n)})),a=e.actions===void 0?{}:m.mapValues(e.actions,s=>({...s,input:{...s.input,schema:s.input.schema(n)},output:{...s.output,schema:s.output.schema(n)}})),o=e.channels===void 0?{}:m.mapValues(e.channels,s=>({...s,messages:m.mapValues(s.messages,c=>({...c,schema:c.schema(n)}))}));this.events=i,this.actions=a,this.channels=o}name;version;entities;events;actions;channels;templateName;_getEntityReference=e=>{let n={};for(let i of Object.keys(e))n[i]=L.ref(i);return n}};0&&(module.exports={Bot,BotDefinition,BotSpecificClient,Integration,IntegrationDefinition,IntegrationSpecificClient,InterfaceDeclaration,RuntimeError,botIdHeader,botUserIdHeader,configurationHeader,configurationTypeHeader,integrationIdHeader,isApiError,messages,operationHeader,parseBody,serve,typeHeader,webhookIdHeader});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|