ai-publish-sdk 1.1.1 → 1.3.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/README.md CHANGED
@@ -8,6 +8,20 @@ SDK for embedded apps to communicate with the host environment.
8
8
  npm install ai-publish-sdk
9
9
  ```
10
10
 
11
+ ## Timeout Configuration
12
+
13
+ Default timeout is 15 seconds. You can change it globally or wrap a single call:
14
+
15
+ ```typescript
16
+ import { setGlobalTimeout, withTimeout, getUserInfo } from 'ai-publish-sdk'
17
+
18
+ // Change the default for all calls
19
+ setGlobalTimeout(30_000)
20
+
21
+ // Override for a single call
22
+ await withTimeout(() => getUserInfo(), 10_000)
23
+ ```
24
+
11
25
  ## Core API
12
26
 
13
27
  ### getUserInfo()
@@ -15,7 +29,7 @@ npm install ai-publish-sdk
15
29
  Get current user info.
16
30
 
17
31
  ```typescript
18
- getUserInfo(config?: RpcConfig): Promise<UserInfo | null>
32
+ getUserInfo(): Promise<UserInfo | null>
19
33
 
20
34
  interface UserInfo {
21
35
  userId: string
@@ -35,7 +49,7 @@ interface UserInfo {
35
49
  Get OAuth token for an integration.
36
50
 
37
51
  ```typescript
38
- getToken(appName: IntegrationAppName, options?: GetTokenOptions, config?: RpcConfig): Promise<GetTokenResult | null>
52
+ getToken(appName: IntegrationAppName, options?: GetTokenOptions): Promise<GetTokenResult | null>
39
53
 
40
54
  type IntegrationAppName = 'gmail' | 'jira' | 'googledrive' | 'salesforce' | 'googlecalendar' | 'slack'
41
55
 
@@ -54,7 +68,7 @@ interface GetTokenResult {
54
68
  Generate an AI message.
55
69
 
56
70
  ```typescript
57
- generateMessage(prompt: string, options: GenerateMessageOptions, config?: RpcConfig): Promise<string | null>
71
+ generateMessage(prompt: string, options: GenerateMessageOptions): Promise<string | null>
58
72
 
59
73
  interface GenerateMessageOptions {
60
74
  withPageContext?: boolean // include current page content as context
@@ -67,16 +81,35 @@ interface GenerateMessageOptions {
67
81
  Execute JavaScript on the host page.
68
82
 
69
83
  ```typescript
70
- executeScript(code: string, config?: RpcConfig): Promise<void>
84
+ executeScript(code: string): Promise<void>
71
85
  ```
72
86
 
73
- ### RpcConfig
87
+ ## TCP API
88
+
89
+ All data is base64-encoded. Import as `import { tcp }`.
74
90
 
75
- Optional config passed to any function call.
91
+ ### tcp.connect(host, port)
92
+
93
+ Open a TCP connection. Returns a `TcpSocket` object for subsequent operations, or `null` if TCP is unavailable.
76
94
 
77
95
  ```typescript
78
- interface RpcConfig {
79
- timeout?: number // ms, default 15000
80
- targetOrigin?: string // postMessage target origin, default '*'
96
+ tcp.connect(host: string, port: number): Promise<TcpSocket | null>
97
+
98
+ interface TcpSocket {
99
+ send(dataBase64: string): Promise<number | null>
100
+ receive(): Promise<string | null>
101
+ close(): Promise<void>
81
102
  }
82
103
  ```
104
+
105
+ ### TcpSocket.send(dataBase64)
106
+
107
+ Send data over an open socket. Data must be base64-encoded. Returns the number of bytes sent, or `null` if TCP is unavailable.
108
+
109
+ ### TcpSocket.receive()
110
+
111
+ Wait for and receive data from an open socket. Returns base64-encoded data, or `null` if TCP is unavailable. Use `withTimeout(() => socket.receive(), ms)` for custom timeouts.
112
+
113
+ ### TcpSocket.close()
114
+
115
+ Disconnect and close an open socket.
package/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { generateMessage, getToken, getUserInfo } from './lib/functions';
2
- export type { RpcConfig } from './lib/rpc-bridge';
2
+ export { tcp } from './lib/tcp-socket';
3
+ export type { TcpSocket } from './lib/tcp-socket';
4
+ export { setGlobalTimeout, withTimeout } from './lib/rpc-bridge';
3
5
  export type { GenerateMessageOptions, GetTokenOptions, GetTokenResult, IntegrationAppName, UserInfo } from './lib/types';
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=15e3,n=new Map;let i=!1;function I(){i||(i=!0,window.addEventListener("message",r=>{const e=r.data;if(!(e!=null&&e.messageId)||!("name"in e))return;const t=n.get(e.messageId);t&&(clearTimeout(t.timer),n.delete(e.messageId),e.error?t.reject(new Error(e.error.message??"RPC error")):t.resolve(e.data))}))}function o(r,e,t){I();const u=(t==null?void 0:t.timeout)??c,g=(t==null?void 0:t.targetOrigin)??"*";return new Promise((m,a)=>{const s=crypto.randomUUID(),d=setTimeout(()=>{n.delete(s),a(new Error(`RPC timeout: ${r}`))},u);n.set(s,{resolve:m,reject:a,timer:d});const l={action:r,params:e,messageId:s};window.parent.postMessage(l,g)})}async function T(r,e,t){return o("generateMessage",[r,e],t)}async function w(r,e,t){return o("getToken",[r,e],t)}async function p(r){return o("getUserInfo",[],r)}exports.generateMessage=T;exports.getToken=w;exports.getUserInfo=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let u=15e3;const c=new Map;let a=!1;function m(e){u=e}let i;function d(e,t){i=t;try{return e()}finally{i=void 0}}function f(){a||(a=!0,window.addEventListener("message",e=>{const t=e.data;if(!t?.messageId||!("name"in t))return;const n=c.get(t.messageId);n&&(clearTimeout(n.timer),c.delete(t.messageId),t.error?n.reject(new Error(t.error.message??"RPC error")):n.resolve(t.data))}))}function r(e,t){return f(),new Promise((n,s)=>{const o=crypto.randomUUID(),l=setTimeout(()=>{c.delete(o),s(new Error(`RPC timeout: ${e}`))},i??u);c.set(o,{resolve:n,reject:s,timer:l});const g={action:e,params:t,messageId:o};window.parent.postMessage(g,"*")})}async function p(e,t){return r("generateMessage",[e,t])}async function y(e,t){return r("getToken",[e,t])}async function w(){return r("getUserInfo",[])}async function T(e){return r("tcpConnect",[e])}async function v(e,t){return r("tcpSend",[e,t])}async function I(e,t){return r("tcpReceive",[e,t])}async function C(e){return r("tcpClose",[e])}const b={async connect(e,t){const n=await T({host:e,port:t});return n===null?null:{send:async s=>(await v(n,{dataBase64:s}))?.bytesSent??null,receive:async()=>(await I(n))?.data??null,close:()=>C(n)}}};exports.generateMessage=p;exports.getToken=y;exports.getUserInfo=w;exports.setGlobalTimeout=m;exports.tcp=b;exports.withTimeout=d;
package/index.mjs CHANGED
@@ -1,40 +1,84 @@
1
- const n = /* @__PURE__ */ new Map();
1
+ let u = 15e3;
2
+ const c = /* @__PURE__ */ new Map();
2
3
  let i = !1;
3
- function l() {
4
- i || (i = !0, window.addEventListener("message", (r) => {
5
- const e = r.data;
6
- if (!(e != null && e.messageId) || !("name" in e)) return;
7
- const t = n.get(e.messageId);
8
- t && (clearTimeout(t.timer), n.delete(e.messageId), e.error ? t.reject(new Error(e.error.message ?? "RPC error")) : t.resolve(e.data));
4
+ function T(e) {
5
+ u = e;
6
+ }
7
+ let a;
8
+ function v(e, t) {
9
+ a = t;
10
+ try {
11
+ return e();
12
+ } finally {
13
+ a = void 0;
14
+ }
15
+ }
16
+ function m() {
17
+ i || (i = !0, window.addEventListener("message", (e) => {
18
+ const t = e.data;
19
+ if (!t?.messageId || !("name" in t)) return;
20
+ const n = c.get(t.messageId);
21
+ n && (clearTimeout(n.timer), c.delete(t.messageId), t.error ? n.reject(new Error(t.error.message ?? "RPC error")) : n.resolve(t.data));
9
22
  }));
10
23
  }
11
- function a(r, e, t) {
12
- l();
13
- const u = (t == null ? void 0 : t.timeout) ?? 15e3, m = (t == null ? void 0 : t.targetOrigin) ?? "*";
14
- return new Promise((g, o) => {
15
- const s = crypto.randomUUID(), d = setTimeout(() => {
16
- n.delete(s), o(new Error(`RPC timeout: ${r}`));
17
- }, u);
18
- n.set(s, {
19
- resolve: g,
20
- reject: o,
21
- timer: d
24
+ function r(e, t) {
25
+ return m(), new Promise((n, s) => {
26
+ const o = crypto.randomUUID(), l = setTimeout(() => {
27
+ c.delete(o), s(new Error(`RPC timeout: ${e}`));
28
+ }, a ?? u);
29
+ c.set(o, {
30
+ resolve: n,
31
+ reject: s,
32
+ timer: l
22
33
  });
23
- const c = { action: r, params: e, messageId: s };
24
- window.parent.postMessage(c, m);
34
+ const d = { action: e, params: t, messageId: o };
35
+ window.parent.postMessage(d, "*");
25
36
  });
26
37
  }
27
- async function T(r, e, t) {
28
- return a("generateMessage", [r, e], t);
38
+ async function C(e, t) {
39
+ return r("generateMessage", [e, t]);
40
+ }
41
+ async function I(e, t) {
42
+ return r("getToken", [e, t]);
43
+ }
44
+ async function M() {
45
+ return r("getUserInfo", []);
29
46
  }
30
- async function I(r, e, t) {
31
- return a("getToken", [r, e], t);
47
+ async function f(e) {
48
+ return r("tcpConnect", [e]);
32
49
  }
33
- async function w(r) {
34
- return a("getUserInfo", [], r);
50
+ async function g(e, t) {
51
+ return r("tcpSend", [e, t]);
35
52
  }
53
+ async function p(e, t) {
54
+ return r("tcpReceive", [e, t]);
55
+ }
56
+ async function y(e) {
57
+ return r("tcpClose", [e]);
58
+ }
59
+ const R = {
60
+ /**
61
+ * Opens a TCP connection and returns a `TcpSocket` wrapper.
62
+ *
63
+ * The `TcpSocket` wrapper hides the socket ID as an implementation detail,
64
+ * preventing accidental misuse. Authorization (ensuring only the owning app can
65
+ * use a socket) is enforced on the host side — do not assume the closure provides
66
+ * security guarantees.
67
+ */
68
+ async connect(e, t) {
69
+ const n = await f({ host: e, port: t });
70
+ return n === null ? null : {
71
+ send: async (s) => (await g(n, { dataBase64: s }))?.bytesSent ?? null,
72
+ receive: async () => (await p(n))?.data ?? null,
73
+ close: () => y(n)
74
+ };
75
+ }
76
+ };
36
77
  export {
37
- T as generateMessage,
78
+ C as generateMessage,
38
79
  I as getToken,
39
- w as getUserInfo
80
+ M as getUserInfo,
81
+ T as setGlobalTimeout,
82
+ R as tcp,
83
+ v as withTimeout
40
84
  };
@@ -1,6 +1,9 @@
1
- import { RpcConfig } from './rpc-bridge';
2
- import { GenerateMessageOptions, GetTokenOptions, GetTokenResult, IntegrationAppName, UserInfo } from './types';
3
- export declare function generateMessage(prompt: string, options: GenerateMessageOptions, config?: RpcConfig): Promise<string | null>;
4
- export declare function getToken(appName: IntegrationAppName, options?: GetTokenOptions, config?: RpcConfig): Promise<GetTokenResult | null>;
5
- export declare function getUserInfo(config?: RpcConfig): Promise<UserInfo | null>;
6
- export declare function executeScript(code: string, config?: RpcConfig): Promise<void>;
1
+ import { GenerateMessageOptions, GetTokenOptions, GetTokenResult, IntegrationAppName, TcpConnectOptions, TcpConnectionSettings, TcpReceiveOptions, TcpReceiveResult, TcpSendMessage, TcpSendResult, UserInfo } from './types';
2
+ export declare function generateMessage(prompt: string, options: GenerateMessageOptions): Promise<string | null>;
3
+ export declare function getToken(appName: IntegrationAppName, options?: GetTokenOptions): Promise<GetTokenResult | null>;
4
+ export declare function getUserInfo(): Promise<UserInfo | null>;
5
+ export declare function executeScript(code: string): Promise<void>;
6
+ export declare function tcpConnect(options: TcpConnectOptions): Promise<TcpConnectionSettings | null>;
7
+ export declare function tcpSend(connection: TcpConnectionSettings, message: TcpSendMessage): Promise<TcpSendResult | null>;
8
+ export declare function tcpReceive(connection: TcpConnectionSettings, options?: TcpReceiveOptions): Promise<TcpReceiveResult | null>;
9
+ export declare function tcpClose(connection: TcpConnectionSettings): Promise<void>;
@@ -1,5 +1,4 @@
1
- export interface RpcConfig {
2
- timeout?: number;
3
- targetOrigin?: string;
4
- }
5
- export declare function rpcCall<T = unknown>(action: string, params: unknown[], config?: RpcConfig): Promise<T>;
1
+ export declare function setGlobalTimeout(ms: number): void;
2
+ export declare function resetForTesting(): void;
3
+ export declare function withTimeout<T>(fn: () => Promise<T>, ms: number): Promise<T>;
4
+ export declare function rpcCall<T = unknown>(action: string, params: unknown[]): Promise<T>;
@@ -0,0 +1,16 @@
1
+ export interface TcpSocket {
2
+ send(dataBase64: string): Promise<number | null>;
3
+ receive(): Promise<string | null>;
4
+ close(): Promise<void>;
5
+ }
6
+ export declare const tcp: {
7
+ /**
8
+ * Opens a TCP connection and returns a `TcpSocket` wrapper.
9
+ *
10
+ * The `TcpSocket` wrapper hides the socket ID as an implementation detail,
11
+ * preventing accidental misuse. Authorization (ensuring only the owning app can
12
+ * use a socket) is enforced on the host side — do not assume the closure provides
13
+ * security guarantees.
14
+ */
15
+ connect(host: string, port: number): Promise<TcpSocket | null>;
16
+ };
package/lib/types.d.ts CHANGED
@@ -21,3 +21,22 @@ export interface UserInfo {
21
21
  email?: string;
22
22
  picture?: string;
23
23
  }
24
+ export interface TcpConnectOptions {
25
+ host: string;
26
+ port: number;
27
+ }
28
+ export interface TcpConnectionSettings {
29
+ socketId: number;
30
+ }
31
+ export interface TcpSendMessage {
32
+ dataBase64: string;
33
+ }
34
+ export interface TcpSendResult {
35
+ bytesSent: number;
36
+ }
37
+ export interface TcpReceiveOptions {
38
+ timeoutMs?: number;
39
+ }
40
+ export interface TcpReceiveResult {
41
+ data: string;
42
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-publish-sdk",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "module": "./index.mjs",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",