@qmuse/cloud-client 1.0.5 → 1.0.6-dev.2

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 (52) hide show
  1. package/README.md +61 -3
  2. package/dist/adapters.d.ts +17 -1
  3. package/dist/adapters.d.ts.map +1 -1
  4. package/dist/adapters.js +22 -2
  5. package/dist/adapters.js.map +1 -1
  6. package/dist/auth.d.ts +8 -1
  7. package/dist/auth.d.ts.map +1 -1
  8. package/dist/auth.js +228 -50
  9. package/dist/auth.js.map +1 -1
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +75 -28
  12. package/dist/client.js.map +1 -1
  13. package/dist/diagnostics.d.ts +1 -1
  14. package/dist/diagnostics.d.ts.map +1 -1
  15. package/dist/diagnostics.js +23 -2
  16. package/dist/diagnostics.js.map +1 -1
  17. package/dist/errors.d.ts +16 -0
  18. package/dist/errors.d.ts.map +1 -1
  19. package/dist/errors.js +23 -0
  20. package/dist/errors.js.map +1 -1
  21. package/dist/files.d.ts +8 -2
  22. package/dist/files.d.ts.map +1 -1
  23. package/dist/files.js +215 -48
  24. package/dist/files.js.map +1 -1
  25. package/dist/http-auth-error.d.ts +3 -0
  26. package/dist/http-auth-error.d.ts.map +1 -0
  27. package/dist/http-auth-error.js +13 -0
  28. package/dist/http-auth-error.js.map +1 -0
  29. package/dist/index.d.ts +2 -2
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/jobs.d.ts +11 -0
  34. package/dist/jobs.d.ts.map +1 -0
  35. package/dist/jobs.js +127 -0
  36. package/dist/jobs.js.map +1 -0
  37. package/dist/miniapp.d.ts.map +1 -1
  38. package/dist/miniapp.js +24 -1
  39. package/dist/miniapp.js.map +1 -1
  40. package/dist/types.d.ts +86 -0
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/web-session-coordination.d.ts +15 -0
  43. package/dist/web-session-coordination.d.ts.map +1 -0
  44. package/dist/web-session-coordination.js +145 -0
  45. package/dist/web-session-coordination.js.map +1 -0
  46. package/dist/web.d.ts.map +1 -1
  47. package/dist/web.js +13 -3
  48. package/dist/web.js.map +1 -1
  49. package/docs/auth.md +11 -0
  50. package/docs/files.md +171 -0
  51. package/docs/jobs.md +69 -0
  52. package/package.json +1 -1
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # @qmuse/cloud-client
2
2
 
3
3
  用户名密码登录请先读 [认证接入契约与完整示例](docs/auth.md):包含输入字段、用户返回值、恢复会话、注册后登录和退出。
4
+
5
+ 异步长任务请读 [提交、续查与结果确认契约](docs/jobs.md):包括账号绑定、原业务键重试和回执丢失恢复。使用已发布且包含 `jobs.start/get` 的 SDK 版本,并搭配支持预期账号校验的 Function 认证 helper;现有应用需分别核对安装包和已部署 helper。
4
6
  下方 SDK 示例使用宿主已初始化的客户端;QMuse 生成项目通过 `src/services/cloud` 接入,项目接入说明由 CLI 同步此认证契约。
5
7
 
6
8
  Unified Web/PC/mini-program client for QMuse Cloud services. Business APIs use
@@ -136,8 +138,11 @@ The name is used for both the upload intent and every multipart chunk. For a
136
138
 
137
139
  The upload flow creates an intent through `qmuse-cloud-api`, uploads in 5 MiB
138
140
  chunks through the injected Web or mini-program data-plane transport, then
139
- completes the intent through the Function. Failures issue a best-effort cancel;
140
- the backend must also expire abandoned intents. Preview/download access is
141
+ completes the intent through the Function. Failures preserve the original upload
142
+ reference and never automatically cancel or retransmit the file. The file
143
+ recovery API provides `onUploadState`, `prepareUpload`, `completeUpload` and explicit
144
+ `cancelUpload`; see [file recovery](docs/files.md). An intent expiry does not
145
+ schedule physical file cleanup. Preview/download access is
141
146
  authorized by the Function and may return a short-lived File Token URL or an
142
147
  authenticated URL that the Web transport converts to a disposable Blob URL.
143
148
  The client intentionally exposes no file-list API; applications keep the file
@@ -195,10 +200,57 @@ Only `/api` paths and an allowlist of business headers are accepted. The client
195
200
  uses synchronous Function execution, reads `responseStatusCode`, `responseBody`,
196
201
  and `responseHeaders`, and maps non-2xx responses to `QmuseCloudHttpError`.
197
202
 
203
+ Ordinary requests capture the method, path, query, allowed headers and JSON body
204
+ when invoked, before Session preparation can yield. Later form edits do not
205
+ change that submitted intent. A permitted transport401 retry uses the same body
206
+ and business headers. Non-serializable bodies fail before authentication or
207
+ submission with `BODY_NOT_SERIALIZABLE`.
208
+
198
209
  The client never replays a completed Function response, including a business
199
210
  401, because replaying a write could duplicate side effects. The host adapter is
200
211
  responsible for Session coordination and may retry `createExecution` once only
201
212
  when the execution API request itself fails with a transport-level 401.
213
+ The shared Auth runtime checks identity before that retry and before returning a
214
+ successful response. Logout, login, explicit Session restore, or renewal to a
215
+ different user or role invalidates an in-flight response with `AUTH_STATE_CHANGED`;
216
+ the same applies when a trusted profile response updates the cached role.
217
+ Same-user, same-role Session renewal keeps ordinary requests valid. A changed
218
+ identity cannot refresh and replay the old request. This applies to file metadata
219
+ and access URLs through the same request path. It does not roll back an operation
220
+ that already ran on the server; reconcile writes before resubmitting them.
221
+
222
+ Private access URL delivery additionally verifies the native Account owner,
223
+ including after an authenticated Blob read, so a missed Session notice does not
224
+ leave the cached owner as the only check. A mismatch rejects with
225
+ `AUTH_STATE_CHANGED` and requires explicit restore. Public URLs keep their
226
+ existing account discovery cost; already delivered URLs are not revoked.
227
+
228
+ Login, provider/miniapp login, logout, and logout-all close the old identity
229
+ boundary as soon as they begin. Until that change finishes, new business work,
230
+ Session restore/refresh, and a second authentication change fail with
231
+ `AUTH_STATE_CHANGED`. Successful login opens the new identity; successful logout
232
+ confirms anonymous public access. After a failed change, preserve the actual
233
+ error and explicitly restore the Session before submitting new business work.
234
+
235
+ The Web entry also sends credential-free Session-change notices between
236
+ same-origin tabs, scoped to the AppBase endpoint and Project. Login and logout
237
+ invalidate other tabs' cached identity and pending request boundaries. Receiving
238
+ a notice also blocks new business requests with `AUTH_STATE_CHANGED` until an
239
+ explicit Session restore or successful login acknowledges the current identity.
240
+ Request preparation and identity guards also read the current scoped notice
241
+ marker, so a dropped or delayed storage event does not leave the old cache as
242
+ the only boundary. This uses local storage and adds no native auth request.
243
+ Already observed queued events cannot invalidate an explicitly restored owner.
244
+ Session refresh cannot acknowledge this change. Clear old UI data before
245
+ loading the restored user's data; no old request is replayed. Ordinary requests
246
+ carry an internal expected-user condition, using nonempty `@anonymous` for
247
+ an explicitly anonymous Session so execution transports cannot drop the condition.
248
+ Public file routes check it even without a Session, before creating database
249
+ capabilities. An owner mismatch reported by native Account
250
+ verification or the backend requires the same explicit recovery.
251
+ Storage availability and origin boundaries limit these notices. The backend
252
+ must still check the initiating-user condition against the verified principal
253
+ to protect changes that the SDK has not observed.
202
254
 
203
255
  Direct Storage upload is an internal data-plane optimization, not a claim that
204
256
  the bucket ID is secret on the network or that the protocol can only reach the
@@ -224,6 +276,12 @@ aborts are not reported; server errors, failed executions, network failures and
224
276
  404/405/408/429 responses are diagnostic candidates. Runtime configuration
225
277
  loading and direct Storage transfers are outside this Function-request observer.
226
278
 
279
+ Request IDs prefer a valid `X-Request-ID` response header. If that header is
280
+ missing or unusable, a small JSON error envelope may supply its validated
281
+ `error.requestId`. No error text, details or other payload fields are forwarded.
282
+ A request ID is correlation metadata and does not imply a W3C Trace ID or
283
+ permission to retrieve backend logs.
284
+
227
285
  `QmuseCloudClientOptions.onRequestFailure` is optional for custom host adapters;
228
286
  observer failures cannot change request outcomes. The built-in web preview bridge
229
287
  uses `qmuse.cloud-diagnostics` version 1 (`ready`, `connect`, `failure`,
@@ -266,4 +324,4 @@ temporarily normalizes the public package name and registry and restores
266
324
 
267
325
  ### Public file uploads
268
326
 
269
- For newly generated Hono services, `files.upload({ resource: 'public-file', file })` works without an application login. The SDK forwards the upload-specific completion credential internally. A missing credential is a protocol error; it does not trigger login or a guest Session. Anonymous failures preserve the primary error and do not call the protected cancel endpoint. Private files and avatars continue to require application identity. Login, registration, restore and refresh semantics are unchanged. Public direct uploads may be readable before completion; anonymous delete/cancel is not supported.
327
+ For Hono services configured for anonymous public uploads, `files.upload({ resource: 'public-file', file })` can run without an application login. The SDK forwards the upload-specific completion credential internally. A missing credential is a protocol error; it does not trigger login or a guest Session. The file recovery API exposes the original failure through `QmuseCloudUploadError.cause` and retains its upload reference without cancelling. That reference contains a secret and must be stored privately. A lost initial anonymous intent response cannot be recovered from an idempotency key alone. Private files and avatars continue to require application identity. Login, registration, restore and refresh semantics are unchanged. Public direct uploads may be readable before completion; anonymous delete/cancel is not supported.
@@ -1,12 +1,22 @@
1
- import type { CloudAccountCapability, CloudAuthOptions, CloudExecution, CloudExecutionInput, CloudFileTransport, QmuseCloudClient, QmuseCloudClientOptions } from './types.js';
1
+ import type { CloudAccountCapability, CloudAuthOptions, CloudExecution, CloudExecutionInput, CloudAsyncExecutionInput, CloudFileTransport, QmuseCloudClient, QmuseCloudClientOptions } from './types.js';
2
2
  export type AppBaseExecutionInput = Omit<CloudExecutionInput, 'functionId'> & {
3
3
  functionId: string;
4
4
  };
5
+ export type AppBaseAsyncExecutionInput = Omit<CloudAsyncExecutionInput, 'functionId'> & {
6
+ functionId: string;
7
+ };
8
+ export interface AppBaseExecutionReference {
9
+ functionId: string;
10
+ executionId: string;
11
+ }
5
12
  export interface AppBaseFunctionsCapability {
6
13
  createExecution(input: AppBaseExecutionInput): Promise<CloudExecution>;
14
+ createAsyncExecution?(input: AppBaseAsyncExecutionInput): Promise<CloudExecution>;
15
+ getExecution?(input: AppBaseExecutionReference): Promise<CloudExecution>;
7
16
  }
8
17
  export interface AppBaseFunctionsSdkCapability {
9
18
  createExecution(...args: never[]): Promise<CloudExecution>;
19
+ getExecution?(...args: never[]): Promise<CloudExecution>;
10
20
  }
11
21
  export declare function createAppBaseFunctionsCapability(functions: AppBaseFunctionsSdkCapability): AppBaseFunctionsCapability;
12
22
  export interface AppBaseAccountSdkCapability {
@@ -42,14 +52,20 @@ export declare function createAppBaseAccountCapability(account: AppBaseAccountSd
42
52
  export interface PortableExecutionInput extends Omit<AppBaseExecutionInput, 'path'> {
43
53
  xpath: string;
44
54
  }
55
+ export interface PortableAsyncExecutionInput extends Omit<AppBaseAsyncExecutionInput, 'path'> {
56
+ xpath: string;
57
+ }
45
58
  export interface PortableAppwriteCapability {
46
59
  executeFunction(input: PortableExecutionInput): Promise<CloudExecution>;
60
+ executeAsyncFunction?(input: PortableAsyncExecutionInput): Promise<CloudExecution>;
61
+ getFunctionExecution?(input: AppBaseExecutionReference): Promise<CloudExecution>;
47
62
  }
48
63
  export interface HostAdapterOptions<FileSource = never> {
49
64
  onRequestFailure?: QmuseCloudClientOptions['onRequestFailure'];
50
65
  functionId?: string;
51
66
  auth?: CloudAuthOptions;
52
67
  fileTransport?: CloudFileTransport<FileSource>;
68
+ fileScope?: QmuseCloudClientOptions['fileScope'];
53
69
  }
54
70
  export declare function createAppBaseWebCloudClient<FileSource = never>(functions: AppBaseFunctionsCapability, options?: HostAdapterOptions<FileSource>): QmuseCloudClient<FileSource>;
55
71
  export declare function createPortableCloudClient<FileSource = never>(appwrite: PortableAppwriteCapability, options?: HostAdapterOptions<FileSource>): QmuseCloudClient<FileSource>;
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,EAAE,YAAY,CAAC,GAAG;IAC5E,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,6BAA6B;IAC5C,eAAe,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5D;AAED,wBAAgB,gCAAgC,CAC9C,SAAS,EAAE,6BAA6B,GACvC,0BAA0B,CAU5B;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,GAAG,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACnH,UAAU,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzE,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,aAAa,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjE,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,2BAA2B,GAAG,sBAAsB,CAY3G;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACjF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,eAAe,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACzE;AAED,MAAM,WAAW,kBAAkB,CAAC,UAAU,GAAG,KAAK;IACpD,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,aAAa,CAAC,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;CAChD;AAYD,wBAAgB,2BAA2B,CAAC,UAAU,GAAG,KAAK,EAC5D,SAAS,EAAE,0BAA0B,EACrC,OAAO,GAAE,kBAAkB,CAAC,UAAU,CAAM,GAC3C,gBAAgB,CAAC,UAAU,CAAC,CAU9B;AAED,wBAAgB,yBAAyB,CAAC,UAAU,GAAG,KAAK,EAC1D,QAAQ,EAAE,0BAA0B,EACpC,OAAO,GAAE,kBAAkB,CAAC,UAAU,CAAM,GAC3C,gBAAgB,CAAC,UAAU,CAAC,CAa9B"}
1
+ {"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
package/dist/adapters.js CHANGED
@@ -9,6 +9,11 @@ export function createAppBaseFunctionsCapability(functions) {
9
9
  const { path, ...sdkInput } = input;
10
10
  return functions.createExecution({ ...sdkInput, xpath: path });
11
11
  },
12
+ createAsyncExecution(input) {
13
+ const { path, ...sdkInput } = input;
14
+ return functions.createExecution({ ...sdkInput, xpath: path });
15
+ },
16
+ ...(typeof functions.getExecution === 'function' ? { getExecution: (input) => functions.getExecution(input) } : {}),
12
17
  };
13
18
  }
14
19
  export function createAppBaseAccountCapability(account) {
@@ -34,25 +39,40 @@ export function createAppBaseWebCloudClient(functions, options = {}) {
34
39
  if (!functions || typeof functions.createExecution !== 'function') {
35
40
  throw new TypeError('An AppBase Functions capability is required');
36
41
  }
42
+ const boundFunctionId = options.functionId?.trim() || 'qmuse-cloud-api';
37
43
  return createQmuseCloudClient({
38
- execute: input => functions.createExecution(executionInput(input, options.functionId)),
44
+ execute: input => functions.createExecution(executionInput(input, boundFunctionId)),
45
+ ...(functions.createAsyncExecution && functions.getExecution ? { jobs: {
46
+ start: (input) => functions.createAsyncExecution({ ...input, functionId: boundFunctionId }),
47
+ get: (input) => functions.getExecution({ ...input, functionId: boundFunctionId }),
48
+ } } : {}),
39
49
  ...(options.onRequestFailure ? { onRequestFailure: options.onRequestFailure } : {}),
40
50
  ...(options.auth ? { auth: options.auth } : {}),
41
51
  ...(options.fileTransport ? { fileTransport: options.fileTransport } : {}),
52
+ ...(options.fileScope ? { fileScope: { ...options.fileScope, functionId: boundFunctionId } } : {}),
42
53
  });
43
54
  }
44
55
  export function createPortableCloudClient(appwrite, options = {}) {
45
56
  if (!appwrite || typeof appwrite.executeFunction !== 'function') {
46
57
  throw new TypeError('A portable Appwrite execution capability is required');
47
58
  }
59
+ const boundFunctionId = options.functionId?.trim() || 'qmuse-cloud-api';
48
60
  return createQmuseCloudClient({
49
61
  execute: input => {
50
- const { path, ...portableInput } = executionInput(input, options.functionId);
62
+ const { path, ...portableInput } = executionInput(input, boundFunctionId);
51
63
  return appwrite.executeFunction({ ...portableInput, xpath: path });
52
64
  },
65
+ ...(appwrite.executeAsyncFunction && appwrite.getFunctionExecution ? { jobs: {
66
+ start: (input) => {
67
+ const { path, ...payload } = input;
68
+ return appwrite.executeAsyncFunction({ ...payload, functionId: boundFunctionId, xpath: path });
69
+ },
70
+ get: (input) => appwrite.getFunctionExecution({ ...input, functionId: boundFunctionId }),
71
+ } } : {}),
53
72
  ...(options.onRequestFailure ? { onRequestFailure: options.onRequestFailure } : {}),
54
73
  ...(options.auth ? { auth: options.auth } : {}),
55
74
  ...(options.fileTransport ? { fileTransport: options.fileTransport } : {}),
75
+ ...(options.fileScope ? { fileScope: { ...options.fileScope, functionId: boundFunctionId } } : {}),
56
76
  });
57
77
  }
58
78
  //# sourceMappingURL=adapters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../src/adapters.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts CHANGED
@@ -1,7 +1,14 @@
1
1
  import type { CloudAuthOptions, CloudAuthUser, CloudRequest, CloudResponse, QmuseCloudAuth } from './types.js';
2
- type AuthRequest = <T>(request: CloudRequest) => Promise<CloudResponse<T>>;
2
+ type AuthRequest = <T>(request: CloudRequest, expectedOwnerId?: string) => Promise<CloudResponse<T>>;
3
3
  export type CloudAuthRuntime = QmuseCloudAuth & {
4
4
  prepareRequest(): Promise<void>;
5
+ getSessionVersion(): number;
6
+ /** Request identity boundaries; same-user, same-role renewal preserves them. */
7
+ getRequestIdentityVersion(): number;
8
+ /** External Session changes require explicit restore or successful login before business requests. */
9
+ invalidateSession(version: number, requireRestore?: boolean): void;
10
+ /** Request reads preserve same-owner renewal; upload mutations retain the Session boundary. */
11
+ validateSessionOwner(ownerId: string | null, boundary?: 'session' | 'request'): Promise<void>;
5
12
  };
6
13
  export declare function toCloudAuthUser(value: {
7
14
  $id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAKb,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC,CAAC;AAoBF,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GAAG,aAAa,CAShB;AA2CD,wBAAgB,0BAA0B,IAAI,gBAAgB,CAiB7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,gBAAgB,CA6JjG"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EAKb,YAAY,EACZ,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAErG,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG;IAC9C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,iBAAiB,IAAI,MAAM,CAAC;IAC5B,gFAAgF;IAChF,yBAAyB,IAAI,MAAM,CAAC;IACpC,sGAAsG;IACtG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACnE,+FAA+F;IAC/F,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/F,CAAC;AAoBF,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC,GAAG,aAAa,CAShB;AAkDD,wBAAgB,0BAA0B,IAAI,gBAAgB,CAqB7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,WAAW,GAAG,gBAAgB,CA6SjG"}