@braidlabs/core 0.6.0 → 0.7.1
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/package.json +1 -1
- package/src/adapters/adapter.d.ts +11 -0
- package/src/adapters/adapter.js.map +1 -1
- package/src/adapters/compat-adapter.js +2 -2
- package/src/adapters/compat-adapter.js.map +1 -1
- package/src/compat/born-inert-scripts.d.ts +2 -0
- package/src/compat/born-inert-scripts.js +39 -0
- package/src/compat/born-inert-scripts.js.map +1 -1
- package/src/compat/cookie-partition.d.ts +25 -0
- package/src/compat/cookie-partition.js +79 -0
- package/src/compat/cookie-partition.js.map +1 -0
- package/src/compat/document-member-classification.js +3 -2
- package/src/compat/document-member-classification.js.map +1 -1
- package/src/compat/document-overrides.d.ts +6 -6
- package/src/compat/document-overrides.js +23 -0
- package/src/compat/document-overrides.js.map +1 -1
- package/src/compat/fragment-boundary.d.ts +5 -0
- package/src/compat/fragment-boundary.js +291 -36
- package/src/compat/fragment-boundary.js.map +1 -1
- package/src/compat/html-policy.d.ts +50 -0
- package/src/compat/html-policy.js +155 -0
- package/src/compat/html-policy.js.map +1 -0
- package/src/compat/realm-patches.d.ts +2 -1
- package/src/compat/realm-patches.js +117 -3
- package/src/compat/realm-patches.js.map +1 -1
- package/src/compat/script-execution.d.ts +24 -0
- package/src/compat/script-execution.js +177 -10
- package/src/compat/script-execution.js.map +1 -1
- package/src/compat/storage-partition.d.ts +47 -0
- package/src/compat/storage-partition.js +291 -0
- package/src/compat/storage-partition.js.map +1 -0
- package/src/compat/subresource-urls.d.ts +41 -0
- package/src/compat/subresource-urls.js +133 -0
- package/src/compat/subresource-urls.js.map +1 -0
- package/src/config.d.ts +28 -0
- package/src/config.js +24 -0
- package/src/config.js.map +1 -1
- package/src/elements/boot-gate.d.ts +47 -0
- package/src/elements/boot-gate.js +207 -0
- package/src/elements/boot-gate.js.map +1 -0
- package/src/elements/fragment-slot.d.ts +62 -15
- package/src/elements/fragment-slot.js +388 -26
- package/src/elements/fragment-slot.js.map +1 -1
- package/src/elements/late-content.d.ts +44 -0
- package/src/elements/late-content.js +107 -0
- package/src/elements/late-content.js.map +1 -0
- package/src/elements/prefetch.d.ts +27 -0
- package/src/elements/prefetch.js +100 -0
- package/src/elements/prefetch.js.map +1 -0
- package/src/elements/prerequisites.d.ts +42 -0
- package/src/elements/prerequisites.js +133 -0
- package/src/elements/prerequisites.js.map +1 -0
- package/src/elements/recovery.d.ts +46 -0
- package/src/elements/recovery.js +59 -0
- package/src/elements/recovery.js.map +1 -0
- package/src/env/create-env.js +2 -1
- package/src/env/create-env.js.map +1 -1
- package/src/env/fragment-env.d.ts +6 -0
- package/src/errors.d.ts +4 -1
- package/src/errors.js +2 -0
- package/src/errors.js.map +1 -1
- package/src/index.d.ts +5 -1
- package/src/index.js +11 -1
- package/src/index.js.map +1 -1
- package/src/realm/realm-manager.js +23 -0
- package/src/realm/realm-manager.js.map +1 -1
- package/src/weave/capabilities.d.ts +35 -7
- package/src/weave/capabilities.js +17 -0
- package/src/weave/capabilities.js.map +1 -1
- package/src/weave/guest.d.ts +2 -0
- package/src/weave/guest.js +2 -1
- package/src/weave/guest.js.map +1 -1
- package/src/weave/messages.d.ts +24 -0
- package/src/weave/messages.js +22 -0
- package/src/weave/messages.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-partition.js","sourceRoot":"","sources":["../../../../../libs/core/src/compat/storage-partition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subresource URLs that fragment *code* sets, resolved the way the gateway resolves the ones in
|
|
3
|
+
* fragment *markup*.
|
|
4
|
+
*
|
|
5
|
+
* A fragment's elements live in the host page's document, so a relative URL on one resolves
|
|
6
|
+
* against the host page. The gateway re-roots the subresource URLs in a fragment's markup into
|
|
7
|
+
* `/__braid/frag/<id>/…` for exactly that reason (`rewriteSubresourceUrls` in the gateway's
|
|
8
|
+
* `rewriter/transforms.ts`), but a URL set from script — `frame.src = 'silent-renew.html'`,
|
|
9
|
+
* `img.src = 'logo.png'` — arrives after the markup and loaded a host URL instead. This applies the
|
|
10
|
+
* same rule at the moment it is set, so a fragment behaves as it does standalone.
|
|
11
|
+
*
|
|
12
|
+
* The element/attribute table and the rule are duplicated from the gateway: the two packages share
|
|
13
|
+
* no modules. Navigation targets (`a[href]`, `form[action]`) are left alone, as there.
|
|
14
|
+
*/
|
|
15
|
+
/** Attributes that point at a subresource the fragment owns, per element (as in the gateway). */
|
|
16
|
+
export declare const SUBRESOURCE_ATTRIBUTES: Readonly<Record<string, readonly string[]>>;
|
|
17
|
+
/**
|
|
18
|
+
* The fragment's namespace root (`/__braid/frag/<id>`, behind any gateway `basePath`), read off
|
|
19
|
+
* the realm document's base URL, which points into it. `null` when it does not.
|
|
20
|
+
*/
|
|
21
|
+
export declare function fragmentRootOf(realmBaseUrl: string): string | null;
|
|
22
|
+
/**
|
|
23
|
+
* One URL mapped into the fragment's namespace — the gateway's `namespaceUrl`, exactly: resolved
|
|
24
|
+
* against the fragment's own `<base href>` (default `/`) as its document would, then re-rooted.
|
|
25
|
+
* Absolute URLs, protocol-relative ones, pure fragments and URLs already inside the namespace are
|
|
26
|
+
* returned as they are.
|
|
27
|
+
*/
|
|
28
|
+
export declare function fragmentSubresourceUrl(value: string, fragmentRoot: string, fragmentBaseHref?: string): string;
|
|
29
|
+
/** Each candidate of a `srcset`, mapped, with its descriptor kept (split as the gateway splits). */
|
|
30
|
+
export declare function fragmentSrcset(value: string, fragmentRoot: string, fragmentBaseHref?: string): string;
|
|
31
|
+
/** Where a stamped element's URLs resolve: the namespace root, and the fragment's own base href. */
|
|
32
|
+
export interface FragmentUrlBase {
|
|
33
|
+
root: string | null;
|
|
34
|
+
baseHref: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Property descriptors for a stamped element's prototype: the element's subresource properties and
|
|
38
|
+
* `setAttribute`/`setAttributeNS` map relative URLs into the fragment's namespace. Empty for an
|
|
39
|
+
* element with no subresource attributes. Reading returns whatever the native getter does.
|
|
40
|
+
*/
|
|
41
|
+
export declare function subresourceUrlOverrides(proto: object, localName: string, base: () => FragmentUrlBase): PropertyDescriptorMap;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subresource URLs that fragment *code* sets, resolved the way the gateway resolves the ones in
|
|
3
|
+
* fragment *markup*.
|
|
4
|
+
*
|
|
5
|
+
* A fragment's elements live in the host page's document, so a relative URL on one resolves
|
|
6
|
+
* against the host page. The gateway re-roots the subresource URLs in a fragment's markup into
|
|
7
|
+
* `/__braid/frag/<id>/…` for exactly that reason (`rewriteSubresourceUrls` in the gateway's
|
|
8
|
+
* `rewriter/transforms.ts`), but a URL set from script — `frame.src = 'silent-renew.html'`,
|
|
9
|
+
* `img.src = 'logo.png'` — arrives after the markup and loaded a host URL instead. This applies the
|
|
10
|
+
* same rule at the moment it is set, so a fragment behaves as it does standalone.
|
|
11
|
+
*
|
|
12
|
+
* The element/attribute table and the rule are duplicated from the gateway: the two packages share
|
|
13
|
+
* no modules. Navigation targets (`a[href]`, `form[action]`) are left alone, as there.
|
|
14
|
+
*/
|
|
15
|
+
/** Attributes that point at a subresource the fragment owns, per element (as in the gateway). */
|
|
16
|
+
export const SUBRESOURCE_ATTRIBUTES = Object.assign(Object.create(null), {
|
|
17
|
+
audio: ['src'],
|
|
18
|
+
embed: ['src'],
|
|
19
|
+
iframe: ['src'],
|
|
20
|
+
img: ['src', 'srcset'],
|
|
21
|
+
input: ['src'],
|
|
22
|
+
link: ['href'],
|
|
23
|
+
object: ['data'],
|
|
24
|
+
script: ['src'],
|
|
25
|
+
source: ['src', 'srcset'],
|
|
26
|
+
track: ['src'],
|
|
27
|
+
use: ['href'],
|
|
28
|
+
video: ['src', 'poster'],
|
|
29
|
+
});
|
|
30
|
+
const NAMESPACE = /^(.*?\/__braid\/frag\/[^/]+)(\/.*)?$/;
|
|
31
|
+
/**
|
|
32
|
+
* The fragment's namespace root (`/__braid/frag/<id>`, behind any gateway `basePath`), read off
|
|
33
|
+
* the realm document's base URL, which points into it. `null` when it does not.
|
|
34
|
+
*/
|
|
35
|
+
export function fragmentRootOf(realmBaseUrl) {
|
|
36
|
+
try {
|
|
37
|
+
return NAMESPACE.exec(new URL(realmBaseUrl).pathname)?.[1] ?? null;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* One URL mapped into the fragment's namespace — the gateway's `namespaceUrl`, exactly: resolved
|
|
45
|
+
* against the fragment's own `<base href>` (default `/`) as its document would, then re-rooted.
|
|
46
|
+
* Absolute URLs, protocol-relative ones, pure fragments and URLs already inside the namespace are
|
|
47
|
+
* returned as they are.
|
|
48
|
+
*/
|
|
49
|
+
export function fragmentSubresourceUrl(value, fragmentRoot, fragmentBaseHref = '/') {
|
|
50
|
+
const url = value.trim();
|
|
51
|
+
if (!url || url.startsWith('#') || url.startsWith('//') || /^[a-z][a-z0-9+.-]*:/i.test(url))
|
|
52
|
+
return value;
|
|
53
|
+
// already re-rooted — markup the gateway prepared, an attribute read back and set again
|
|
54
|
+
if (url === fragmentRoot || url.startsWith(`${fragmentRoot}/`))
|
|
55
|
+
return value;
|
|
56
|
+
const resolved = new URL(url, `http://braid.invalid${fragmentBaseHref.startsWith('/') ? fragmentBaseHref : `/${fragmentBaseHref}`}`);
|
|
57
|
+
return `${fragmentRoot}${resolved.pathname}${resolved.search}${resolved.hash}`;
|
|
58
|
+
}
|
|
59
|
+
/** Each candidate of a `srcset`, mapped, with its descriptor kept (split as the gateway splits). */
|
|
60
|
+
export function fragmentSrcset(value, fragmentRoot, fragmentBaseHref = '/') {
|
|
61
|
+
return value
|
|
62
|
+
.split(',')
|
|
63
|
+
.map((candidate) => {
|
|
64
|
+
const match = /^(\s*)(\S+)(\s*.*)$/.exec(candidate);
|
|
65
|
+
if (!match)
|
|
66
|
+
return candidate;
|
|
67
|
+
const [, leading, url, descriptor] = match;
|
|
68
|
+
return `${leading}${fragmentSubresourceUrl(url, fragmentRoot, fragmentBaseHref)}${descriptor}`;
|
|
69
|
+
})
|
|
70
|
+
.join(',');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Property descriptors for a stamped element's prototype: the element's subresource properties and
|
|
74
|
+
* `setAttribute`/`setAttributeNS` map relative URLs into the fragment's namespace. Empty for an
|
|
75
|
+
* element with no subresource attributes. Reading returns whatever the native getter does.
|
|
76
|
+
*/
|
|
77
|
+
export function subresourceUrlOverrides(proto, localName, base) {
|
|
78
|
+
const attributes = Object.hasOwn(SUBRESOURCE_ATTRIBUTES, localName) ? SUBRESOURCE_ATTRIBUTES[localName] : undefined;
|
|
79
|
+
if (!attributes)
|
|
80
|
+
return {};
|
|
81
|
+
const rewrite = (name, value) => {
|
|
82
|
+
if (typeof value !== 'string' || !attributes.includes(name))
|
|
83
|
+
return value;
|
|
84
|
+
const { root, baseHref } = base();
|
|
85
|
+
if (root === null)
|
|
86
|
+
return value;
|
|
87
|
+
return name === 'srcset' ? fragmentSrcset(value, root, baseHref) : fragmentSubresourceUrl(value, root, baseHref);
|
|
88
|
+
};
|
|
89
|
+
const overrides = {};
|
|
90
|
+
for (const name of attributes) {
|
|
91
|
+
const descriptor = findDescriptor(proto, name);
|
|
92
|
+
// SVG's `href` is an SVGAnimatedString with no setter; setAttribute covers it
|
|
93
|
+
if (!descriptor?.set)
|
|
94
|
+
continue;
|
|
95
|
+
const { get, set } = descriptor;
|
|
96
|
+
overrides[name] = {
|
|
97
|
+
get,
|
|
98
|
+
set(value) {
|
|
99
|
+
set.call(this, rewrite(name, String(value)));
|
|
100
|
+
},
|
|
101
|
+
configurable: true,
|
|
102
|
+
enumerable: descriptor.enumerable ?? true,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const setAttribute = findDescriptor(proto, 'setAttribute').value;
|
|
106
|
+
const setAttributeNS = findDescriptor(proto, 'setAttributeNS').value;
|
|
107
|
+
overrides['setAttribute'] = {
|
|
108
|
+
value: function (qualifiedName, value) {
|
|
109
|
+
return setAttribute.call(this, qualifiedName, rewrite(String(qualifiedName).toLowerCase(), value));
|
|
110
|
+
},
|
|
111
|
+
writable: true,
|
|
112
|
+
configurable: true,
|
|
113
|
+
};
|
|
114
|
+
overrides['setAttributeNS'] = {
|
|
115
|
+
value: function (namespace, qualifiedName, value) {
|
|
116
|
+
// only un-namespaced attributes are the subresource ones; xlink:href is left as it is
|
|
117
|
+
const mapped = namespace === null || namespace === '' ? rewrite(String(qualifiedName).toLowerCase(), value) : value;
|
|
118
|
+
return setAttributeNS.call(this, namespace, qualifiedName, mapped);
|
|
119
|
+
},
|
|
120
|
+
writable: true,
|
|
121
|
+
configurable: true,
|
|
122
|
+
};
|
|
123
|
+
return overrides;
|
|
124
|
+
}
|
|
125
|
+
function findDescriptor(object, name) {
|
|
126
|
+
for (let current = object; current; current = Object.getPrototypeOf(current)) {
|
|
127
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, name);
|
|
128
|
+
if (descriptor)
|
|
129
|
+
return descriptor;
|
|
130
|
+
}
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=subresource-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subresource-urls.js","sourceRoot":"","sources":["../../../../../libs/core/src/compat/subresource-urls.ts"],"names":[],"mappings":"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"}
|
package/src/config.d.ts
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* names itself, which trusted fragments may then read and write.
|
|
9
9
|
*/
|
|
10
10
|
import type { HostContract } from './weave/contract.js';
|
|
11
|
+
import { type RecoveryPolicy } from './elements/recovery.js';
|
|
11
12
|
import type { FragmentCapabilities } from './weave/capabilities.js';
|
|
13
|
+
import type { PrerequisiteResolver } from './elements/prerequisites.js';
|
|
12
14
|
export interface BraidOptions {
|
|
13
15
|
/**
|
|
14
16
|
* What this host offers fragments, as a contract they can require a range of.
|
|
@@ -91,6 +93,29 @@ export interface BraidOptions {
|
|
|
91
93
|
* fragment documents from `/manage/__braid/…`. Call `initBraid` before any slot connects.
|
|
92
94
|
*/
|
|
93
95
|
basePath?: string;
|
|
96
|
+
/**
|
|
97
|
+
* Resolvers for mount prerequisites: named things that must be ready before a fragment's code
|
|
98
|
+
* runs, such as a warm session for its authorization server. Keyed by exact key or by a
|
|
99
|
+
* `prefix*` pattern. A fragment declares the keys it needs with `<fragment-slot requires="…">`
|
|
100
|
+
* or its manifest's `requires`. See `elements/prerequisites.ts`.
|
|
101
|
+
*
|
|
102
|
+
* ```ts
|
|
103
|
+
* initBraid({ prerequisites: { 'session:*': (key, { signal }) => sessions.ensure(key, { signal }) } });
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
prerequisites?: Record<string, PrerequisiteResolver>;
|
|
107
|
+
/** How long a prerequisite may take before its fragment fails. Defaults to 15 seconds. */
|
|
108
|
+
prerequisiteTimeoutMs?: number;
|
|
109
|
+
/**
|
|
110
|
+
* Reboot a fragment that fails for a reason a retry can fix — its fetch, its realm, its
|
|
111
|
+
* handshake or mount failed, or it stopped answering (`gone`) — up to three times per mount, after
|
|
112
|
+
* 1, 4 and 16 seconds. Off by default. `true` takes those defaults; an object sets them. See
|
|
113
|
+
* `elements/recovery.ts` for what is and is not retried.
|
|
114
|
+
*/
|
|
115
|
+
recover?: boolean | {
|
|
116
|
+
attempts?: number;
|
|
117
|
+
delayMs?: number;
|
|
118
|
+
};
|
|
94
119
|
}
|
|
95
120
|
/** See {@link BraidOptions.realmGlobals}. */
|
|
96
121
|
export type RealmGlobalsHook = (fragment: {
|
|
@@ -106,6 +131,9 @@ interface ResolvedBraidConfig {
|
|
|
106
131
|
sharedGlobals?: string[];
|
|
107
132
|
realmGlobals?: RealmGlobalsHook;
|
|
108
133
|
onHostNavigation?: (notify: () => void) => void;
|
|
134
|
+
prerequisites?: Record<string, PrerequisiteResolver>;
|
|
135
|
+
prerequisiteTimeoutMs?: number;
|
|
136
|
+
recover?: RecoveryPolicy;
|
|
109
137
|
}
|
|
110
138
|
export declare function setBraidConfig(options?: BraidOptions): void;
|
|
111
139
|
export declare function getBraidConfig(): Readonly<ResolvedBraidConfig>;
|
package/src/config.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* own realm and shadow DOM subtree. The one channel back is `sharedGlobals`: host globals the host
|
|
8
8
|
* names itself, which trusted fragments may then read and write.
|
|
9
9
|
*/
|
|
10
|
+
import { DEFAULT_RECOVERY, MAX_RECOVERY_ATTEMPTS } from './elements/recovery.js';
|
|
10
11
|
const config = {
|
|
11
12
|
dev: false,
|
|
12
13
|
basePath: '',
|
|
@@ -30,6 +31,29 @@ export function setBraidConfig(options = {}) {
|
|
|
30
31
|
if (options.onHostNavigation) {
|
|
31
32
|
config.onHostNavigation = options.onHostNavigation;
|
|
32
33
|
}
|
|
34
|
+
if (options.prerequisites) {
|
|
35
|
+
config.prerequisites = options.prerequisites;
|
|
36
|
+
}
|
|
37
|
+
if (options.prerequisiteTimeoutMs !== undefined) {
|
|
38
|
+
if (!Number.isFinite(options.prerequisiteTimeoutMs) || options.prerequisiteTimeoutMs <= 0) {
|
|
39
|
+
throw new Error(`braid: prerequisiteTimeoutMs must be a positive number of milliseconds`);
|
|
40
|
+
}
|
|
41
|
+
config.prerequisiteTimeoutMs = options.prerequisiteTimeoutMs;
|
|
42
|
+
}
|
|
43
|
+
if (options.recover !== undefined) {
|
|
44
|
+
if (options.recover === false) {
|
|
45
|
+
delete config.recover;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const given = options.recover === true ? {} : options.recover;
|
|
49
|
+
const attempts = given.attempts ?? DEFAULT_RECOVERY.attempts;
|
|
50
|
+
const delayMs = given.delayMs ?? DEFAULT_RECOVERY.delayMs;
|
|
51
|
+
if (!Number.isInteger(attempts) || attempts < 1 || attempts > MAX_RECOVERY_ATTEMPTS || !Number.isFinite(delayMs) || delayMs < 0) {
|
|
52
|
+
throw new Error(`braid: recover needs 1 to ${MAX_RECOVERY_ATTEMPTS} attempts and a delayMs of zero or more`);
|
|
53
|
+
}
|
|
54
|
+
config.recover = { attempts, delayMs };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
33
57
|
// Kept in sync with the gateway's normalizeBasePath: a path the URL parser would rewrite (`/café`,
|
|
34
58
|
// a dot segment) could never match the parsed pathnames the gateway compares it to.
|
|
35
59
|
if (options.basePath !== undefined) {
|
package/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../libs/core/src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../libs/core/src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* When a slot boots its fragment: at once (`eager`, the default), or on intent.
|
|
3
|
+
*
|
|
4
|
+
* - `idle` — once the page has loaded and the browser next has nothing better to do, or two
|
|
5
|
+
* seconds after load regardless.
|
|
6
|
+
* - `visible` — when the slot comes within one viewport of being on screen.
|
|
7
|
+
* - `interaction` — on the first hover, pointer, key, or focus inside a pierced slot. The content
|
|
8
|
+
* is already painted, so the user has something to interact with; the fragment's code is what
|
|
9
|
+
* waits. A slot that was not pierced has nothing on screen to interact with, so it boots when
|
|
10
|
+
* visible instead.
|
|
11
|
+
*
|
|
12
|
+
* Deferring a boot defers all of it — the realm iframe, the document fetch, the fragment's
|
|
13
|
+
* framework and app — which is more than lazy hydration can defer inside one framework.
|
|
14
|
+
*/
|
|
15
|
+
export type BootMode = 'eager' | 'idle' | 'visible' | 'interaction';
|
|
16
|
+
export declare function parseBootMode(value: string | null, fragmentId: string): BootMode;
|
|
17
|
+
export interface BootGate {
|
|
18
|
+
/** Resolves when the slot should boot. Never rejects; never resolves after `dispose()`. */
|
|
19
|
+
readonly triggered: Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Re-dispatches the clicks and submits that arrived before the fragment could handle them, on
|
|
22
|
+
* their original targets, one per task, and stops holding. Called once the fragment is ready.
|
|
23
|
+
*/
|
|
24
|
+
replay(): void;
|
|
25
|
+
/** Stops waiting and holding, and drops anything held — the fragment will not be handling it. */
|
|
26
|
+
dispose(): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Waits for a slot's boot trigger, holding what the user did in the meantime.
|
|
30
|
+
*
|
|
31
|
+
* Clicks and submits inside the slot are the events whose default action goes wrong without the
|
|
32
|
+
* fragment's code — a link followed, a form posted — so until the fragment is ready they are
|
|
33
|
+
* cancelled, kept, and replayed. At most one per element is kept, so three anxious clicks on "Pay"
|
|
34
|
+
* become one. Every other event is left alone, and listened to passively: typed text and focus are
|
|
35
|
+
* already in the DOM, which the fragment adopts in place.
|
|
36
|
+
*
|
|
37
|
+
* A replay is a synthetic event, some time after the real one, so what needs a fresh user gesture —
|
|
38
|
+
* `window.open`, a file picker, the clipboard — will not work from it.
|
|
39
|
+
*
|
|
40
|
+
* The listeners are on the slot's own shadow root, never on the host's `window` or `document`. The
|
|
41
|
+
* one exception is `idle`, which waits for the host window's `load` once, if the page has not
|
|
42
|
+
* loaded yet.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createBootGate(slot: HTMLElement, mode: BootMode, options: {
|
|
45
|
+
pierced: boolean;
|
|
46
|
+
fragmentId: string;
|
|
47
|
+
}): BootGate;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { isDevMode } from '../config.js';
|
|
2
|
+
const BOOT_MODES = ['eager', 'idle', 'visible', 'interaction'];
|
|
3
|
+
/** Events that start an `interaction` boot. Only `click` and `submit` are ever cancelled. */
|
|
4
|
+
const PASSIVE_INTENT_EVENTS = ['pointerover', 'pointerdown', 'touchstart', 'keydown', 'focusin'];
|
|
5
|
+
const HELD_EVENTS = ['click', 'submit'];
|
|
6
|
+
/** Held at most this many, so a user hammering a dead button cannot queue an avalanche. */
|
|
7
|
+
const MAX_HELD = 10;
|
|
8
|
+
/**
|
|
9
|
+
* How far outside the viewport a `visible` slot starts booting. A boot is a network round trip and
|
|
10
|
+
* an iframe, so it needs more lead than an image does; a smaller margin shows the skeleton on any
|
|
11
|
+
* brisk scroll.
|
|
12
|
+
*/
|
|
13
|
+
const VISIBLE_MARGIN = '100%';
|
|
14
|
+
/** The longest an `idle` boot waits, after load, for the browser to go idle. */
|
|
15
|
+
const IDLE_TIMEOUT_MS = 2_000;
|
|
16
|
+
export function parseBootMode(value, fragmentId) {
|
|
17
|
+
if (value === null || value === '')
|
|
18
|
+
return 'eager';
|
|
19
|
+
if (BOOT_MODES.includes(value))
|
|
20
|
+
return value;
|
|
21
|
+
console.warn(`[braid:${fragmentId}] unknown boot="${value}", booting eagerly; expected one of ${BOOT_MODES.join(', ')}`);
|
|
22
|
+
return 'eager';
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Waits for a slot's boot trigger, holding what the user did in the meantime.
|
|
26
|
+
*
|
|
27
|
+
* Clicks and submits inside the slot are the events whose default action goes wrong without the
|
|
28
|
+
* fragment's code — a link followed, a form posted — so until the fragment is ready they are
|
|
29
|
+
* cancelled, kept, and replayed. At most one per element is kept, so three anxious clicks on "Pay"
|
|
30
|
+
* become one. Every other event is left alone, and listened to passively: typed text and focus are
|
|
31
|
+
* already in the DOM, which the fragment adopts in place.
|
|
32
|
+
*
|
|
33
|
+
* A replay is a synthetic event, some time after the real one, so what needs a fresh user gesture —
|
|
34
|
+
* `window.open`, a file picker, the clipboard — will not work from it.
|
|
35
|
+
*
|
|
36
|
+
* The listeners are on the slot's own shadow root, never on the host's `window` or `document`. The
|
|
37
|
+
* one exception is `idle`, which waits for the host window's `load` once, if the page has not
|
|
38
|
+
* loaded yet.
|
|
39
|
+
*/
|
|
40
|
+
export function createBootGate(slot, mode, options) {
|
|
41
|
+
const held = [];
|
|
42
|
+
let stopTrigger = () => undefined;
|
|
43
|
+
let stopHolding = () => undefined;
|
|
44
|
+
let done = false;
|
|
45
|
+
let fire;
|
|
46
|
+
const triggered = new Promise((resolve) => {
|
|
47
|
+
fire = () => {
|
|
48
|
+
if (done)
|
|
49
|
+
return;
|
|
50
|
+
stopTrigger();
|
|
51
|
+
stopTrigger = () => undefined;
|
|
52
|
+
resolve();
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
const root = slot.shadowRoot;
|
|
56
|
+
const effective = mode === 'interaction' && !(options.pierced && root) ? 'visible' : mode;
|
|
57
|
+
if (effective === 'eager') {
|
|
58
|
+
fire();
|
|
59
|
+
}
|
|
60
|
+
else if (effective === 'idle') {
|
|
61
|
+
let cancel = () => undefined;
|
|
62
|
+
const whenIdle = () => {
|
|
63
|
+
if (typeof requestIdleCallback === 'function') {
|
|
64
|
+
const handle = requestIdleCallback(() => fire(), { timeout: IDLE_TIMEOUT_MS });
|
|
65
|
+
cancel = () => cancelIdleCallback(handle);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// Safari has no requestIdleCallback: a moment after load is the closest equivalent
|
|
69
|
+
const handle = setTimeout(() => fire(), 200);
|
|
70
|
+
cancel = () => clearTimeout(handle);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
// idle during page load is time the page's own content needs
|
|
74
|
+
if (document.readyState === 'complete')
|
|
75
|
+
whenIdle();
|
|
76
|
+
else {
|
|
77
|
+
addEventListener('load', whenIdle, { once: true });
|
|
78
|
+
cancel = () => removeEventListener('load', whenIdle);
|
|
79
|
+
}
|
|
80
|
+
stopTrigger = () => cancel();
|
|
81
|
+
}
|
|
82
|
+
else if (effective === 'visible') {
|
|
83
|
+
if (typeof IntersectionObserver !== 'function') {
|
|
84
|
+
fire();
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const observer = new IntersectionObserver((entries) => {
|
|
88
|
+
if (entries.some((entry) => entry.isIntersecting))
|
|
89
|
+
fire();
|
|
90
|
+
}, { rootMargin: VISIBLE_MARGIN });
|
|
91
|
+
observer.observe(slot);
|
|
92
|
+
stopTrigger = () => observer.disconnect();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const shadow = root;
|
|
97
|
+
// After the next paint, so the boot's work does not land in the frame that answers the
|
|
98
|
+
// interaction that started it — which is the frame INP measures.
|
|
99
|
+
const fireAfterPaint = () => {
|
|
100
|
+
if (typeof requestAnimationFrame === 'function')
|
|
101
|
+
requestAnimationFrame(() => setTimeout(fire, 0));
|
|
102
|
+
else
|
|
103
|
+
setTimeout(fire, 0);
|
|
104
|
+
};
|
|
105
|
+
const onIntent = () => fireAfterPaint();
|
|
106
|
+
const onHeld = (event) => {
|
|
107
|
+
hold(event);
|
|
108
|
+
fireAfterPaint();
|
|
109
|
+
};
|
|
110
|
+
for (const type of PASSIVE_INTENT_EVENTS)
|
|
111
|
+
shadow.addEventListener(type, onIntent, { capture: true, passive: true });
|
|
112
|
+
// Kept until replay, not only until the trigger: a click while the fragment boots needs
|
|
113
|
+
// holding as much as the first.
|
|
114
|
+
for (const type of HELD_EVENTS)
|
|
115
|
+
shadow.addEventListener(type, onHeld, { capture: true });
|
|
116
|
+
stopHolding = () => {
|
|
117
|
+
for (const type of PASSIVE_INTENT_EVENTS)
|
|
118
|
+
shadow.removeEventListener(type, onIntent, { capture: true });
|
|
119
|
+
for (const type of HELD_EVENTS)
|
|
120
|
+
shadow.removeEventListener(type, onHeld, { capture: true });
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function hold(event) {
|
|
124
|
+
const target = event.composedPath()[0];
|
|
125
|
+
if (!target)
|
|
126
|
+
return;
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
// The fragment's own handlers do not exist yet, and the host's bubbling listeners should see
|
|
129
|
+
// this action once — when it is replayed — rather than once cancelled and again for real.
|
|
130
|
+
event.stopPropagation();
|
|
131
|
+
if (held.length >= MAX_HELD || held.some((entry) => entry.target === target))
|
|
132
|
+
return;
|
|
133
|
+
held.push(event.type === 'submit'
|
|
134
|
+
? { target, submitter: event.submitter ?? null }
|
|
135
|
+
: { target, click: mouseInit(event) });
|
|
136
|
+
}
|
|
137
|
+
function finish() {
|
|
138
|
+
done = true;
|
|
139
|
+
stopTrigger();
|
|
140
|
+
stopHolding();
|
|
141
|
+
}
|
|
142
|
+
function replayOne(entry) {
|
|
143
|
+
if (!entry.target.isConnected) {
|
|
144
|
+
if (isDevMode()) {
|
|
145
|
+
console.warn(`[braid:${options.fragmentId}] an action taken before boot was dropped: its element left the ` +
|
|
146
|
+
`DOM while the fragment booted, so the fragment re-rendered instead of adopting its markup`);
|
|
147
|
+
}
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
if (entry.click) {
|
|
152
|
+
entry.target.dispatchEvent(new MouseEvent('click', entry.click));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
const form = entry.target;
|
|
156
|
+
// a submitter the fragment replaced is no longer this form's, and requestSubmit would throw
|
|
157
|
+
const submitter = entry.submitter?.isConnected && entry.submitter.form === form ? entry.submitter : undefined;
|
|
158
|
+
form.requestSubmit(submitter);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
console.warn(`[braid:${options.fragmentId}] replaying an action taken before boot failed`, error);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
triggered,
|
|
167
|
+
replay() {
|
|
168
|
+
if (done)
|
|
169
|
+
return;
|
|
170
|
+
finish();
|
|
171
|
+
const queue = held.splice(0);
|
|
172
|
+
// One per task, so each handler's own re-render — a button disabling itself — lands first.
|
|
173
|
+
const next = () => {
|
|
174
|
+
const entry = queue.shift();
|
|
175
|
+
if (!entry)
|
|
176
|
+
return;
|
|
177
|
+
replayOne(entry);
|
|
178
|
+
if (queue.length)
|
|
179
|
+
setTimeout(next, 0);
|
|
180
|
+
};
|
|
181
|
+
next();
|
|
182
|
+
},
|
|
183
|
+
dispose() {
|
|
184
|
+
finish();
|
|
185
|
+
held.length = 0;
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function mouseInit(event) {
|
|
190
|
+
return {
|
|
191
|
+
bubbles: true,
|
|
192
|
+
cancelable: true,
|
|
193
|
+
composed: true,
|
|
194
|
+
detail: event.detail,
|
|
195
|
+
clientX: event.clientX,
|
|
196
|
+
clientY: event.clientY,
|
|
197
|
+
screenX: event.screenX,
|
|
198
|
+
screenY: event.screenY,
|
|
199
|
+
button: event.button,
|
|
200
|
+
buttons: event.buttons,
|
|
201
|
+
ctrlKey: event.ctrlKey,
|
|
202
|
+
shiftKey: event.shiftKey,
|
|
203
|
+
altKey: event.altKey,
|
|
204
|
+
metaKey: event.metaKey,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=boot-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boot-gate.js","sourceRoot":"","sources":["../../../../../libs/core/src/elements/boot-gate.ts"],"names":[],"mappings":"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"}
|