agentlink-sdk 1.0.3 → 1.0.4
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.d.mts +11 -3
- package/dist/index.d.ts +11 -3
- package/dist/index.js +34 -7
- package/dist/index.mjs +34 -7
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -26,6 +26,7 @@ declare class AgentLinkClient {
|
|
|
26
26
|
private token;
|
|
27
27
|
private tokenPromise;
|
|
28
28
|
private static tokenCache;
|
|
29
|
+
private static whitelistCache;
|
|
29
30
|
private static CACHE_TTL;
|
|
30
31
|
constructor(options: AgentLinkClientOptions);
|
|
31
32
|
/**
|
|
@@ -36,6 +37,10 @@ declare class AgentLinkClient {
|
|
|
36
37
|
* 从服务器获取 Token
|
|
37
38
|
*/
|
|
38
39
|
private fetchToken;
|
|
40
|
+
/**
|
|
41
|
+
* 检查域名是否在白名单中
|
|
42
|
+
*/
|
|
43
|
+
private checkWhitelist;
|
|
39
44
|
/**
|
|
40
45
|
* 验证发送端的 Token 和 Origin
|
|
41
46
|
*/
|
|
@@ -50,16 +55,18 @@ declare class AgentLinkClient {
|
|
|
50
55
|
sendData(targetUrl: string, data: any, type: string, windowName?: string): Promise<void>;
|
|
51
56
|
/**
|
|
52
57
|
* 监听来自 URL 的数据
|
|
53
|
-
* @param callback
|
|
58
|
+
* @param callback 接收到数据时的回调函数,现在包含验证信息
|
|
54
59
|
*/
|
|
55
|
-
receiveData(callback: (data: any, type: string, senderInfo?: SenderInfo) => void): () => void;
|
|
60
|
+
receiveData(callback: (data: any, type: string, senderInfo?: SenderInfo, verification?: string) => void): () => void;
|
|
56
61
|
/**
|
|
57
62
|
* 从当前 URL 获取数据并验证发送方
|
|
63
|
+
* 即使验证失败也返回数据,但会标记验证状态
|
|
58
64
|
*/
|
|
59
65
|
getDataFromUrl(url?: string): Promise<{
|
|
60
66
|
data: any;
|
|
61
67
|
type: string;
|
|
62
68
|
senderInfo?: SenderInfo;
|
|
69
|
+
verification?: string;
|
|
63
70
|
} | null>;
|
|
64
71
|
/**
|
|
65
72
|
* 获取白名单信息
|
|
@@ -89,11 +96,12 @@ interface URLData {
|
|
|
89
96
|
type: string;
|
|
90
97
|
token: string;
|
|
91
98
|
origin: string;
|
|
99
|
+
verification?: string;
|
|
92
100
|
}
|
|
93
101
|
/**
|
|
94
102
|
* 将数据编码为 URL hash
|
|
95
103
|
*/
|
|
96
|
-
declare function encodeDataToUrl(data: any, type: string, token: string, origin: string, baseUrl: string): Promise<string>;
|
|
104
|
+
declare function encodeDataToUrl(data: any, type: string, token: string, origin: string, baseUrl: string, verification?: string): Promise<string>;
|
|
97
105
|
/**
|
|
98
106
|
* 从 URL 中解码数据
|
|
99
107
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ declare class AgentLinkClient {
|
|
|
26
26
|
private token;
|
|
27
27
|
private tokenPromise;
|
|
28
28
|
private static tokenCache;
|
|
29
|
+
private static whitelistCache;
|
|
29
30
|
private static CACHE_TTL;
|
|
30
31
|
constructor(options: AgentLinkClientOptions);
|
|
31
32
|
/**
|
|
@@ -36,6 +37,10 @@ declare class AgentLinkClient {
|
|
|
36
37
|
* 从服务器获取 Token
|
|
37
38
|
*/
|
|
38
39
|
private fetchToken;
|
|
40
|
+
/**
|
|
41
|
+
* 检查域名是否在白名单中
|
|
42
|
+
*/
|
|
43
|
+
private checkWhitelist;
|
|
39
44
|
/**
|
|
40
45
|
* 验证发送端的 Token 和 Origin
|
|
41
46
|
*/
|
|
@@ -50,16 +55,18 @@ declare class AgentLinkClient {
|
|
|
50
55
|
sendData(targetUrl: string, data: any, type: string, windowName?: string): Promise<void>;
|
|
51
56
|
/**
|
|
52
57
|
* 监听来自 URL 的数据
|
|
53
|
-
* @param callback
|
|
58
|
+
* @param callback 接收到数据时的回调函数,现在包含验证信息
|
|
54
59
|
*/
|
|
55
|
-
receiveData(callback: (data: any, type: string, senderInfo?: SenderInfo) => void): () => void;
|
|
60
|
+
receiveData(callback: (data: any, type: string, senderInfo?: SenderInfo, verification?: string) => void): () => void;
|
|
56
61
|
/**
|
|
57
62
|
* 从当前 URL 获取数据并验证发送方
|
|
63
|
+
* 即使验证失败也返回数据,但会标记验证状态
|
|
58
64
|
*/
|
|
59
65
|
getDataFromUrl(url?: string): Promise<{
|
|
60
66
|
data: any;
|
|
61
67
|
type: string;
|
|
62
68
|
senderInfo?: SenderInfo;
|
|
69
|
+
verification?: string;
|
|
63
70
|
} | null>;
|
|
64
71
|
/**
|
|
65
72
|
* 获取白名单信息
|
|
@@ -89,11 +96,12 @@ interface URLData {
|
|
|
89
96
|
type: string;
|
|
90
97
|
token: string;
|
|
91
98
|
origin: string;
|
|
99
|
+
verification?: string;
|
|
92
100
|
}
|
|
93
101
|
/**
|
|
94
102
|
* 将数据编码为 URL hash
|
|
95
103
|
*/
|
|
96
|
-
declare function encodeDataToUrl(data: any, type: string, token: string, origin: string, baseUrl: string): Promise<string>;
|
|
104
|
+
declare function encodeDataToUrl(data: any, type: string, token: string, origin: string, baseUrl: string, verification?: string): Promise<string>;
|
|
97
105
|
/**
|
|
98
106
|
* 从 URL 中解码数据
|
|
99
107
|
*/
|
package/dist/index.js
CHANGED
|
@@ -66,8 +66,11 @@ function base64ToUint8Array(base64) {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
// src/utils/url.ts
|
|
69
|
-
async function encodeDataToUrl(data, type, token, origin, baseUrl) {
|
|
69
|
+
async function encodeDataToUrl(data, type, token, origin, baseUrl, verification) {
|
|
70
70
|
const payload = { data, type, token, origin };
|
|
71
|
+
if (verification !== void 0) {
|
|
72
|
+
payload.verification = verification;
|
|
73
|
+
}
|
|
71
74
|
const jsonString = JSON.stringify(payload);
|
|
72
75
|
const compressed = await compress(jsonString);
|
|
73
76
|
const base64 = uint8ArrayToBase64(compressed);
|
|
@@ -170,6 +173,21 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
170
173
|
this.token = token;
|
|
171
174
|
return token;
|
|
172
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* 检查域名是否在白名单中
|
|
178
|
+
*/
|
|
179
|
+
async checkWhitelist(origin) {
|
|
180
|
+
const cached = _AgentLinkClient.whitelistCache.get(origin);
|
|
181
|
+
if (cached && Date.now() - cached.timestamp < _AgentLinkClient.CACHE_TTL) {
|
|
182
|
+
return cached.verified;
|
|
183
|
+
}
|
|
184
|
+
const verified = await verifyWhitelist(this.serverUrl, origin);
|
|
185
|
+
_AgentLinkClient.whitelistCache.set(origin, {
|
|
186
|
+
verified,
|
|
187
|
+
timestamp: Date.now()
|
|
188
|
+
});
|
|
189
|
+
return verified;
|
|
190
|
+
}
|
|
173
191
|
/**
|
|
174
192
|
* 验证发送端的 Token 和 Origin
|
|
175
193
|
*/
|
|
@@ -205,7 +223,9 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
205
223
|
async sendData(targetUrl, data, type, windowName = _AgentLinkClient.DEFAULT_WINDOW_NAME) {
|
|
206
224
|
const token = await this.ensureToken();
|
|
207
225
|
const origin = window.location.origin;
|
|
208
|
-
const
|
|
226
|
+
const isWhitelisted = await this.checkWhitelist(origin);
|
|
227
|
+
const verification = isWhitelisted ? "mixlab launchpad\u52A0\u901F\u8BA1\u5212" : "\u672A\u9A8C\u8BC1";
|
|
228
|
+
const encodedUrl = await encodeDataToUrl(data, type, token, origin, targetUrl, verification);
|
|
209
229
|
const targetWindow = window.open(encodedUrl, windowName);
|
|
210
230
|
if (!targetWindow) {
|
|
211
231
|
throw new Error("[AgentLink] Failed to open target window. It might be blocked by a popup blocker.");
|
|
@@ -214,13 +234,13 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
214
234
|
}
|
|
215
235
|
/**
|
|
216
236
|
* 监听来自 URL 的数据
|
|
217
|
-
* @param callback
|
|
237
|
+
* @param callback 接收到数据时的回调函数,现在包含验证信息
|
|
218
238
|
*/
|
|
219
239
|
receiveData(callback) {
|
|
220
240
|
const handleHashChange = async () => {
|
|
221
241
|
const result = await this.getDataFromUrl();
|
|
222
242
|
if (result) {
|
|
223
|
-
callback(result.data, result.type, result.senderInfo);
|
|
243
|
+
callback(result.data, result.type, result.senderInfo, result.verification);
|
|
224
244
|
}
|
|
225
245
|
};
|
|
226
246
|
window.addEventListener("hashchange", handleHashChange);
|
|
@@ -231,6 +251,7 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
231
251
|
}
|
|
232
252
|
/**
|
|
233
253
|
* 从当前 URL 获取数据并验证发送方
|
|
254
|
+
* 即使验证失败也返回数据,但会标记验证状态
|
|
234
255
|
*/
|
|
235
256
|
async getDataFromUrl(url) {
|
|
236
257
|
const targetUrl = url || window.location.href;
|
|
@@ -239,14 +260,18 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
239
260
|
return null;
|
|
240
261
|
}
|
|
241
262
|
const senderInfo = await this.verifySender(urlData.token, urlData.origin);
|
|
263
|
+
let verification = urlData.verification;
|
|
264
|
+
if (!verification) {
|
|
265
|
+
verification = senderInfo ? "mixlab launchpad\u52A0\u901F\u8BA1\u5212" : "\u672A\u9A8C\u8BC1";
|
|
266
|
+
}
|
|
242
267
|
if (!senderInfo) {
|
|
243
|
-
console.warn(`[AgentLink] Data received but sender verification failed`);
|
|
244
|
-
return null;
|
|
268
|
+
console.warn(`[AgentLink] Data received but sender verification failed. Verification: ${verification}`);
|
|
245
269
|
}
|
|
246
270
|
return {
|
|
247
271
|
data: urlData.data,
|
|
248
272
|
type: urlData.type,
|
|
249
|
-
senderInfo
|
|
273
|
+
senderInfo: senderInfo || void 0,
|
|
274
|
+
verification
|
|
250
275
|
};
|
|
251
276
|
}
|
|
252
277
|
/**
|
|
@@ -259,6 +284,8 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
259
284
|
_AgentLinkClient.DEFAULT_WINDOW_NAME = "agentlink-window";
|
|
260
285
|
// 接收端验证结果缓存(静态,跨实例共享)
|
|
261
286
|
_AgentLinkClient.tokenCache = /* @__PURE__ */ new Map();
|
|
287
|
+
// 白名单验证缓存(避免重复请求)
|
|
288
|
+
_AgentLinkClient.whitelistCache = /* @__PURE__ */ new Map();
|
|
262
289
|
// 缓存过期时间:1 小时
|
|
263
290
|
_AgentLinkClient.CACHE_TTL = 60 * 60 * 1e3;
|
|
264
291
|
var AgentLinkClient = _AgentLinkClient;
|
package/dist/index.mjs
CHANGED
|
@@ -32,8 +32,11 @@ function base64ToUint8Array(base64) {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// src/utils/url.ts
|
|
35
|
-
async function encodeDataToUrl(data, type, token, origin, baseUrl) {
|
|
35
|
+
async function encodeDataToUrl(data, type, token, origin, baseUrl, verification) {
|
|
36
36
|
const payload = { data, type, token, origin };
|
|
37
|
+
if (verification !== void 0) {
|
|
38
|
+
payload.verification = verification;
|
|
39
|
+
}
|
|
37
40
|
const jsonString = JSON.stringify(payload);
|
|
38
41
|
const compressed = await compress(jsonString);
|
|
39
42
|
const base64 = uint8ArrayToBase64(compressed);
|
|
@@ -136,6 +139,21 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
136
139
|
this.token = token;
|
|
137
140
|
return token;
|
|
138
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* 检查域名是否在白名单中
|
|
144
|
+
*/
|
|
145
|
+
async checkWhitelist(origin) {
|
|
146
|
+
const cached = _AgentLinkClient.whitelistCache.get(origin);
|
|
147
|
+
if (cached && Date.now() - cached.timestamp < _AgentLinkClient.CACHE_TTL) {
|
|
148
|
+
return cached.verified;
|
|
149
|
+
}
|
|
150
|
+
const verified = await verifyWhitelist(this.serverUrl, origin);
|
|
151
|
+
_AgentLinkClient.whitelistCache.set(origin, {
|
|
152
|
+
verified,
|
|
153
|
+
timestamp: Date.now()
|
|
154
|
+
});
|
|
155
|
+
return verified;
|
|
156
|
+
}
|
|
139
157
|
/**
|
|
140
158
|
* 验证发送端的 Token 和 Origin
|
|
141
159
|
*/
|
|
@@ -171,7 +189,9 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
171
189
|
async sendData(targetUrl, data, type, windowName = _AgentLinkClient.DEFAULT_WINDOW_NAME) {
|
|
172
190
|
const token = await this.ensureToken();
|
|
173
191
|
const origin = window.location.origin;
|
|
174
|
-
const
|
|
192
|
+
const isWhitelisted = await this.checkWhitelist(origin);
|
|
193
|
+
const verification = isWhitelisted ? "mixlab launchpad\u52A0\u901F\u8BA1\u5212" : "\u672A\u9A8C\u8BC1";
|
|
194
|
+
const encodedUrl = await encodeDataToUrl(data, type, token, origin, targetUrl, verification);
|
|
175
195
|
const targetWindow = window.open(encodedUrl, windowName);
|
|
176
196
|
if (!targetWindow) {
|
|
177
197
|
throw new Error("[AgentLink] Failed to open target window. It might be blocked by a popup blocker.");
|
|
@@ -180,13 +200,13 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
180
200
|
}
|
|
181
201
|
/**
|
|
182
202
|
* 监听来自 URL 的数据
|
|
183
|
-
* @param callback
|
|
203
|
+
* @param callback 接收到数据时的回调函数,现在包含验证信息
|
|
184
204
|
*/
|
|
185
205
|
receiveData(callback) {
|
|
186
206
|
const handleHashChange = async () => {
|
|
187
207
|
const result = await this.getDataFromUrl();
|
|
188
208
|
if (result) {
|
|
189
|
-
callback(result.data, result.type, result.senderInfo);
|
|
209
|
+
callback(result.data, result.type, result.senderInfo, result.verification);
|
|
190
210
|
}
|
|
191
211
|
};
|
|
192
212
|
window.addEventListener("hashchange", handleHashChange);
|
|
@@ -197,6 +217,7 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
197
217
|
}
|
|
198
218
|
/**
|
|
199
219
|
* 从当前 URL 获取数据并验证发送方
|
|
220
|
+
* 即使验证失败也返回数据,但会标记验证状态
|
|
200
221
|
*/
|
|
201
222
|
async getDataFromUrl(url) {
|
|
202
223
|
const targetUrl = url || window.location.href;
|
|
@@ -205,14 +226,18 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
205
226
|
return null;
|
|
206
227
|
}
|
|
207
228
|
const senderInfo = await this.verifySender(urlData.token, urlData.origin);
|
|
229
|
+
let verification = urlData.verification;
|
|
230
|
+
if (!verification) {
|
|
231
|
+
verification = senderInfo ? "mixlab launchpad\u52A0\u901F\u8BA1\u5212" : "\u672A\u9A8C\u8BC1";
|
|
232
|
+
}
|
|
208
233
|
if (!senderInfo) {
|
|
209
|
-
console.warn(`[AgentLink] Data received but sender verification failed`);
|
|
210
|
-
return null;
|
|
234
|
+
console.warn(`[AgentLink] Data received but sender verification failed. Verification: ${verification}`);
|
|
211
235
|
}
|
|
212
236
|
return {
|
|
213
237
|
data: urlData.data,
|
|
214
238
|
type: urlData.type,
|
|
215
|
-
senderInfo
|
|
239
|
+
senderInfo: senderInfo || void 0,
|
|
240
|
+
verification
|
|
216
241
|
};
|
|
217
242
|
}
|
|
218
243
|
/**
|
|
@@ -225,6 +250,8 @@ var _AgentLinkClient = class _AgentLinkClient {
|
|
|
225
250
|
_AgentLinkClient.DEFAULT_WINDOW_NAME = "agentlink-window";
|
|
226
251
|
// 接收端验证结果缓存(静态,跨实例共享)
|
|
227
252
|
_AgentLinkClient.tokenCache = /* @__PURE__ */ new Map();
|
|
253
|
+
// 白名单验证缓存(避免重复请求)
|
|
254
|
+
_AgentLinkClient.whitelistCache = /* @__PURE__ */ new Map();
|
|
228
255
|
// 缓存过期时间:1 小时
|
|
229
256
|
_AgentLinkClient.CACHE_TTL = 60 * 60 * 1e3;
|
|
230
257
|
var AgentLinkClient = _AgentLinkClient;
|