@chativa/connector-directline 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("botframework-directlinejs");function n(){return Math.random().toString(36).slice(2,15)+Math.random().toString(36).slice(2,15)}async function a(i){const e=n(),t=await fetch("https://directline.botframework.com/v3/directline/tokens/generate",{method:"POST",headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},body:JSON.stringify({user:{id:e,name:e}})});if(!t.ok)throw new Error(`DirectLine token fetch failed: ${t.status}`);const{token:s,conversationId:o}=await t.json();return{token:s,conversationId:o,userId:e}}class c{constructor(e){this.name="directline",this.addSentToHistory=!1,this.messageHandler=null,this.options=e}async connect(){let e;if(this.options.token)e=this.options.token,this.userId=n();else if(this.options.secret){const t=await a(this.options.secret);e=t.token,this.conversationId=t.conversationId,this.userId=t.userId}else throw new Error("DirectLineConnector: provide either token or secret.");this.directLine=new r.DirectLine({token:e}),this.directLine.activity$.filter(t=>t.type==="message").subscribe(t=>{this.messageHandler?.({id:t.id??`dl-${Date.now()}`,type:"text",data:{text:t.text??""},timestamp:Date.now()})})}async disconnect(){this.messageHandler=null}async sendMessage(e){this.directLine.postActivity({type:"message",from:{id:this.userId},text:e.data.text??"",conversation:{id:this.conversationId},channelId:"directline",timestamp:new Date().toISOString(),id:e.id}).subscribe()}onMessage(e){this.messageHandler=e}}exports.DirectLineConnector=c;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/DirectLineConnector.ts"],"sourcesContent":["import type { IConnector, MessageHandler } from \"@chativa/core\";\nimport type { OutgoingMessage } from \"@chativa/core\";\nimport { DirectLine } from \"botframework-directlinejs\";\n\nexport interface DirectLineConnectorOptions {\n secret?: string;\n token?: string;\n tokenGeneratorUrl?: string;\n}\n\nfunction createUserId(): string {\n return (\n Math.random().toString(36).slice(2, 15) +\n Math.random().toString(36).slice(2, 15)\n );\n}\n\nasync function fetchToken(\n secret: string\n): Promise<{ token: string; conversationId: string; userId: string }> {\n const userId = createUserId();\n const res = await fetch(\n \"https://directline.botframework.com/v3/directline/tokens/generate\",\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${secret}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ user: { id: userId, name: userId } }),\n }\n );\n if (!res.ok) {\n throw new Error(`DirectLine token fetch failed: ${res.status}`);\n }\n const { token, conversationId } = (await res.json()) as {\n token: string;\n conversationId: string;\n };\n return { token, conversationId, userId };\n}\n\n/**\n * DirectLineConnector — Azure Bot Framework DirectLine v3 adapter.\n *\n * The bot echoes messages back, so we set addSentToHistory = false\n * to prevent user messages appearing twice.\n */\nexport class DirectLineConnector implements IConnector {\n readonly name = \"directline\";\n readonly addSentToHistory = false;\n\n private directLine!: DirectLine;\n private conversationId!: string;\n private userId!: string;\n private messageHandler: MessageHandler | null = null;\n private options: DirectLineConnectorOptions;\n\n constructor(options: DirectLineConnectorOptions) {\n this.options = options;\n }\n\n async connect(): Promise<void> {\n let token: string;\n\n if (this.options.token) {\n token = this.options.token;\n this.userId = createUserId();\n } else if (this.options.secret) {\n const result = await fetchToken(this.options.secret);\n token = result.token;\n this.conversationId = result.conversationId;\n this.userId = result.userId;\n } else {\n throw new Error(\"DirectLineConnector: provide either token or secret.\");\n }\n\n this.directLine = new DirectLine({ token });\n\n this.directLine.activity$\n .filter((a) => a.type === \"message\")\n .subscribe((activity) => {\n this.messageHandler?.({\n id: activity.id ?? `dl-${Date.now()}`,\n type: \"text\",\n data: { text: activity.text ?? \"\" },\n timestamp: Date.now(),\n });\n });\n }\n\n async disconnect(): Promise<void> {\n // DirectLine SDK doesn't expose an explicit close method\n this.messageHandler = null;\n }\n\n async sendMessage(message: OutgoingMessage): Promise<void> {\n this.directLine\n .postActivity({\n type: \"message\",\n from: { id: this.userId },\n text: (message.data as { text?: string }).text ?? \"\",\n conversation: { id: this.conversationId },\n channelId: \"directline\",\n timestamp: new Date().toISOString(),\n id: message.id,\n })\n .subscribe();\n }\n\n onMessage(callback: MessageHandler): void {\n this.messageHandler = callback;\n }\n}\n"],"names":["createUserId","fetchToken","secret","userId","res","token","conversationId","DirectLineConnector","options","result","DirectLine","a","activity","message","callback"],"mappings":"6HAUA,SAASA,GAAuB,CAC9B,OACE,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,EACtC,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,CAE1C,CAEA,eAAeC,EACbC,EACoE,CACpE,MAAMC,EAASH,EAAA,EACTI,EAAM,MAAM,MAChB,oEACA,CACE,OAAQ,OACR,QAAS,CACP,cAAe,UAAUF,CAAM,GAC/B,eAAgB,kBAAA,EAElB,KAAM,KAAK,UAAU,CAAE,KAAM,CAAE,GAAIC,EAAQ,KAAMA,EAAO,CAAG,CAAA,CAC7D,EAEF,GAAI,CAACC,EAAI,GACP,MAAM,IAAI,MAAM,kCAAkCA,EAAI,MAAM,EAAE,EAEhE,KAAM,CAAE,MAAAC,EAAO,eAAAC,CAAA,EAAoB,MAAMF,EAAI,KAAA,EAI7C,MAAO,CAAE,MAAAC,EAAO,eAAAC,EAAgB,OAAAH,CAAA,CAClC,CAQO,MAAMI,CAA0C,CAUrD,YAAYC,EAAqC,CATjD,KAAS,KAAO,aAChB,KAAS,iBAAmB,GAK5B,KAAQ,eAAwC,KAI9C,KAAK,QAAUA,CACjB,CAEA,MAAM,SAAyB,CAC7B,IAAIH,EAEJ,GAAI,KAAK,QAAQ,MACfA,EAAQ,KAAK,QAAQ,MACrB,KAAK,OAASL,EAAA,UACL,KAAK,QAAQ,OAAQ,CAC9B,MAAMS,EAAS,MAAMR,EAAW,KAAK,QAAQ,MAAM,EACnDI,EAAQI,EAAO,MACf,KAAK,eAAiBA,EAAO,eAC7B,KAAK,OAASA,EAAO,MACvB,KACE,OAAM,IAAI,MAAM,sDAAsD,EAGxE,KAAK,WAAa,IAAIC,aAAW,CAAE,MAAAL,EAAO,EAE1C,KAAK,WAAW,UACb,OAAQM,GAAMA,EAAE,OAAS,SAAS,EAClC,UAAWC,GAAa,CACvB,KAAK,iBAAiB,CACpB,GAAIA,EAAS,IAAM,MAAM,KAAK,KAAK,GACnC,KAAM,OACN,KAAM,CAAE,KAAMA,EAAS,MAAQ,EAAA,EAC/B,UAAW,KAAK,IAAA,CAAI,CACrB,CACH,CAAC,CACL,CAEA,MAAM,YAA4B,CAEhC,KAAK,eAAiB,IACxB,CAEA,MAAM,YAAYC,EAAyC,CACzD,KAAK,WACF,aAAa,CACZ,KAAM,UACN,KAAM,CAAE,GAAI,KAAK,MAAA,EACjB,KAAOA,EAAQ,KAA2B,MAAQ,GAClD,aAAc,CAAE,GAAI,KAAK,cAAA,EACzB,UAAW,aACX,UAAW,IAAI,KAAA,EAAO,YAAA,EACtB,GAAIA,EAAQ,EAAA,CACb,EACA,UAAA,CACL,CAEA,UAAUC,EAAgC,CACxC,KAAK,eAAiBA,CACxB,CACF"}
@@ -0,0 +1,32 @@
1
+ import { IConnector } from '../../core/src/index.ts';
2
+ import { MessageHandler } from '../../core/src/index.ts';
3
+ import { OutgoingMessage } from '../../core/src/index.ts';
4
+
5
+ /**
6
+ * DirectLineConnector — Azure Bot Framework DirectLine v3 adapter.
7
+ *
8
+ * The bot echoes messages back, so we set addSentToHistory = false
9
+ * to prevent user messages appearing twice.
10
+ */
11
+ export declare class DirectLineConnector implements IConnector {
12
+ readonly name = "directline";
13
+ readonly addSentToHistory = false;
14
+ private directLine;
15
+ private conversationId;
16
+ private userId;
17
+ private messageHandler;
18
+ private options;
19
+ constructor(options: DirectLineConnectorOptions);
20
+ connect(): Promise<void>;
21
+ disconnect(): Promise<void>;
22
+ sendMessage(message: OutgoingMessage): Promise<void>;
23
+ onMessage(callback: MessageHandler): void;
24
+ }
25
+
26
+ export declare interface DirectLineConnectorOptions {
27
+ secret?: string;
28
+ token?: string;
29
+ tokenGeneratorUrl?: string;
30
+ }
31
+
32
+ export { }
package/dist/index.js ADDED
@@ -0,0 +1,65 @@
1
+ import { DirectLine as r } from "botframework-directlinejs";
2
+ function n() {
3
+ return Math.random().toString(36).slice(2, 15) + Math.random().toString(36).slice(2, 15);
4
+ }
5
+ async function a(i) {
6
+ const e = n(), t = await fetch(
7
+ "https://directline.botframework.com/v3/directline/tokens/generate",
8
+ {
9
+ method: "POST",
10
+ headers: {
11
+ Authorization: `Bearer ${i}`,
12
+ "Content-Type": "application/json"
13
+ },
14
+ body: JSON.stringify({ user: { id: e, name: e } })
15
+ }
16
+ );
17
+ if (!t.ok)
18
+ throw new Error(`DirectLine token fetch failed: ${t.status}`);
19
+ const { token: s, conversationId: o } = await t.json();
20
+ return { token: s, conversationId: o, userId: e };
21
+ }
22
+ class d {
23
+ constructor(e) {
24
+ this.name = "directline", this.addSentToHistory = !1, this.messageHandler = null, this.options = e;
25
+ }
26
+ async connect() {
27
+ let e;
28
+ if (this.options.token)
29
+ e = this.options.token, this.userId = n();
30
+ else if (this.options.secret) {
31
+ const t = await a(this.options.secret);
32
+ e = t.token, this.conversationId = t.conversationId, this.userId = t.userId;
33
+ } else
34
+ throw new Error("DirectLineConnector: provide either token or secret.");
35
+ this.directLine = new r({ token: e }), this.directLine.activity$.filter((t) => t.type === "message").subscribe((t) => {
36
+ this.messageHandler?.({
37
+ id: t.id ?? `dl-${Date.now()}`,
38
+ type: "text",
39
+ data: { text: t.text ?? "" },
40
+ timestamp: Date.now()
41
+ });
42
+ });
43
+ }
44
+ async disconnect() {
45
+ this.messageHandler = null;
46
+ }
47
+ async sendMessage(e) {
48
+ this.directLine.postActivity({
49
+ type: "message",
50
+ from: { id: this.userId },
51
+ text: e.data.text ?? "",
52
+ conversation: { id: this.conversationId },
53
+ channelId: "directline",
54
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
55
+ id: e.id
56
+ }).subscribe();
57
+ }
58
+ onMessage(e) {
59
+ this.messageHandler = e;
60
+ }
61
+ }
62
+ export {
63
+ d as DirectLineConnector
64
+ };
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/DirectLineConnector.ts"],"sourcesContent":["import type { IConnector, MessageHandler } from \"@chativa/core\";\nimport type { OutgoingMessage } from \"@chativa/core\";\nimport { DirectLine } from \"botframework-directlinejs\";\n\nexport interface DirectLineConnectorOptions {\n secret?: string;\n token?: string;\n tokenGeneratorUrl?: string;\n}\n\nfunction createUserId(): string {\n return (\n Math.random().toString(36).slice(2, 15) +\n Math.random().toString(36).slice(2, 15)\n );\n}\n\nasync function fetchToken(\n secret: string\n): Promise<{ token: string; conversationId: string; userId: string }> {\n const userId = createUserId();\n const res = await fetch(\n \"https://directline.botframework.com/v3/directline/tokens/generate\",\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${secret}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ user: { id: userId, name: userId } }),\n }\n );\n if (!res.ok) {\n throw new Error(`DirectLine token fetch failed: ${res.status}`);\n }\n const { token, conversationId } = (await res.json()) as {\n token: string;\n conversationId: string;\n };\n return { token, conversationId, userId };\n}\n\n/**\n * DirectLineConnector — Azure Bot Framework DirectLine v3 adapter.\n *\n * The bot echoes messages back, so we set addSentToHistory = false\n * to prevent user messages appearing twice.\n */\nexport class DirectLineConnector implements IConnector {\n readonly name = \"directline\";\n readonly addSentToHistory = false;\n\n private directLine!: DirectLine;\n private conversationId!: string;\n private userId!: string;\n private messageHandler: MessageHandler | null = null;\n private options: DirectLineConnectorOptions;\n\n constructor(options: DirectLineConnectorOptions) {\n this.options = options;\n }\n\n async connect(): Promise<void> {\n let token: string;\n\n if (this.options.token) {\n token = this.options.token;\n this.userId = createUserId();\n } else if (this.options.secret) {\n const result = await fetchToken(this.options.secret);\n token = result.token;\n this.conversationId = result.conversationId;\n this.userId = result.userId;\n } else {\n throw new Error(\"DirectLineConnector: provide either token or secret.\");\n }\n\n this.directLine = new DirectLine({ token });\n\n this.directLine.activity$\n .filter((a) => a.type === \"message\")\n .subscribe((activity) => {\n this.messageHandler?.({\n id: activity.id ?? `dl-${Date.now()}`,\n type: \"text\",\n data: { text: activity.text ?? \"\" },\n timestamp: Date.now(),\n });\n });\n }\n\n async disconnect(): Promise<void> {\n // DirectLine SDK doesn't expose an explicit close method\n this.messageHandler = null;\n }\n\n async sendMessage(message: OutgoingMessage): Promise<void> {\n this.directLine\n .postActivity({\n type: \"message\",\n from: { id: this.userId },\n text: (message.data as { text?: string }).text ?? \"\",\n conversation: { id: this.conversationId },\n channelId: \"directline\",\n timestamp: new Date().toISOString(),\n id: message.id,\n })\n .subscribe();\n }\n\n onMessage(callback: MessageHandler): void {\n this.messageHandler = callback;\n }\n}\n"],"names":["createUserId","fetchToken","secret","userId","res","token","conversationId","DirectLineConnector","options","result","DirectLine","a","activity","message","callback"],"mappings":";AAUA,SAASA,IAAuB;AAC9B,SACE,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,IACtC,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAE1C;AAEA,eAAeC,EACbC,GACoE;AACpE,QAAMC,IAASH,EAAA,GACTI,IAAM,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAUF,CAAM;AAAA,QAC/B,gBAAgB;AAAA,MAAA;AAAA,MAElB,MAAM,KAAK,UAAU,EAAE,MAAM,EAAE,IAAIC,GAAQ,MAAMA,IAAO,CAAG;AAAA,IAAA;AAAA,EAC7D;AAEF,MAAI,CAACC,EAAI;AACP,UAAM,IAAI,MAAM,kCAAkCA,EAAI,MAAM,EAAE;AAEhE,QAAM,EAAE,OAAAC,GAAO,gBAAAC,EAAA,IAAoB,MAAMF,EAAI,KAAA;AAI7C,SAAO,EAAE,OAAAC,GAAO,gBAAAC,GAAgB,QAAAH,EAAA;AAClC;AAQO,MAAMI,EAA0C;AAAA,EAUrD,YAAYC,GAAqC;AATjD,SAAS,OAAO,cAChB,KAAS,mBAAmB,IAK5B,KAAQ,iBAAwC,MAI9C,KAAK,UAAUA;AAAA,EACjB;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAIH;AAEJ,QAAI,KAAK,QAAQ;AACf,MAAAA,IAAQ,KAAK,QAAQ,OACrB,KAAK,SAASL,EAAA;AAAA,aACL,KAAK,QAAQ,QAAQ;AAC9B,YAAMS,IAAS,MAAMR,EAAW,KAAK,QAAQ,MAAM;AACnD,MAAAI,IAAQI,EAAO,OACf,KAAK,iBAAiBA,EAAO,gBAC7B,KAAK,SAASA,EAAO;AAAA,IACvB;AACE,YAAM,IAAI,MAAM,sDAAsD;AAGxE,SAAK,aAAa,IAAIC,EAAW,EAAE,OAAAL,GAAO,GAE1C,KAAK,WAAW,UACb,OAAO,CAACM,MAAMA,EAAE,SAAS,SAAS,EAClC,UAAU,CAACC,MAAa;AACvB,WAAK,iBAAiB;AAAA,QACpB,IAAIA,EAAS,MAAM,MAAM,KAAK,KAAK;AAAA,QACnC,MAAM;AAAA,QACN,MAAM,EAAE,MAAMA,EAAS,QAAQ,GAAA;AAAA,QAC/B,WAAW,KAAK,IAAA;AAAA,MAAI,CACrB;AAAA,IACH,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,aAA4B;AAEhC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAM,YAAYC,GAAyC;AACzD,SAAK,WACF,aAAa;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,EAAE,IAAI,KAAK,OAAA;AAAA,MACjB,MAAOA,EAAQ,KAA2B,QAAQ;AAAA,MAClD,cAAc,EAAE,IAAI,KAAK,eAAA;AAAA,MACzB,WAAW;AAAA,MACX,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,MACtB,IAAIA,EAAQ;AAAA,IAAA,CACb,EACA,UAAA;AAAA,EACL;AAAA,EAEA,UAAUC,GAAgC;AACxC,SAAK,iBAAiBA;AAAA,EACxB;AACF;"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@chativa/connector-directline",
3
+ "version": "0.0.1",
4
+ "description": "Chativa DirectLine connector — Azure Bot Framework DirectLine v3 adapter.",
5
+ "author": "Hamza Agar",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "keywords": [
22
+ "chativa",
23
+ "chat",
24
+ "connector",
25
+ "directline",
26
+ "azure",
27
+ "botframework"
28
+ ],
29
+ "homepage": "https://github.com/AimTune/chativa#readme",
30
+ "bugs": {
31
+ "url": "https://github.com/AimTune/chativa/issues"
32
+ },
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/AimTune/chativa.git"
36
+ },
37
+ "dependencies": {
38
+ "botframework-directlinejs": "^0.15.6"
39
+ },
40
+ "peerDependencies": {
41
+ "@chativa/core": ">=0.0.1"
42
+ },
43
+ "devDependencies": {
44
+ "typescript": "~5.8.3",
45
+ "vite": "^7.0.3",
46
+ "vite-plugin-dts": "^4.5.4",
47
+ "vitest": "^4.0.18",
48
+ "@chativa/core": "0.0.1"
49
+ },
50
+ "scripts": {
51
+ "build": "vite build",
52
+ "test": "vitest run --passWithNoTests",
53
+ "typecheck": "tsc --noEmit"
54
+ }
55
+ }