@otonoma/paracord-panels-interface 0.17.1-rc.12

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 (38) hide show
  1. package/dist/channel.d.ts +14 -0
  2. package/dist/channel.d.ts.map +1 -0
  3. package/dist/channel.js +46 -0
  4. package/dist/client/abstractClient.d.ts +27 -0
  5. package/dist/client/abstractClient.d.ts.map +1 -0
  6. package/dist/client/abstractClient.js +22 -0
  7. package/dist/client/index.d.ts +6 -0
  8. package/dist/client/index.d.ts.map +1 -0
  9. package/dist/client/index.js +18 -0
  10. package/dist/client/managedPncpClient.d.ts +38 -0
  11. package/dist/client/managedPncpClient.d.ts.map +1 -0
  12. package/dist/client/managedPncpClient.js +156 -0
  13. package/dist/client/paracordClient.d.ts +28 -0
  14. package/dist/client/paracordClient.d.ts.map +1 -0
  15. package/dist/client/paracordClient.js +97 -0
  16. package/dist/client/pncpClient.d.ts +34 -0
  17. package/dist/client/pncpClient.d.ts.map +1 -0
  18. package/dist/client/pncpClient.js +234 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +2 -0
  22. package/dist/interface/index.d.ts +43 -0
  23. package/dist/interface/index.d.ts.map +1 -0
  24. package/dist/interface/index.js +3 -0
  25. package/dist/interface/methods.d.ts +98 -0
  26. package/dist/interface/methods.d.ts.map +1 -0
  27. package/dist/interface/methods.js +1 -0
  28. package/package.json +35 -0
  29. package/src/channel.ts +58 -0
  30. package/src/client/abstractClient.ts +63 -0
  31. package/src/client/index.ts +20 -0
  32. package/src/client/managedPncpClient.ts +195 -0
  33. package/src/client/paracordClient.ts +149 -0
  34. package/src/client/pncpClient.ts +304 -0
  35. package/src/index.ts +2 -0
  36. package/src/interface/index.ts +74 -0
  37. package/src/interface/methods.ts +136 -0
  38. package/tsconfig.json +21 -0
@@ -0,0 +1,14 @@
1
+ import { PanelMessage, MessageBody } from "./interface";
2
+ export declare class Channel {
3
+ private panelId;
4
+ private port;
5
+ evs: Map<number, (data: any) => void>;
6
+ evId: number;
7
+ constructor(panelId: string, port: MessagePort, incoming: (msg: PanelMessage) => void);
8
+ private send;
9
+ asyncSend(body: MessageBody): Promise<MessageBody>;
10
+ createStream<T, R>(type: string, msg: T): Promise<Stream<R>>;
11
+ }
12
+ export declare class Stream<R> {
13
+ }
14
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,qBAAa,OAAO;IAIhB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,IAAI;IAJd,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;gBAEH,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,WAAW,EACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI;IAsBvC,OAAO,CAAC,IAAI;IAgBL,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAK5C,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAG1E;AAED,qBAAa,MAAM,CAAC,CAAC;CAAI"}
@@ -0,0 +1,46 @@
1
+ import { PARACORD_PANEL_REVISION } from "./interface";
2
+ export class Channel {
3
+ constructor(panelId, port, incoming) {
4
+ this.panelId = panelId;
5
+ this.port = port;
6
+ this.evs = new Map();
7
+ this.evId = 0;
8
+ port.onmessage = (ev) => {
9
+ const message = ev.data;
10
+ if (message.messageId === undefined) {
11
+ // In this case we need to pass the full message so type disambigation can occur on the other side.
12
+ incoming(message);
13
+ }
14
+ else {
15
+ const cb = this.evs.get(message.messageId);
16
+ this.evs.delete(message.messageId);
17
+ if (cb) {
18
+ // In this case we can destructure the message.
19
+ cb(message.body);
20
+ }
21
+ }
22
+ };
23
+ }
24
+ // TODO (JAB): Figure out the "continuous" callbacks; observers, skill callbacks, etc. need to be able to
25
+ // receive messages repeatedly.
26
+ send(body, cb, transferred) {
27
+ const id = this.evId++;
28
+ this.evs.set(id, cb);
29
+ const message = {
30
+ messageId: id,
31
+ body: body,
32
+ panelId: this.panelId,
33
+ apiRevision: PARACORD_PANEL_REVISION,
34
+ };
35
+ this.port.postMessage(message, transferred || []);
36
+ }
37
+ asyncSend(body) {
38
+ const p = new Promise((r) => this.send(body, (m) => r(m)));
39
+ return p;
40
+ }
41
+ async createStream(type, msg) {
42
+ throw new Error("Unimplemented");
43
+ }
44
+ }
45
+ export class Stream {
46
+ }
@@ -0,0 +1,27 @@
1
+ import { DocumentArgs, LoginCredentials, ObservationCallbackObject, PncpMessageCallbackObject, PncpMessageObject, PncpRequestCallbackObject, SkillRequest } from "@otonoma/paranet-client";
2
+ import { FetchDocumentResponse, GraphqlCallArgs, GraphqlCallResponse, PncpCallResponse, PncpMessageResponse, RegisterObserverCallback, RegisterObserverResponse, RegisterSkillCallback, UploadDocumentArgs, UploadDocumentResponse } from "../interface";
3
+ export interface PncpClientInit {
4
+ skill?: (msg: PncpRequestCallbackObject) => void;
5
+ msg?: (msg: PncpMessageCallbackObject) => void;
6
+ obs?: (msg: ObservationCallbackObject, callback?: any) => void;
7
+ }
8
+ export declare abstract class AbstractPncpClient {
9
+ skillCb?: (msg: PncpRequestCallbackObject) => void;
10
+ msgCb?: (msg: PncpMessageCallbackObject) => void;
11
+ obsCb?: (msg: ObservationCallbackObject, callback?: any) => void;
12
+ constructor(init?: PncpClientInit);
13
+ abstract login(creds: LoginCredentials): Promise<void>;
14
+ abstract pncpRequest(req: SkillRequest): Promise<PncpCallResponse>;
15
+ abstract pncpResponse(req: PncpMessageResponse): Promise<PncpCallResponse>;
16
+ abstract pncpMessage(req: PncpMessageObject): Promise<PncpCallResponse>;
17
+ abstract registerSkillCallback(req: RegisterSkillCallback): any;
18
+ abstract registerObserverCallback(req: RegisterObserverCallback): Promise<RegisterObserverResponse>;
19
+ abstract deleteObserver(key: string): Promise<void>;
20
+ skillCallback(cb: (msg: PncpRequestCallbackObject) => void): this;
21
+ messageCallback(cb: (msg: PncpMessageCallbackObject) => void): this;
22
+ observationCallback(cb: (msg: ObservationCallbackObject, callback?: any) => void): this;
23
+ abstract uploadDocument(args: UploadDocumentArgs): Promise<UploadDocumentResponse>;
24
+ abstract fetchDocument(args: DocumentArgs): Promise<FetchDocumentResponse>;
25
+ abstract graphqlCall(args: GraphqlCallArgs): Promise<GraphqlCallResponse>;
26
+ }
27
+ //# sourceMappingURL=abstractClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractClient.d.ts","sourceRoot":"","sources":["../../src/client/abstractClient.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,YAAY,EACjJ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,qBAAqB,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAC1N,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC/C,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAChE;AAID,8BAAsB,kBAAkB;IACtC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACnD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;gBACrD,IAAI,CAAC,EAAE,cAAc;aAMjB,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;aAC7C,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;aACzD,YAAY,CAC1B,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,gBAAgB,CAAC;aAEZ,WAAW,CACzB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,gBAAgB,CAAC;aAGZ,qBAAqB,CAAC,GAAG,EAAE,qBAAqB,GAAG,GAAG;aACtD,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;aAC1F,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAGnD,aAAa,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,GAAG,IAAI;IAKjE,eAAe,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,GAAG,IAAI;IAKnE,mBAAmB,CACxB,EAAE,EAAE,CAAC,GAAG,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,GAAG,KAAK,IAAI,GAC3D,IAAI;aAKS,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC;aACzE,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC;aACjE,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;CACjF"}
@@ -0,0 +1,22 @@
1
+ // TODO: Make a better name for this
2
+ // This client represents an abstract wrapper around a managed pncp client.
3
+ export class AbstractPncpClient {
4
+ constructor(init) {
5
+ this.skillCb = init?.skill;
6
+ this.msgCb = init?.msg;
7
+ this.obsCb = init?.obs;
8
+ }
9
+ // Set the callback on the local listener for skills.
10
+ skillCallback(cb) {
11
+ this.skillCb = cb;
12
+ return this;
13
+ }
14
+ messageCallback(cb) {
15
+ this.msgCb = cb;
16
+ return this;
17
+ }
18
+ observationCallback(cb) {
19
+ this.obsCb = cb;
20
+ return this;
21
+ }
22
+ }
@@ -0,0 +1,6 @@
1
+ export * from "./abstractClient";
2
+ export * from "./paracordClient";
3
+ export * from "./managedPncpClient";
4
+ export * from "./pncpClient";
5
+ export declare function isInParacord(): boolean;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAK7B,wBAAgB,YAAY,IAAI,OAAO,CAStC"}
@@ -0,0 +1,18 @@
1
+ export * from "./abstractClient";
2
+ export * from "./paracordClient";
3
+ export * from "./managedPncpClient";
4
+ export * from "./pncpClient";
5
+ // A function which determines if the application is currently running inside of a paracord panel or as a standalone app.
6
+ // This can be used to present a login page and construct a direct connection as needed for standalone apps and otherwise
7
+ // establish a ParacordClient.
8
+ export function isInParacord() {
9
+ // This isn't a guaranteed way to check this, we could achieve that by creating a different encoding of the name though.
10
+ if (window.top !== window.self) {
11
+ const name = window.name;
12
+ const parts = name.split('@');
13
+ return parts.length == 3 && parts[0].match(/[a-f0-9]*-[a-f0-9]*/) != null;
14
+ }
15
+ else {
16
+ return false;
17
+ }
18
+ }
@@ -0,0 +1,38 @@
1
+ import { AbstractPncpClient, PncpCallResponse, RegisterObserverCallback, RegisterSkillCallback } from "../";
2
+ import { ObservationCallbackObject, PncpMessageCallbackObject, SkillRequest, PncpRequestCallbackObject, PncpQuestionMessage, PncpAnswerMessage } from "@otonoma/paranet-client";
3
+ import AsyncQueue from "@ai-zen/async-queue";
4
+ export declare class ManagedPncpClient {
5
+ private convs;
6
+ private convStreams;
7
+ private observs;
8
+ private skills;
9
+ private id;
10
+ client: AbstractPncpClient;
11
+ constructor(base: AbstractPncpClient);
12
+ sendRequest(req: SkillRequest): Promise<ConversationResponse>;
13
+ createConversation(req: SkillRequest): Promise<ConversationHandler>;
14
+ createObserver(obs: RegisterObserverCallback, cb: (msg: ObservationCallbackObject) => void): Promise<ObserverHandle>;
15
+ deleteObserver(id: number, key: string): Promise<void>;
16
+ createSkillCallback(sk: RegisterSkillCallback, cb: (msg: PncpRequestCallbackObject) => void): Promise<number>;
17
+ }
18
+ export interface ConversationResponse {
19
+ reply: PncpCallResponse;
20
+ pncp: PncpMessageCallbackObject;
21
+ }
22
+ export declare class ConversationHandler {
23
+ private queue;
24
+ private id;
25
+ private client;
26
+ constructor(client: ManagedPncpClient, queue: AsyncQueue<PncpMessageCallbackObject>, reply: PncpCallResponse);
27
+ next(): Promise<PncpMessageCallbackObject | null>;
28
+ sendQuestion(req: PncpQuestionMessage): Promise<PncpCallResponse>;
29
+ sendAnswer(req: PncpAnswerMessage): Promise<PncpCallResponse>;
30
+ }
31
+ export declare class ObserverHandle {
32
+ private id;
33
+ private key;
34
+ private client;
35
+ constructor(client: ManagedPncpClient, id: number, key: string);
36
+ close(): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=managedPncpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managedPncpClient.d.ts","sourceRoot":"","sources":["../../src/client/managedPncpClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,KAAK,CAAC;AAC5G,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,YAAY,EAAE,yBAAyB,EAAqC,mBAAmB,EAAmB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACpO,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAAwD;IACrE,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,OAAO,CAAwD;IACvE,OAAO,CAAC,MAAM,CAAqE;IACnF,OAAO,CAAC,EAAE,CAAS;IACnB,MAAM,EAAE,kBAAkB,CAAC;gBAEf,IAAI,EAAE,kBAAkB;IA0DvB,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiB7D,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAenE,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IAcpH,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAKtC,mBAAmB,CAAC,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;CAY3H;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,gBAAgB,CAAC;IACxB,IAAI,EAAE,yBAAyB,CAAC;CACjC;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,CAAC,yBAAyB,CAAC,EAAE,KAAK,EAAE,gBAAgB;IAO/F,IAAI,IAAI,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;IAIjD,YAAY,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUjE,UAAU,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAS3E;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IAMjD,KAAK;CAGnB"}
@@ -0,0 +1,156 @@
1
+ // Conversation manager to make skill requests which expect a direct response able to wait directly on a
2
+ // response.
3
+ import { ConversationState, PncpMessageKind } from "@otonoma/paranet-client";
4
+ import AsyncQueue from "@ai-zen/async-queue";
5
+ export class ManagedPncpClient {
6
+ constructor(base) {
7
+ this.convs = new Map();
8
+ this.convStreams = new Map();
9
+ this.observs = new Map();
10
+ this.skills = new Map();
11
+ this.id = new Date().getTime() + (Math.floor(Math.random() * 10000));
12
+ let old = base.msgCb;
13
+ base.msgCb = (msg) => {
14
+ if (old)
15
+ old(msg);
16
+ if (msg.callback && 'pn/req/id' in msg.callback) {
17
+ let id = msg.callback['pn/req/id'];
18
+ if (this.convs.has(id)) {
19
+ this.convs.get(id)(msg);
20
+ this.convs.delete(id);
21
+ }
22
+ else if (this.convStreams.has(id)) {
23
+ let queue = this.convStreams.get(id);
24
+ if (queue.isDone) {
25
+ this.convs.delete(id);
26
+ }
27
+ else {
28
+ queue.push(msg);
29
+ if (msg.conversationState == ConversationState.STATE_COMPLETED || msg.conversationState == ConversationState.STATE_ERRORED) {
30
+ queue.done();
31
+ this.convs.delete(id);
32
+ }
33
+ }
34
+ }
35
+ }
36
+ };
37
+ let oldObs = base.obsCb;
38
+ base.obsCb = (msg, cb) => {
39
+ if (oldObs)
40
+ oldObs(msg);
41
+ console.log("Observer considering callback: ", cb, " on message ", msg);
42
+ if (cb && 'pn/obs/req/id' in cb) {
43
+ let id = cb['pn/obs/req/id'];
44
+ this.observs.get(id)?.(msg);
45
+ }
46
+ };
47
+ let oldSk = base.skillCb;
48
+ base.skillCb = (msg) => {
49
+ if (oldSk)
50
+ oldSk(msg);
51
+ let key = `${msg.body.subject}/${msg.body.action}`;
52
+ let inner = this.skills.get(key);
53
+ if (inner) {
54
+ for (let cb of inner.values()) {
55
+ cb(msg);
56
+ }
57
+ }
58
+ };
59
+ this.client = base;
60
+ }
61
+ // A simple send request which expects _one_ response message.
62
+ // To make a call which can expect multiple responses, use `createConversation`.
63
+ async sendRequest(req) {
64
+ let id = this.id++;
65
+ if (!req.callback) {
66
+ req.callback = {};
67
+ }
68
+ req.callback['pn/req/id'] = id;
69
+ let promise = new Promise((res) => {
70
+ this.convs.set(id, (pncp) => res(pncp));
71
+ });
72
+ let reply = await this.client.pncpRequest(req);
73
+ return new Promise(async (res) => {
74
+ let pncp = await promise;
75
+ res({ reply, pncp });
76
+ });
77
+ }
78
+ async createConversation(req) {
79
+ let id = this.id++;
80
+ if (!req.callback) {
81
+ req.callback = {};
82
+ }
83
+ req.callback['pn/req/id'] = id;
84
+ let queue = new AsyncQueue();
85
+ this.convStreams.set(id, queue);
86
+ let reply = await this.client.pncpRequest(req);
87
+ return new ConversationHandler(this, queue, reply);
88
+ }
89
+ async createObserver(obs, cb) {
90
+ let id = this.id++;
91
+ if (!obs.callback) {
92
+ obs.callback = {};
93
+ }
94
+ obs.callback['pn/obs/req/id'] = id;
95
+ this.observs.set(id, cb);
96
+ // NOTE: This can be clever enough to avoid duplicating these callbacks, but the paracord side can manage
97
+ // that too, so this should be OK.
98
+ // TODO: Does this return something useful?
99
+ let { args: { key } } = await this.client.registerObserverCallback(obs);
100
+ return new ObserverHandle(this, id, key);
101
+ }
102
+ async deleteObserver(id, key) {
103
+ this.observs.delete(id);
104
+ await this.client.deleteObserver(key);
105
+ }
106
+ async createSkillCallback(sk, cb) {
107
+ let key = `${sk.subject}/${sk.action}`;
108
+ if (!this.skills.has(key)) {
109
+ await this.client.registerSkillCallback(sk);
110
+ this.skills.set(key, new Map());
111
+ }
112
+ let inner = this.skills.get(key);
113
+ let id = this.id++;
114
+ inner.set(id, cb);
115
+ return id;
116
+ }
117
+ }
118
+ export class ConversationHandler {
119
+ constructor(client, queue, reply) {
120
+ this.queue = queue[Symbol.asyncIterator]();
121
+ // TODO: Throw an error here if this is empty.
122
+ this.id = reply.conversationId;
123
+ this.client = client;
124
+ }
125
+ async next() {
126
+ return (await this.queue.next()).value;
127
+ }
128
+ async sendQuestion(req) {
129
+ return await this.client.client.pncpMessage({
130
+ id: this.id,
131
+ body: {
132
+ type: PncpMessageKind.PNCP_QUESTION,
133
+ value: req,
134
+ },
135
+ });
136
+ }
137
+ async sendAnswer(req) {
138
+ return await this.client.client.pncpMessage({
139
+ id: this.id,
140
+ body: {
141
+ type: PncpMessageKind.PNCP_ANSWER,
142
+ value: req,
143
+ }
144
+ });
145
+ }
146
+ }
147
+ export class ObserverHandle {
148
+ constructor(client, id, key) {
149
+ this.client = client;
150
+ this.id = id;
151
+ this.key = key;
152
+ }
153
+ async close() {
154
+ await this.client.deleteObserver(this.id, this.key);
155
+ }
156
+ }
@@ -0,0 +1,28 @@
1
+ import { DocumentArgs, LoginCredentials, ObservationCallbackObject, PncpMessageCallbackObject, PncpMessageObject, PncpRequestCallbackObject, SkillRequest } from "@otonoma/paranet-client";
2
+ import { Channel } from "../channel";
3
+ import { PncpMessageResponse, MethodCall, RegisterSkillCallback, PncpCallResponse, RegisterObserverCallback, GraphqlCallArgs, GraphqlCallResponse, UploadDocumentArgs, UploadDocumentResponse, FetchDocumentResponse, RegisterObserverResponse } from "../interface/methods";
4
+ import { AbstractPncpClient, PncpClientInit } from "../";
5
+ export declare class ParacordClient extends AbstractPncpClient {
6
+ channel: Channel;
7
+ skillCb?: (msg: PncpRequestCallbackObject) => void;
8
+ msgCb?: (msg: PncpMessageCallbackObject) => void;
9
+ obsCb?: (msg: ObservationCallbackObject, callback?: any) => void;
10
+ constructor(init?: PncpClientInit);
11
+ issueCall(call: MethodCall): Promise<any>;
12
+ login(_creds: LoginCredentials): Promise<void>;
13
+ pncpRequest(req: SkillRequest): Promise<PncpCallResponse>;
14
+ pncpResponse(req: PncpMessageResponse): Promise<PncpCallResponse>;
15
+ pncpMessage(req: PncpMessageObject): Promise<PncpCallResponse>;
16
+ registerSkillCallback(req: RegisterSkillCallback): Promise<any>;
17
+ registerObserverCallback(req: RegisterObserverCallback): Promise<RegisterObserverResponse>;
18
+ deleteObserver(key: string): Promise<void>;
19
+ uploadDocument(args: UploadDocumentArgs): Promise<UploadDocumentResponse>;
20
+ fetchDocument(args: DocumentArgs): Promise<FetchDocumentResponse>;
21
+ graphqlCall(args: GraphqlCallArgs): Promise<GraphqlCallResponse>;
22
+ }
23
+ export interface ParacordClientInit {
24
+ skill?: (msg: PncpRequestCallbackObject) => void;
25
+ msg?: (msg: PncpMessageCallbackObject) => void;
26
+ obs?: (msg: ObservationCallbackObject, callback?: any) => void;
27
+ }
28
+ //# sourceMappingURL=paracordClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paracordClient.d.ts","sourceRoot":"","sources":["../../src/client/paracordClient.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,YAAY,EACb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAMrC,OAAO,EACL,mBAAmB,EACnB,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAEzD,qBAAa,cAAe,SAAQ,kBAAkB;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACnD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;gBACrD,IAAI,CAAC,EAAE,cAAc;IAmC3B,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC;IAgBlC,KAAK,CAAC,MAAM,EAAE,gBAAgB;IAE9B,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIzD,YAAY,CACvB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,gBAAgB,CAAC;IAIf,WAAW,CACtB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,gBAAgB,CAAC;IAKf,qBAAqB,CAAC,GAAG,EAAE,qBAAqB;IAIhD,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAO1F,cAAc,CAAC,GAAG,EAAE,MAAM;IAI1B,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAOzE,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAOjE,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAM9E;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC/C,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;CAChE"}
@@ -0,0 +1,97 @@
1
+ // Client for panels to connect to paracord and send requests.
2
+ import { Channel } from "../channel";
3
+ import { PARACORD_PANEL_REVISION, } from "../interface";
4
+ import { AbstractPncpClient } from "../";
5
+ export class ParacordClient extends AbstractPncpClient {
6
+ constructor(init) {
7
+ super(init);
8
+ // Provided by Paracord.
9
+ const panelId = window.name;
10
+ // TODO (JAB): All of the message handling requests should be abstracted in a way that can be generalized
11
+ // to run in non-panel specific environments. This will make it easier to develop new panels as totally
12
+ // independent apps instead of requiring the panel embedding. This should both enable quicker/easier
13
+ // development but also greater portability of the panel code.
14
+ const message = {
15
+ apiRevision: PARACORD_PANEL_REVISION,
16
+ panelId,
17
+ type: "panelConnect",
18
+ };
19
+ const msgChan = new MessageChannel();
20
+ // TODO: Implement proper callback here.
21
+ const channel = new Channel(panelId, msgChan.port1, (msg) => {
22
+ console.log("Got callback:", msg);
23
+ switch (msg.body.type) {
24
+ case "pncpSkillCb":
25
+ this.skillCb?.(msg.body.body);
26
+ break;
27
+ case "pncpMessageCb":
28
+ this.msgCb?.(msg.body.body);
29
+ break;
30
+ case "pncpObservationCb":
31
+ this.obsCb?.(msg.body.body, msg.body.callback);
32
+ break;
33
+ }
34
+ });
35
+ this.channel = channel;
36
+ // Call the background.
37
+ console.log("Posting channel");
38
+ top?.postMessage(message, "*", [msgChan.port2]);
39
+ }
40
+ async issueCall(call) {
41
+ const body = {
42
+ type: "call",
43
+ body: call,
44
+ };
45
+ const response = await this.channel.asyncSend(body);
46
+ if (response.type == "callReturn") {
47
+ return response.body;
48
+ }
49
+ else if (response.type == "paracordError") {
50
+ throw Error(response.error);
51
+ }
52
+ else {
53
+ throw Error("Incorrect response type.");
54
+ }
55
+ }
56
+ async login(_creds) { }
57
+ async pncpRequest(req) {
58
+ return await this.issueCall({ method: "pncpRequest", args: req });
59
+ }
60
+ async pncpResponse(req) {
61
+ return await this.issueCall({ method: "pncpResponse", args: req });
62
+ }
63
+ async pncpMessage(req) {
64
+ return await this.issueCall({ method: "pncpMessage", args: req });
65
+ }
66
+ // Registers the callback with paracord.
67
+ async registerSkillCallback(req) {
68
+ return await this.issueCall({ method: "registerSkillCallback", args: req });
69
+ }
70
+ async registerObserverCallback(req) {
71
+ return await this.issueCall({
72
+ method: "registerObserverCallback",
73
+ args: req,
74
+ });
75
+ }
76
+ async deleteObserver(key) {
77
+ await this.issueCall({ method: "unregisterObserverCallback", args: { key } });
78
+ }
79
+ async uploadDocument(args) {
80
+ return await this.issueCall({
81
+ method: "uploadDocumentCall",
82
+ args,
83
+ });
84
+ }
85
+ async fetchDocument(args) {
86
+ return await this.issueCall({
87
+ method: "fetchDocumentCall",
88
+ args,
89
+ });
90
+ }
91
+ async graphqlCall(args) {
92
+ return await this.issueCall({
93
+ method: "graphqlCall",
94
+ args,
95
+ });
96
+ }
97
+ }
@@ -0,0 +1,34 @@
1
+ import { DocumentArgs, LoginCredentials, PncpMessageObject, SkillRequest, TokenResponse } from "@otonoma/paranet-client";
2
+ import { AbstractPncpClient, PncpClientInit } from ".";
3
+ import { FetchDocumentResponse, GraphqlCallArgs, GraphqlCallResponse, PncpCallResponse, PncpMessageResponse, RegisterObserverCallback, RegisterObserverResponse, RegisterSkillCallback, UploadDocumentArgs, UploadDocumentResponse } from "../interface";
4
+ export type ConnectionState = "connected" | "disconnected" | "pending" | "unauthenticated" | "failed";
5
+ export declare class PncpRpcClient extends AbstractPncpClient {
6
+ private client;
7
+ private svcClient;
8
+ private listener;
9
+ private observerState;
10
+ actorId: string;
11
+ actorVersion: string;
12
+ connectionState: ConnectionState;
13
+ constructor(init: PncpRpcClientInit);
14
+ login(creds: LoginCredentials): Promise<void>;
15
+ pncpRequest(req: SkillRequest): Promise<PncpCallResponse>;
16
+ pncpResponse(req: PncpMessageResponse): Promise<PncpCallResponse>;
17
+ pncpMessage(data: PncpMessageObject): Promise<PncpCallResponse>;
18
+ registerSkillCallback(_req: RegisterSkillCallback): Promise<void>;
19
+ registerObserverCallback(req: RegisterObserverCallback): Promise<RegisterObserverResponse>;
20
+ private createOrGetObserverStream;
21
+ deleteObserver(key: string): Promise<void>;
22
+ uploadDocument(args: UploadDocumentArgs): Promise<UploadDocumentResponse>;
23
+ fetchDocument(args: DocumentArgs): Promise<FetchDocumentResponse>;
24
+ graphqlCall(args: GraphqlCallArgs): Promise<GraphqlCallResponse>;
25
+ }
26
+ export interface PncpRpcClientInit {
27
+ init?: PncpClientInit;
28
+ actorId: string;
29
+ actorVersion: string;
30
+ broker: string;
31
+ service: string;
32
+ tokens?: TokenResponse;
33
+ }
34
+ //# sourceMappingURL=pncpClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pncpClient.d.ts","sourceRoot":"","sources":["../../src/client/pncpClient.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAyQ,iBAAiB,EAAgF,YAAY,EAAa,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACzd,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,GAAG,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEzP,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,cAAc,GACd,SAAS,GACT,iBAAiB,GACjB,QAAQ,CAAC;AAOb,qBAAa,aAAc,SAAQ,kBAAkB;IAEnD,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,aAAa,CAA6B;IAElD,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IAGrB,eAAe,EAAE,eAAe,CAAC;gBAErB,IAAI,EAAE,iBAAiB;IAsEtB,KAAK,CAAC,KAAK,EAAE,gBAAgB;IAK7B,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAezD,YAAY,CACvB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,gBAAgB,CAAC;IAoBf,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAa/D,qBAAqB,CAAC,IAAI,EAAE,qBAAqB;IAKjD,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAsCvG,OAAO,CAAC,yBAAyB;IA6CpB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAQzE,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgBjE,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAQ9E;AAQD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB"}