@civitai/blocks-react 0.18.0 → 0.20.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 +23 -0
- package/dist/hooks/useHostOrigin.d.ts +34 -0
- package/dist/hooks/useHostOrigin.d.ts.map +1 -0
- package/dist/hooks/useHostOrigin.js +44 -0
- package/dist/hooks/useHostOrigin.js.map +1 -0
- package/dist/hooks/useSharedStorage.d.ts +97 -0
- package/dist/hooks/useSharedStorage.d.ts.map +1 -0
- package/dist/hooks/useSharedStorage.js +96 -0
- package/dist/hooks/useSharedStorage.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/iframeTransport.d.ts +18 -0
- package/dist/internal/iframeTransport.d.ts.map +1 -1
- package/dist/internal/iframeTransport.js +20 -0
- package/dist/internal/iframeTransport.js.map +1 -1
- package/dist/internal/inlineTransport.d.ts +7 -0
- package/dist/internal/inlineTransport.d.ts.map +1 -1
- package/dist/internal/inlineTransport.js +22 -1
- package/dist/internal/inlineTransport.js.map +1 -1
- package/dist/internal/mockHost.d.ts +75 -2
- package/dist/internal/mockHost.d.ts.map +1 -1
- package/dist/internal/mockHost.js +278 -3
- package/dist/internal/mockHost.js.map +1 -1
- package/dist/internal/transport.d.ts +16 -0
- package/dist/internal/transport.d.ts.map +1 -1
- package/dist/internal/transport.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/testing.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -113,6 +113,29 @@ const { raw, scopes, expiresAt, buzzBudget, refresh } = useBlockToken();
|
|
|
113
113
|
// after a 401: await refresh(); then retry the request once with the new `raw`.
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
+
### `useHostOrigin()`
|
|
117
|
+
|
|
118
|
+
The validated host origin to direct-fetch the App Blocks HTTP API against —
|
|
119
|
+
`undefined` until init. Use it as the base URL when you need to bypass the host
|
|
120
|
+
bridge, always paired with the bearer token from `useBlockToken()`.
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
const host = useHostOrigin(); // e.g. "https://civitai.com" (undefined until BLOCK_INIT)
|
|
124
|
+
const { raw } = useBlockToken();
|
|
125
|
+
// Once `host` is set, fetch the API on that validated origin with the block token:
|
|
126
|
+
if (host) {
|
|
127
|
+
const res = await fetch(`${host}/api/v1/blocks/me`, {
|
|
128
|
+
headers: { authorization: `Bearer ${raw}` },
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
> **Security:** this is ONLY ever the origin that passed the SDK's origin
|
|
134
|
+
> allowlist (the same gate `BLOCK_INIT` passes) — never `document.referrer` or
|
|
135
|
+
> `window.location` of the parent. The block token is a money-scoped bearer
|
|
136
|
+
> credential, so always send it to *this* origin. Never derive the API host
|
|
137
|
+
> from a spoofable browser signal.
|
|
138
|
+
|
|
116
139
|
### `useBlockSettings()`
|
|
117
140
|
|
|
118
141
|
Shorthand for `useBlockContext().settings`. Read-only from the iframe — settings
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the validated host (parent) origin the block may safely direct-fetch
|
|
3
|
+
* the civitai App Blocks HTTP API against — `undefined` until the transport
|
|
4
|
+
* has established it (iframe: the first allowlist-passing `BLOCK_INIT`;
|
|
5
|
+
* inline: bootstrap present).
|
|
6
|
+
*
|
|
7
|
+
* Use this as the base URL for a direct `fetch` to the App Blocks API when you
|
|
8
|
+
* need to bypass the host bridge — always paired with the bearer token from
|
|
9
|
+
* `useBlockToken()`:
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* const host = useHostOrigin();
|
|
13
|
+
* const { raw } = useBlockToken();
|
|
14
|
+
* if (!host) return null; // not initialized yet
|
|
15
|
+
* const res = await fetch(`${host}/api/v1/blocks/me`, {
|
|
16
|
+
* headers: { authorization: `Bearer ${raw}` },
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* SECURITY INVARIANT — the whole reason this hook exists: the value it returns
|
|
20
|
+
* is ONLY ever an origin that passed the transport's trust gate (the iframe
|
|
21
|
+
* `OriginMatcher` allowlist, or the inline same-origin host). It is NEVER
|
|
22
|
+
* derived from `document.referrer`, `window.location` of a cross-origin
|
|
23
|
+
* parent, or any unvalidated `event.origin`. `useBlockToken().raw` is a
|
|
24
|
+
* money-scoped bearer credential, so sending it to an unvalidated origin would
|
|
25
|
+
* be a token-exfiltration vector — always send the token to THIS origin, never
|
|
26
|
+
* to a host you read off a spoofable browser signal.
|
|
27
|
+
*
|
|
28
|
+
* Built on the same `useSyncExternalStore` subscription as `useBlockToken` /
|
|
29
|
+
* `useBlockContext`: the iframe transport captures the origin and emits in the
|
|
30
|
+
* same tick it applies `BLOCK_INIT`, so the hook re-renders with the origin the
|
|
31
|
+
* moment init lands.
|
|
32
|
+
*/
|
|
33
|
+
export declare function useHostOrigin(): string | undefined;
|
|
34
|
+
//# sourceMappingURL=useHostOrigin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHostOrigin.d.ts","sourceRoot":"","sources":["../../src/hooks/useHostOrigin.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAWlD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useSyncExternalStore } from 'react';
|
|
2
|
+
import { getTransport } from '../internal/singleton.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the validated host (parent) origin the block may safely direct-fetch
|
|
5
|
+
* the civitai App Blocks HTTP API against — `undefined` until the transport
|
|
6
|
+
* has established it (iframe: the first allowlist-passing `BLOCK_INIT`;
|
|
7
|
+
* inline: bootstrap present).
|
|
8
|
+
*
|
|
9
|
+
* Use this as the base URL for a direct `fetch` to the App Blocks API when you
|
|
10
|
+
* need to bypass the host bridge — always paired with the bearer token from
|
|
11
|
+
* `useBlockToken()`:
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const host = useHostOrigin();
|
|
15
|
+
* const { raw } = useBlockToken();
|
|
16
|
+
* if (!host) return null; // not initialized yet
|
|
17
|
+
* const res = await fetch(`${host}/api/v1/blocks/me`, {
|
|
18
|
+
* headers: { authorization: `Bearer ${raw}` },
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* SECURITY INVARIANT — the whole reason this hook exists: the value it returns
|
|
22
|
+
* is ONLY ever an origin that passed the transport's trust gate (the iframe
|
|
23
|
+
* `OriginMatcher` allowlist, or the inline same-origin host). It is NEVER
|
|
24
|
+
* derived from `document.referrer`, `window.location` of a cross-origin
|
|
25
|
+
* parent, or any unvalidated `event.origin`. `useBlockToken().raw` is a
|
|
26
|
+
* money-scoped bearer credential, so sending it to an unvalidated origin would
|
|
27
|
+
* be a token-exfiltration vector — always send the token to THIS origin, never
|
|
28
|
+
* to a host you read off a spoofable browser signal.
|
|
29
|
+
*
|
|
30
|
+
* Built on the same `useSyncExternalStore` subscription as `useBlockToken` /
|
|
31
|
+
* `useBlockContext`: the iframe transport captures the origin and emits in the
|
|
32
|
+
* same tick it applies `BLOCK_INIT`, so the hook re-renders with the origin the
|
|
33
|
+
* moment init lands.
|
|
34
|
+
*/
|
|
35
|
+
export function useHostOrigin() {
|
|
36
|
+
const transport = getTransport();
|
|
37
|
+
const origin = useSyncExternalStore((cb) => transport.subscribe(cb), () => transport.getHostOrigin(),
|
|
38
|
+
// Server snapshot: no host origin is known before hydration.
|
|
39
|
+
() => transport.getHostOrigin());
|
|
40
|
+
// Normalize the transport's `null` sentinel to `undefined` for the hook's
|
|
41
|
+
// "not yet available" contract (mirrors the optional-field hook convention).
|
|
42
|
+
return origin ?? undefined;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=useHostOrigin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHostOrigin.js","sourceRoot":"","sources":["../../src/hooks/useHostOrigin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,oBAAoB,CACjC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAC/B,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE;IAC/B,6DAA6D;IAC7D,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,CAChC,CAAC;IACF,0EAA0E;IAC1E,6EAA6E;IAC7E,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type { SharedStorageValue } from '@civitai/app-sdk/blocks';
|
|
2
|
+
/**
|
|
3
|
+
* The value a viewer contributes to the SHARED store: a required `title` plus
|
|
4
|
+
* an optional long-form `body`. Re-exported from the app-sdk contract so block
|
|
5
|
+
* authors get one canonical shape.
|
|
6
|
+
*/
|
|
7
|
+
export type SharedAppendValue = SharedStorageValue;
|
|
8
|
+
/**
|
|
9
|
+
* Public shape of one SHARED entry returned by `list()`. `createdAt`/`updatedAt`
|
|
10
|
+
* are real `Date`s once the wire's ISO strings are rehydrated (mirrors
|
|
11
|
+
* `AppStorageKeyEntry.updatedAt`). `count` is the live vote total;
|
|
12
|
+
* `authorUserId` is the contributing viewer.
|
|
13
|
+
*/
|
|
14
|
+
export interface SharedListItem {
|
|
15
|
+
key: string;
|
|
16
|
+
authorUserId: number;
|
|
17
|
+
value: SharedAppendValue;
|
|
18
|
+
count: number;
|
|
19
|
+
createdAt: Date;
|
|
20
|
+
updatedAt: Date;
|
|
21
|
+
}
|
|
22
|
+
export interface SharedListResult {
|
|
23
|
+
items: SharedListItem[];
|
|
24
|
+
/** Opaque cursor — pass back as `cursor` to page forward. Absent on the last page. */
|
|
25
|
+
nextCursor?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface UseSharedStorage {
|
|
28
|
+
/**
|
|
29
|
+
* Cursor-paginated listing of the app's SHARED entries (newest-first). Each
|
|
30
|
+
* item carries its `value`, `authorUserId`, and current vote `count`.
|
|
31
|
+
*/
|
|
32
|
+
list(opts?: {
|
|
33
|
+
prefix?: string;
|
|
34
|
+
limit?: number;
|
|
35
|
+
cursor?: string;
|
|
36
|
+
}): Promise<SharedListResult>;
|
|
37
|
+
/** Current vote total for a single entry (`0` when the key isn't present). */
|
|
38
|
+
getCount(key: string): Promise<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Vote totals for many entries in one round-trip. Returns a map of key →
|
|
41
|
+
* count; keys that aren't present resolve to `0`.
|
|
42
|
+
*/
|
|
43
|
+
getCounts(keys: string[]): Promise<Record<string, number>>;
|
|
44
|
+
/**
|
|
45
|
+
* Append a new entry on behalf of the viewer. Resolves with the host-minted
|
|
46
|
+
* `key`. Rejects with the host's `error` string on validation/host failure
|
|
47
|
+
* (or when the viewer is anonymous).
|
|
48
|
+
*/
|
|
49
|
+
append(value: SharedAppendValue): Promise<{
|
|
50
|
+
key: string;
|
|
51
|
+
}>;
|
|
52
|
+
/**
|
|
53
|
+
* Cast (or re-affirm) this viewer's up-vote on an entry — idempotent, one
|
|
54
|
+
* vote per viewer. Resolves with the entry's vote total AFTER the vote.
|
|
55
|
+
*/
|
|
56
|
+
vote(key: string): Promise<number>;
|
|
57
|
+
/**
|
|
58
|
+
* Remove this viewer's up-vote from an entry — idempotent. Resolves with the
|
|
59
|
+
* entry's vote total AFTER the removal.
|
|
60
|
+
*/
|
|
61
|
+
unvote(key: string): Promise<number>;
|
|
62
|
+
/**
|
|
63
|
+
* Withdraw the viewer's own entry. Resolves `{ deleted: true }` when a row
|
|
64
|
+
* was removed, `{ deleted: false }` when it was already gone (idempotent).
|
|
65
|
+
*/
|
|
66
|
+
withdraw(key: string): Promise<{
|
|
67
|
+
ok: boolean;
|
|
68
|
+
deleted: boolean;
|
|
69
|
+
}>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* App-scoped, append-only, community-votable SHARED datastore. Sibling of
|
|
73
|
+
* {@link useAppStorage} (the per-viewer KV store) — same postMessage bridge,
|
|
74
|
+
* same request/await/correlate-by-requestId mechanism — but the scope is the
|
|
75
|
+
* APP (every viewer sees the same list) and entries are structured
|
|
76
|
+
* `{ title, body? }` records that any viewer can vote on.
|
|
77
|
+
*
|
|
78
|
+
* Calls flow through the host's postMessage bridge; the block never sees the
|
|
79
|
+
* datastore credentials and never sends its block token (the host injects both
|
|
80
|
+
* the token and the viewer identity). Anonymous viewers get a read path (`list`
|
|
81
|
+
* / `getCount(s)`) and a hard reject on mutations (`append`/`vote`/`unvote`/
|
|
82
|
+
* `withdraw`).
|
|
83
|
+
*
|
|
84
|
+
* The hook is stable across renders — it returns the same object identity once
|
|
85
|
+
* the transport singleton is created, so it's safe in `useEffect`/`useMemo`
|
|
86
|
+
* dependency arrays.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* const shared = useSharedStorage();
|
|
90
|
+
* const { key } = await shared.append({ title: 'Add dark mode', body: '…' });
|
|
91
|
+
* const { items } = await shared.list({ limit: 20 }); // newest-first
|
|
92
|
+
* const count = await shared.vote(key); // idempotent up-vote
|
|
93
|
+
* await shared.unvote(key);
|
|
94
|
+
* await shared.withdraw(key); // remove my own entry
|
|
95
|
+
*/
|
|
96
|
+
export declare function useSharedStorage(): UseSharedStorage;
|
|
97
|
+
//# sourceMappingURL=useSharedStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedStorage.d.ts","sourceRoot":"","sources":["../../src/hooks/useSharedStorage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAKlE;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC9B,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D;;;OAGG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAwFnD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { getTransport } from '../internal/singleton.js';
|
|
3
|
+
import { sendTypedRequest } from '../internal/transport.js';
|
|
4
|
+
/**
|
|
5
|
+
* App-scoped, append-only, community-votable SHARED datastore. Sibling of
|
|
6
|
+
* {@link useAppStorage} (the per-viewer KV store) — same postMessage bridge,
|
|
7
|
+
* same request/await/correlate-by-requestId mechanism — but the scope is the
|
|
8
|
+
* APP (every viewer sees the same list) and entries are structured
|
|
9
|
+
* `{ title, body? }` records that any viewer can vote on.
|
|
10
|
+
*
|
|
11
|
+
* Calls flow through the host's postMessage bridge; the block never sees the
|
|
12
|
+
* datastore credentials and never sends its block token (the host injects both
|
|
13
|
+
* the token and the viewer identity). Anonymous viewers get a read path (`list`
|
|
14
|
+
* / `getCount(s)`) and a hard reject on mutations (`append`/`vote`/`unvote`/
|
|
15
|
+
* `withdraw`).
|
|
16
|
+
*
|
|
17
|
+
* The hook is stable across renders — it returns the same object identity once
|
|
18
|
+
* the transport singleton is created, so it's safe in `useEffect`/`useMemo`
|
|
19
|
+
* dependency arrays.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* const shared = useSharedStorage();
|
|
23
|
+
* const { key } = await shared.append({ title: 'Add dark mode', body: '…' });
|
|
24
|
+
* const { items } = await shared.list({ limit: 20 }); // newest-first
|
|
25
|
+
* const count = await shared.vote(key); // idempotent up-vote
|
|
26
|
+
* await shared.unvote(key);
|
|
27
|
+
* await shared.withdraw(key); // remove my own entry
|
|
28
|
+
*/
|
|
29
|
+
export function useSharedStorage() {
|
|
30
|
+
return useMemo(() => {
|
|
31
|
+
const transport = getTransport();
|
|
32
|
+
return {
|
|
33
|
+
async list(opts) {
|
|
34
|
+
const result = await sendTypedRequest(transport, {
|
|
35
|
+
type: 'SHARED_LIST',
|
|
36
|
+
payload: {
|
|
37
|
+
prefix: opts?.prefix,
|
|
38
|
+
limit: opts?.limit,
|
|
39
|
+
cursor: opts?.cursor,
|
|
40
|
+
},
|
|
41
|
+
}, 'SHARED_LIST_RESULT');
|
|
42
|
+
if (result.error)
|
|
43
|
+
throw new Error(result.error);
|
|
44
|
+
return {
|
|
45
|
+
items: result.items.map((item) => ({
|
|
46
|
+
key: item.key,
|
|
47
|
+
authorUserId: item.authorUserId,
|
|
48
|
+
value: item.value,
|
|
49
|
+
count: item.count,
|
|
50
|
+
createdAt: new Date(item.createdAt),
|
|
51
|
+
updatedAt: new Date(item.updatedAt),
|
|
52
|
+
})),
|
|
53
|
+
nextCursor: result.nextCursor,
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
async getCount(key) {
|
|
57
|
+
const result = await sendTypedRequest(transport, { type: 'SHARED_GET_COUNT', payload: { key } }, 'SHARED_GET_COUNT_RESULT');
|
|
58
|
+
if (result.error)
|
|
59
|
+
throw new Error(result.error);
|
|
60
|
+
return result.count;
|
|
61
|
+
},
|
|
62
|
+
async getCounts(keys) {
|
|
63
|
+
const result = await sendTypedRequest(transport, { type: 'SHARED_GET_COUNTS', payload: { keys } }, 'SHARED_GET_COUNTS_RESULT');
|
|
64
|
+
if (result.error)
|
|
65
|
+
throw new Error(result.error);
|
|
66
|
+
return result.counts;
|
|
67
|
+
},
|
|
68
|
+
async append(value) {
|
|
69
|
+
const result = await sendTypedRequest(transport, { type: 'SHARED_APPEND', payload: { value } }, 'SHARED_APPEND_RESULT');
|
|
70
|
+
if (result.error)
|
|
71
|
+
throw new Error(result.error);
|
|
72
|
+
return { key: result.key };
|
|
73
|
+
},
|
|
74
|
+
async vote(key) {
|
|
75
|
+
const result = await sendTypedRequest(transport, { type: 'SHARED_VOTE', payload: { key } }, 'SHARED_VOTE_RESULT');
|
|
76
|
+
if (result.error)
|
|
77
|
+
throw new Error(result.error);
|
|
78
|
+
return result.count;
|
|
79
|
+
},
|
|
80
|
+
async unvote(key) {
|
|
81
|
+
const result = await sendTypedRequest(transport, { type: 'SHARED_UNVOTE', payload: { key } }, 'SHARED_UNVOTE_RESULT');
|
|
82
|
+
if (result.error)
|
|
83
|
+
throw new Error(result.error);
|
|
84
|
+
return result.count;
|
|
85
|
+
},
|
|
86
|
+
async withdraw(key) {
|
|
87
|
+
const result = await sendTypedRequest(transport, { type: 'SHARED_WITHDRAW', payload: { key } }, 'SHARED_WITHDRAW_RESULT');
|
|
88
|
+
if (!result.ok || result.error) {
|
|
89
|
+
throw new Error(result.error ?? 'shared withdraw failed');
|
|
90
|
+
}
|
|
91
|
+
return { ok: true, deleted: result.deleted };
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}, []);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=useSharedStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSharedStorage.js","sourceRoot":"","sources":["../../src/hooks/useSharedStorage.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export type { BlockSnapshot, BlockTransport, OutboundRequest, } from './internal
|
|
|
16
16
|
export { useBlockContext } from './hooks/useBlockContext.js';
|
|
17
17
|
export { useBlockSettings } from './hooks/useBlockSettings.js';
|
|
18
18
|
export { useBlockToken } from './hooks/useBlockToken.js';
|
|
19
|
+
export { useHostOrigin } from './hooks/useHostOrigin.js';
|
|
19
20
|
export { useBuzzWorkflow } from './hooks/useBuzzWorkflow.js';
|
|
20
21
|
export { useBlockResize } from './hooks/useBlockResize.js';
|
|
21
22
|
export { useBuzzPurchase } from './hooks/useBuzzPurchase.js';
|
|
@@ -33,4 +34,6 @@ export { SfwGate } from './hooks/SfwGate.js';
|
|
|
33
34
|
export type { SfwGateProps } from './hooks/SfwGate.js';
|
|
34
35
|
export { useAppStorage } from './hooks/useAppStorage.js';
|
|
35
36
|
export type { AppStorageKeyEntry, AppStorageListResult, AppStorageQuota, UseAppStorage, } from './hooks/useAppStorage.js';
|
|
37
|
+
export { useSharedStorage } from './hooks/useSharedStorage.js';
|
|
38
|
+
export type { SharedAppendValue, SharedListItem, SharedListResult, UseSharedStorage, } from './hooks/useSharedStorage.js';
|
|
36
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,6 +14,7 @@ export { sendTypedRequest } from './internal/transport.js';
|
|
|
14
14
|
export { useBlockContext } from './hooks/useBlockContext.js';
|
|
15
15
|
export { useBlockSettings } from './hooks/useBlockSettings.js';
|
|
16
16
|
export { useBlockToken } from './hooks/useBlockToken.js';
|
|
17
|
+
export { useHostOrigin } from './hooks/useHostOrigin.js';
|
|
17
18
|
export { useBuzzWorkflow } from './hooks/useBuzzWorkflow.js';
|
|
18
19
|
export { useBlockResize } from './hooks/useBlockResize.js';
|
|
19
20
|
export { useBuzzPurchase } from './hooks/useBuzzPurchase.js';
|
|
@@ -27,4 +28,5 @@ export { useBlockAnalytics } from './hooks/useBlockAnalytics.js';
|
|
|
27
28
|
export { useDomainMaturity } from './hooks/useDomainMaturity.js';
|
|
28
29
|
export { SfwGate } from './hooks/SfwGate.js';
|
|
29
30
|
export { useAppStorage } from './hooks/useAppStorage.js';
|
|
31
|
+
export { useSharedStorage } from './hooks/useSharedStorage.js';
|
|
30
32
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAG3F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,QAAQ;AACR,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAG3F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAO3D,QAAQ;AACR,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAOzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -37,6 +37,24 @@ export declare class IframeTransport implements BlockTransport {
|
|
|
37
37
|
private readonly messageListener;
|
|
38
38
|
constructor(opts: IframeTransportOptions);
|
|
39
39
|
getSnapshot(): BlockSnapshot;
|
|
40
|
+
/**
|
|
41
|
+
* The validated parent origin — `null` until `BLOCK_INIT` lands.
|
|
42
|
+
*
|
|
43
|
+
* SECURITY INVARIANT — do NOT change what this returns: it hands back ONLY
|
|
44
|
+
* `this.parentOrigin`, which is set exactly once, in `handleMessage`, from
|
|
45
|
+
* the `event.origin` of the FIRST `BLOCK_INIT` — AND only after that message
|
|
46
|
+
* cleared `this.originMatcher.matches(event.origin)` (the allowlist gate at
|
|
47
|
+
* the very top of `handleMessage`, the same gate every inbound message
|
|
48
|
+
* passes). It is therefore guaranteed to be a legitimate civitai origin.
|
|
49
|
+
*
|
|
50
|
+
* It is NEVER derived from `document.referrer`, `window.location`, or an
|
|
51
|
+
* unvalidated `event.origin`. Blocks send a money-scoped bearer token
|
|
52
|
+
* (`useBlockToken().raw`) to this origin, so returning a spoofable value
|
|
53
|
+
* would be a token-exfiltration vector. This is the same value already
|
|
54
|
+
* trusted as the `targetOrigin` of every `postMessage` to the parent
|
|
55
|
+
* (see `postToParent`).
|
|
56
|
+
*/
|
|
57
|
+
getHostOrigin(): string | null;
|
|
40
58
|
subscribe(listener: () => void): () => void;
|
|
41
59
|
waitForInit(): Promise<BlockInitPayload>;
|
|
42
60
|
sendMessage(message: BlockToParentMessage): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iframeTransport.d.ts","sourceRoot":"","sources":["../../src/internal/iframeTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAEzB,KAAK,wBAAwB,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AASxB,MAAM,WAAW,sBAAsB;IACrC;;;;;;;OAOG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,yEAAyE;IACzE,OAAO,CAAC,YAAY,CAAuB;IAE3C,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiD;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;gBAEpD,IAAI,EAAE,sBAAsB;IAoCxC,WAAW,IAAI,aAAa;IAI5B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAO3C,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAIhD,WAAW,CACT,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,wBAAwB,EACtC,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAChC,OAAO,CAAC,OAAO,CAAC;IAmBnB,uDAAuD;IACvD,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IA2FrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,IAAI;CAGb"}
|
|
1
|
+
{"version":3,"file":"iframeTransport.d.ts","sourceRoot":"","sources":["../../src/internal/iframeTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EAEzB,KAAK,wBAAwB,EAC9B,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AASxB,MAAM,WAAW,sBAAsB;IACrC;;;;;;;OAOG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AASD;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IAEnD,yEAAyE;IACzE,OAAO,CAAC,YAAY,CAAuB;IAE3C,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiD;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,aAAa,CAAgC;IACrD,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;gBAEpD,IAAI,EAAE,sBAAsB;IAoCxC,WAAW,IAAI,aAAa;IAI5B;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAO3C,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAIhD,WAAW,CACT,OAAO,EAAE,eAAe,EACxB,YAAY,EAAE,wBAAwB,EACtC,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAChC,OAAO,CAAC,OAAO,CAAC;IAmBnB,uDAAuD;IACvD,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IA2FrB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -56,6 +56,26 @@ export class IframeTransport {
|
|
|
56
56
|
getSnapshot() {
|
|
57
57
|
return this.snapshot;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* The validated parent origin — `null` until `BLOCK_INIT` lands.
|
|
61
|
+
*
|
|
62
|
+
* SECURITY INVARIANT — do NOT change what this returns: it hands back ONLY
|
|
63
|
+
* `this.parentOrigin`, which is set exactly once, in `handleMessage`, from
|
|
64
|
+
* the `event.origin` of the FIRST `BLOCK_INIT` — AND only after that message
|
|
65
|
+
* cleared `this.originMatcher.matches(event.origin)` (the allowlist gate at
|
|
66
|
+
* the very top of `handleMessage`, the same gate every inbound message
|
|
67
|
+
* passes). It is therefore guaranteed to be a legitimate civitai origin.
|
|
68
|
+
*
|
|
69
|
+
* It is NEVER derived from `document.referrer`, `window.location`, or an
|
|
70
|
+
* unvalidated `event.origin`. Blocks send a money-scoped bearer token
|
|
71
|
+
* (`useBlockToken().raw`) to this origin, so returning a spoofable value
|
|
72
|
+
* would be a token-exfiltration vector. This is the same value already
|
|
73
|
+
* trusted as the `targetOrigin` of every `postMessage` to the parent
|
|
74
|
+
* (see `postToParent`).
|
|
75
|
+
*/
|
|
76
|
+
getHostOrigin() {
|
|
77
|
+
return this.parentOrigin;
|
|
78
|
+
}
|
|
59
79
|
subscribe(listener) {
|
|
60
80
|
this.listeners.add(listener);
|
|
61
81
|
return () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iframeTransport.js","sourceRoot":"","sources":["../../src/internal/iframeTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,GAKV,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAIpD,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAuB1C;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACT,aAAa,CAAgB;IAC7B,MAAM,CAAS;IAExB,QAAQ,GAAkB,cAAc,CAAC;IAChC,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAEnD,yEAAyE;IACjE,YAAY,GAAkB,IAAI,CAAC;IAE3C,2EAA2E;IAC1D,QAAQ,GAA8C,EAAE,CAAC;IACzD,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE5C,WAAW,CAA4B;IAChD,WAAW,CAAuC;IAClD,UAAU,CAAwB;IAClC,aAAa,CAAgC;IAC7C,YAAY,GAAG,KAAK,CAAC;IAEZ,eAAe,CAAgC;IAEhE,YAAY,IAA4B;QACtC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,yEAAyE;gBACvE,mFAAmF,CACtF,CAAC;QACJ,CAAC;QACD,yEAAyE;QACzE,wEAAwE;QACxE,0DAA0D;QAC1D,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAK,UAAkC,CAAC,MAAO,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACvF,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;YAC3B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,UAAU,CACb,IAAI,KAAK,CACP,2DAA2D,eAAe,MAAM;oBAC9E,mGAAmG,CACtG,CACF,CAAC;YACJ,CAAC;QACH,CAAC,EAAE,eAAe,CAAC,CAAC;QAEpB,IAAI,CAAC,eAAe,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,SAAS,CAAC,QAAoB;QAC5B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,WAAW,CAAC,OAA6B;QACvC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW,CACT,OAAwB,EACxB,YAAsC,EACtC,OAA+B,EAAE;QAEjC,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,0BAA0B,CAAC;QAC/D,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;oBACnC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,IAAI,qBAAqB,SAAS,IAAI,CAAC,CAAC,CAAC;gBACjG,CAAC;YACH,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE;gBAC1B,OAAO;gBACP,MAAM;gBACN,SAAS;gBACT,YAAY;aACb,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uDAAuD;IACvD,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACjE,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,OAAgB;QAC7C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAG,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAuC;QAC1D,uFAAuF;QACvF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,YAAa,CAAC,CAAC;IAC1D,CAAC;IAEO,aAAa,CAAC,KAAmB;QACvC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,IAA6C,CAAC;QACjE,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAEtF,kEAAkE;QAClE,gEAAgE;QAChE,oEAAoE;QACpE,yCAAyC;QACzC,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,yFAAyF;YACzF,OAAO,CAAC,IAAI,CACV,wCAAwC,IAAI,CAAC,IAAI,kBAAkB,KAAK,CAAC,MAAM,EAAE,CAClF,CAAC;YACF,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,wEAAwE;QACxE,8EAA8E;QAC9E,2EAA2E;QAC3E,kEAAkE;QAClE,8FAA8F;QAC9F,IAAI,SAAS,CAAqC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;gBACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;gBACjC,IAAI,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,kEAAkE;gBAClE,kEAAkE;gBAClE,kEAAkE;gBAClE,iEAAiE;gBACjE,gEAAgE;gBAChE,4DAA4D;gBAC5D,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,OAAO;QACT,CAAC;QAED,iEAAiE;QACjE,6CAA6C;QAC7C,IAAI,SAAS,CAAwC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;YAC5E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,0EAA0E;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAA8C,CAAC;QACpE,IAAI,OAAmC,CAAC;QACxC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;QAC3C,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACtD,IAAI,SAAS,IAAI,SAAS,CAAC,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACtD,OAAO,GAAG,SAAS,CAAC;gBACpB,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;YACvC,CAAC;QACH,CAAC;QAED,iEAAiE;QACjE,oEAAoE;QACpE,gEAAgE;QAChE,kEAAkE;QAClE,oDAAoD;QACpD,IAAI,SAAS,CAAiD,IAAI,EAAE,wBAAwB,CAAC,EAAE,CAAC;YAC9F,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,OAAO,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACzC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO;QACT,CAAC;QAED,IAAI,SAAS,CAAkC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YAChE,oDAAoD;YACpD,OAAO;QACT,CAAC;QACD,IAAI,SAAS,CAAiC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,OAAqB;QAC7C,wEAAwE;QACxE,sEAAsE;QACtE,qEAAqE;QACrE,6CAA6C;QAC7C,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACV,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS;YAAE,QAAQ,EAAE,CAAC;IACpD,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"iframeTransport.js","sourceRoot":"","sources":["../../src/internal/iframeTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,8 +7,15 @@ declare global {
|
|
|
7
7
|
}
|
|
8
8
|
export declare class InlineTransport implements BlockTransport {
|
|
9
9
|
private snapshot;
|
|
10
|
+
private readonly hostOrigin;
|
|
10
11
|
constructor();
|
|
11
12
|
getSnapshot(): BlockSnapshot;
|
|
13
|
+
/**
|
|
14
|
+
* The host origin — `null` until an inline bootstrap is present. See the
|
|
15
|
+
* constructor's SECURITY INVARIANT note for why `window.location.origin` is
|
|
16
|
+
* the trusted host origin in inline (same-document) mode.
|
|
17
|
+
*/
|
|
18
|
+
getHostOrigin(): string | null;
|
|
12
19
|
subscribe(_listener: () => void): () => void;
|
|
13
20
|
sendMessage(_message: BlockToParentMessage): void;
|
|
14
21
|
sendRequest(_request: OutboundRequest, _responseType: ParentToBlockMessageType, _opts?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inlineTransport.d.ts","sourceRoot":"","sources":["../../src/internal/inlineTransport.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,EAAE,gBAAgB,CAAC;KAChF;CACF;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,QAAQ,CAAgB;;
|
|
1
|
+
{"version":3,"file":"inlineTransport.d.ts","sourceRoot":"","sources":["../../src/internal/inlineTransport.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,yBAAyB,CAAC,EAAE,OAAO,yBAAyB,EAAE,gBAAgB,CAAC;KAChF;CACF;AAED,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;;IAmB3C,WAAW,IAAI,aAAa;IAI5B;;;;OAIG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B,SAAS,CAAC,SAAS,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI5C,WAAW,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAIjD,WAAW,CACT,QAAQ,EAAE,eAAe,EACzB,aAAa,EAAE,wBAAwB,EACvC,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC,OAAO,CAAC;CAGpB"}
|
|
@@ -16,13 +16,34 @@
|
|
|
16
16
|
import { EMPTY_SNAPSHOT, snapshotFromInit, } from './transport.js';
|
|
17
17
|
export class InlineTransport {
|
|
18
18
|
snapshot;
|
|
19
|
+
hostOrigin;
|
|
19
20
|
constructor() {
|
|
20
|
-
const
|
|
21
|
+
const win = globalThis.window;
|
|
22
|
+
const bootstrap = win?.__CIVITAI_BLOCK_CONTEXT__;
|
|
21
23
|
this.snapshot = bootstrap ? snapshotFromInit(bootstrap) : EMPTY_SNAPSHOT;
|
|
24
|
+
// SECURITY INVARIANT — mirrors IframeTransport.getHostOrigin(): the value
|
|
25
|
+
// returned here is only ever a trusted host origin. In inline mode the
|
|
26
|
+
// block executes INSIDE the host's own document (the host injected
|
|
27
|
+
// `__CIVITAI_BLOCK_CONTEXT__` on its own window), so there is no
|
|
28
|
+
// cross-origin trust boundary and `window.location.origin` IS the host
|
|
29
|
+
// origin by construction — it is the origin the host page is served from,
|
|
30
|
+
// not a spoofable signal like `document.referrer`. Gated on bootstrap
|
|
31
|
+
// presence so the accessor stays `null` until inline init, matching the
|
|
32
|
+
// iframe contract. It becomes the base URL a money-scoped bearer token is
|
|
33
|
+
// sent to, so it must never be derived from any caller-supplied value.
|
|
34
|
+
this.hostOrigin = bootstrap ? (win?.location?.origin ?? null) : null;
|
|
22
35
|
}
|
|
23
36
|
getSnapshot() {
|
|
24
37
|
return this.snapshot;
|
|
25
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* The host origin — `null` until an inline bootstrap is present. See the
|
|
41
|
+
* constructor's SECURITY INVARIANT note for why `window.location.origin` is
|
|
42
|
+
* the trusted host origin in inline (same-document) mode.
|
|
43
|
+
*/
|
|
44
|
+
getHostOrigin() {
|
|
45
|
+
return this.hostOrigin;
|
|
46
|
+
}
|
|
26
47
|
subscribe(_listener) {
|
|
27
48
|
return () => { };
|
|
28
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inlineTransport.js","sourceRoot":"","sources":["../../src/internal/inlineTransport.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,oFAAoF;AACpF,wEAAwE;AACxE,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,mFAAmF;AACnF,+EAA+E;AAC/E,wEAAwE;AACxE,yEAAyE;AACzE,qEAAqE;AACrE,0EAA0E;AAO1E,OAAO,EACL,cAAc,EACd,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC;AAQxB,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAgB;
|
|
1
|
+
{"version":3,"file":"inlineTransport.js","sourceRoot":"","sources":["../../src/internal/inlineTransport.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,oFAAoF;AACpF,wEAAwE;AACxE,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,4EAA4E;AAC5E,2EAA2E;AAC3E,mFAAmF;AACnF,+EAA+E;AAC/E,wEAAwE;AACxE,yEAAyE;AACzE,qEAAqE;AACrE,0EAA0E;AAO1E,OAAO,EACL,cAAc,EACd,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC;AAQxB,MAAM,OAAO,eAAe;IAClB,QAAQ,CAAgB;IACf,UAAU,CAAgB;IAE3C;QACE,MAAM,GAAG,GAAI,UAAkC,CAAC,MAAM,CAAC;QACvD,MAAM,SAAS,GAAG,GAAG,EAAE,yBAAyB,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;QACzE,0EAA0E;QAC1E,uEAAuE;QACvE,mEAAmE;QACnE,iEAAiE;QACjE,uEAAuE;QACvE,0EAA0E;QAC1E,sEAAsE;QACtE,wEAAwE;QACxE,0EAA0E;QAC1E,uEAAuE;QACvE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,SAAqB;QAC7B,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,WAAW,CAAC,QAA8B;QACxC,kEAAkE;IACpE,CAAC;IAED,WAAW,CACT,QAAyB,EACzB,aAAuC,EACvC,KAA8B;QAE9B,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;IAC3F,CAAC;CACF"}
|