@asgard-js/core 0.3.81 → 0.3.82
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 +30 -0
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +343 -329
- package/dist/index.mjs.map +1 -1
- package/dist/lib/client.d.ts +18 -10
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/sandbox-channel-scope.spec.d.ts +2 -0
- package/dist/lib/sandbox-channel-scope.spec.d.ts.map +1 -0
- package/dist/types/sandbox-fs.d.ts +13 -3
- package/dist/types/sandbox-fs.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/lib/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventType } from '../constants/enum';
|
|
2
2
|
import { Observable, Subscription } from 'rxjs';
|
|
3
|
-
import { ChannelMetadata, ClientConfig, IAsgardServiceClient, FetchSsePayload, FetchSseOptions, SseResponse, SseEvents, BlobUploadResponse, ChannelHomeDownloadResult, MessageFeedbackReply, MessageFeedbackRequest, SandboxFsCopyMoveOptions, SandboxFsCopyResult, SandboxFsListResult, SandboxFsReadOptions, SandboxFsReadResult, SandboxFsStatResult, SandboxFsWatchEvent, SandboxFsWriteOptions, SandboxFsWriteResult, StopGenerationOptions } from '../types';
|
|
3
|
+
import { ChannelMetadata, ClientConfig, IAsgardServiceClient, FetchSsePayload, FetchSseOptions, SseResponse, SseEvents, BlobUploadResponse, ChannelHomeDownloadResult, MessageFeedbackReply, MessageFeedbackRequest, SandboxChannelScope, SandboxFsCopyMoveOptions, SandboxFsCopyResult, SandboxFsListResult, SandboxFsReadOptions, SandboxFsReadResult, SandboxFsStatResult, SandboxFsWatchEvent, SandboxFsWriteOptions, SandboxFsWriteResult, StopGenerationOptions } from '../types';
|
|
4
4
|
|
|
5
5
|
export default class AsgardServiceClient implements IAsgardServiceClient {
|
|
6
6
|
private apiKey?;
|
|
@@ -117,21 +117,29 @@ export default class AsgardServiceClient implements IAsgardServiceClient {
|
|
|
117
117
|
/**
|
|
118
118
|
* F-020 — 取得 sandbox 瀏覽器一次性接手 URL(`sandbox://<name>/open-browser` 卡的副作用)。
|
|
119
119
|
* 呼叫 `POST {base}/sandbox/{sandboxName}/browser/open-url`(對標 asgard-core edgeserver
|
|
120
|
-
* `GenerateSandboxBrowserOpenUrl`:path 參數 namespace / bot-provider 已在 base、sandbox_name
|
|
121
|
-
*
|
|
120
|
+
* `GenerateSandboxBrowserOpenUrl`:path 參數 namespace / bot-provider 已在 base、sandbox_name 在路徑)。
|
|
121
|
+
* 回應 `{ data: { openURL } }`(envelope 容錯,比照 `channelMetadata`)。
|
|
122
|
+
*
|
|
123
|
+
* `options.customChannelId` 帶上該 sandbox 所屬的 channel(`SandboxChannelScope`)。直接對 edge server
|
|
124
|
+
* 呼叫時它會被忽略,但前置 relay 用它做 ownership 證明,缺了就是 `400`。
|
|
122
125
|
*/
|
|
123
|
-
generateSandboxBrowserOpenUrl(sandboxName: string): Promise<string>;
|
|
126
|
+
generateSandboxBrowserOpenUrl(sandboxName: string, options?: SandboxChannelScope): Promise<string>;
|
|
124
127
|
/**
|
|
125
128
|
* F-021 — 衍生 sandbox fs 端點 base:`{base}/sandbox/{sandboxName}/fs`(namespace / bot-provider 已在 base)。
|
|
126
129
|
*/
|
|
127
130
|
private deriveSandboxFsEndpoint;
|
|
131
|
+
/**
|
|
132
|
+
* F-021 — one sandbox fs URL, with the channel scope already on it. Every `fs/*` call goes through here
|
|
133
|
+
* so the ownership parameter cannot be forgotten in one of eleven places (see `withChannelScope`).
|
|
134
|
+
*/
|
|
135
|
+
private sandboxFsUrl;
|
|
128
136
|
/** The shared auth / custom headers for the client's plain-JSON REST calls (no SSE). */
|
|
129
137
|
private apiHeaders;
|
|
130
138
|
/**
|
|
131
139
|
* F-021 — 列出 sandbox 目錄內容(`GET fs/list?path=`)。回應 `{ data: { entries, truncated } }`(envelope
|
|
132
140
|
* 容錯,比照 `channelMetadata`)。
|
|
133
141
|
*/
|
|
134
|
-
sandboxFsList(sandboxName: string, path: string): Promise<SandboxFsListResult>;
|
|
142
|
+
sandboxFsList(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<SandboxFsListResult>;
|
|
135
143
|
/**
|
|
136
144
|
* F-021 — 讀取 sandbox 檔案(`GET fs/file?path=[&offset_bytes&limit_bytes]`)。回應是 raw octet-stream,
|
|
137
145
|
* 檔案總長度 / 是否截斷走 `X-Total-Bytes` / `X-Truncated` header。
|
|
@@ -145,13 +153,13 @@ export default class AsgardServiceClient implements IAsgardServiceClient {
|
|
|
145
153
|
/** F-021 Cycle 2 — `sandbox://` fs mutation shared request helper (throws `HttpError` on non-OK). */
|
|
146
154
|
private sandboxFsRequest;
|
|
147
155
|
/** F-021 — stat a sandbox path (`GET fs/stat?path=`). */
|
|
148
|
-
sandboxFsStat(sandboxName: string, path: string): Promise<SandboxFsStatResult>;
|
|
156
|
+
sandboxFsStat(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<SandboxFsStatResult>;
|
|
149
157
|
/** F-021 — create a directory (`POST fs/mkdir?path=`). */
|
|
150
|
-
sandboxFsMkdir(sandboxName: string, path: string): Promise<void>;
|
|
158
|
+
sandboxFsMkdir(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void>;
|
|
151
159
|
/** F-021 — delete a file (`DELETE fs/item?path=`). */
|
|
152
|
-
sandboxFsRemove(sandboxName: string, path: string): Promise<void>;
|
|
160
|
+
sandboxFsRemove(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void>;
|
|
153
161
|
/** F-021 — recursively delete a directory (`DELETE fs/all?path=`). */
|
|
154
|
-
sandboxFsRemoveAll(sandboxName: string, path: string): Promise<void>;
|
|
162
|
+
sandboxFsRemoveAll(sandboxName: string, path: string, options?: SandboxChannelScope): Promise<void>;
|
|
155
163
|
/** F-021 — copy a path (`POST fs/copy?src=&dst=[&overwrite]`) → bytes copied. */
|
|
156
164
|
sandboxFsCopy(sandboxName: string, src: string, dst: string, options?: SandboxFsCopyMoveOptions): Promise<SandboxFsCopyResult>;
|
|
157
165
|
/** F-021 — move / rename a path (`POST fs/move?src=&dst=[&overwrite]`). */
|
|
@@ -161,7 +169,7 @@ export default class AsgardServiceClient implements IAsgardServiceClient {
|
|
|
161
169
|
* `SandboxFsWatchEvent`. The backend probes the path first, so a missing path errors as HTTP rather than
|
|
162
170
|
* as a dead stream. Unsubscribing aborts the request, which ends the sandbox-side watcher.
|
|
163
171
|
*/
|
|
164
|
-
sandboxFsWatch(sandboxName: string, path: string): Observable<SandboxFsWatchEvent>;
|
|
172
|
+
sandboxFsWatch(sandboxName: string, path: string, options?: SandboxChannelScope): Observable<SandboxFsWatchEvent>;
|
|
165
173
|
/**
|
|
166
174
|
* 從 botProviderEndpoint 衍生 Blob API endpoint
|
|
167
175
|
*/
|
package/dist/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,WAAW,EACX,SAAS,EACT,kBAAkB,EAClB,yBAAyB,EACzB,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAgC,UAAU,EAAW,YAAY,EAAa,MAAM,MAAM,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-channel-scope.spec.d.ts","sourceRoot":"","sources":["../../src/lib/sandbox-channel-scope.spec.ts"],"names":[],"mappings":""}
|
|
@@ -15,8 +15,18 @@ export interface SandboxFsListResult {
|
|
|
15
15
|
/** True when the backend capped the listing. */
|
|
16
16
|
truncated: boolean;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Channel scope for every sandbox call, sent as `custom_channel_id`. An asgard-core edge server takes the
|
|
20
|
+
* sandbox from the path and ignores it; a relay in front of one uses it to prove the caller owns the
|
|
21
|
+
* sandbox and answers `400 custom_channel_id is required` without it. Optional only so existing callers
|
|
22
|
+
* keep compiling — pass it whenever there is a channel. See the README's channel-scope section.
|
|
23
|
+
*/
|
|
24
|
+
export interface SandboxChannelScope {
|
|
25
|
+
/** The channel that owns the sandbox, sent as the `custom_channel_id` query parameter. */
|
|
26
|
+
customChannelId?: string;
|
|
27
|
+
}
|
|
18
28
|
/** Optional byte-range for `GET fs/file`. */
|
|
19
|
-
export interface SandboxFsReadOptions {
|
|
29
|
+
export interface SandboxFsReadOptions extends SandboxChannelScope {
|
|
20
30
|
offsetBytes?: number;
|
|
21
31
|
limitBytes?: number;
|
|
22
32
|
}
|
|
@@ -29,7 +39,7 @@ export interface SandboxFsReadResult {
|
|
|
29
39
|
truncated: boolean;
|
|
30
40
|
}
|
|
31
41
|
/** Options for `PUT fs/file`. */
|
|
32
|
-
export interface SandboxFsWriteOptions {
|
|
42
|
+
export interface SandboxFsWriteOptions extends SandboxChannelScope {
|
|
33
43
|
/** Unix file mode in decimal (default 420 = 0644). */
|
|
34
44
|
mode?: number;
|
|
35
45
|
/** Fail with 409 if the file already exists. */
|
|
@@ -55,7 +65,7 @@ export interface SandboxFsStatResult {
|
|
|
55
65
|
etag?: string;
|
|
56
66
|
}
|
|
57
67
|
/** Options for `POST fs/copy` / `POST fs/move` (F-021 Cycle 2). */
|
|
58
|
-
export interface SandboxFsCopyMoveOptions {
|
|
68
|
+
export interface SandboxFsCopyMoveOptions extends SandboxChannelScope {
|
|
59
69
|
/** Overwrite an existing destination. */
|
|
60
70
|
overwrite?: boolean;
|
|
61
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-fs.d.ts","sourceRoot":"","sources":["../../src/types/sandbox-fs.ts"],"names":[],"mappings":"AAGA,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"sandbox-fs.d.ts","sourceRoot":"","sources":["../../src/types/sandbox-fs.ts"],"names":[],"mappings":"AAGA,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,gDAAgD;IAChD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,6CAA6C;AAC7C,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,4FAA4F;AAC5F,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,iCAAiC;AACjC,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAChE,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,8GAA8G;AAC9G,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,MAAM,WAAW,wBAAyB,SAAQ,mBAAmB;IACnE,yCAAyC;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,EAAE,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvD,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB"}
|