@fireweaveai/web-sdk 2.3.0-staging.2 → 3.0.0-staging.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/README.md +100 -4
- package/dist/application/client.d.ts +12 -27
- package/dist/application/client.d.ts.map +1 -1
- package/dist/application/client.js +21 -38
- package/dist/application/client.js.map +1 -1
- package/dist/application/ports.d.ts +4 -4
- package/dist/application/ports.d.ts.map +1 -1
- package/dist/application/runtime.d.ts +2 -2
- package/dist/application/runtime.d.ts.map +1 -1
- package/dist/application/runtime.js +22 -19
- package/dist/application/runtime.js.map +1 -1
- package/dist/build/node/define.d.ts +14 -0
- package/dist/build/node/define.js +35 -0
- package/dist/build/node/define.js.map +1 -0
- package/dist/build/node/shared.d.ts +19 -0
- package/dist/build/node/shared.js +44 -0
- package/dist/build/node/shared.js.map +1 -0
- package/dist/build/node/vite.d.ts +53 -0
- package/dist/build/node/vite.js +103 -0
- package/dist/build/node/vite.js.map +1 -0
- package/dist/build/src/start/build-info.d.ts +2 -0
- package/dist/build/src/start/build-info.js +7 -0
- package/dist/build/src/start/build-info.js.map +1 -0
- package/dist/build/src/start/names.d.ts +44 -0
- package/dist/build/src/start/names.js +45 -0
- package/dist/build/src/start/names.js.map +1 -0
- package/dist/build/src/start/policy.d.ts +70 -0
- package/dist/build/src/start/policy.js +124 -0
- package/dist/build/src/start/policy.js.map +1 -0
- package/dist/domain/errors.d.ts +1 -1
- package/dist/domain/errors.d.ts.map +1 -1
- package/dist/domain/errors.js +1 -1
- package/dist/domain/errors.js.map +1 -1
- package/dist/domain/types.d.ts +3 -3
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/domain/validation.d.ts +4 -4
- package/dist/domain/validation.js +7 -7
- package/dist/domain/validation.js.map +1 -1
- package/dist/infrastructure/adapters/inmemory.js +1 -1
- package/dist/infrastructure/adapters/inmemory.js.map +1 -1
- package/dist/infrastructure/adapters/remote.js +11 -11
- package/dist/infrastructure/adapters/remote.js.map +1 -1
- package/dist/start/build-info.d.ts +3 -0
- package/dist/start/build-info.d.ts.map +1 -0
- package/dist/start/build-info.js +7 -0
- package/dist/start/build-info.js.map +1 -0
- package/dist/start/control-points.d.ts +25 -0
- package/dist/start/control-points.d.ts.map +1 -0
- package/dist/start/control-points.js +57 -0
- package/dist/start/control-points.js.map +1 -0
- package/dist/start/fw.d.ts +43 -0
- package/dist/start/fw.d.ts.map +1 -0
- package/dist/start/fw.js +135 -0
- package/dist/start/fw.js.map +1 -0
- package/dist/start/identity.d.ts +20 -0
- package/dist/start/identity.d.ts.map +1 -0
- package/dist/start/identity.js +85 -0
- package/dist/start/identity.js.map +1 -0
- package/dist/start/index.d.ts +35 -0
- package/dist/start/index.d.ts.map +1 -0
- package/dist/start/index.js +30 -0
- package/dist/start/index.js.map +1 -0
- package/dist/start/names.d.ts +45 -0
- package/dist/start/names.d.ts.map +1 -0
- package/dist/start/names.js +45 -0
- package/dist/start/names.js.map +1 -0
- package/dist/start/policy.d.ts +71 -0
- package/dist/start/policy.d.ts.map +1 -0
- package/dist/start/policy.js +124 -0
- package/dist/start/policy.js.map +1 -0
- package/dist/start/state.d.ts +104 -0
- package/dist/start/state.d.ts.map +1 -0
- package/dist/start/state.js +361 -0
- package/dist/start/state.js.map +1 -0
- package/package.json +23 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fw.js","sourceRoot":"","sources":["../../src/start/fw.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type Persistence = 'localStorage' | 'memory';
|
|
2
|
+
export interface Identity {
|
|
3
|
+
/** The anonymous key. */
|
|
4
|
+
deviceId: string;
|
|
5
|
+
/** True when the id outlives this page (stored, or supplied by the app). Only durable ids are registered. */
|
|
6
|
+
durable: boolean;
|
|
7
|
+
/** The signed-in key restored from storage, if any. */
|
|
8
|
+
user?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function readItem(name: string): string | undefined;
|
|
11
|
+
export declare function writeItem(name: string, value: string): boolean;
|
|
12
|
+
export declare function removeItem(name: string): void;
|
|
13
|
+
export declare function mintDeviceId(): string;
|
|
14
|
+
/** Load (or mint) the identity a start boots under. Writes nothing in memory mode. */
|
|
15
|
+
export declare function loadIdentity(persistence: Persistence, deviceIdOption: string | undefined): Identity;
|
|
16
|
+
/** Write the current ids (consent given). Returns whether the device id is now durable. */
|
|
17
|
+
export declare function persistIdentity(identity: Identity, user: string | undefined, appSuppliedDeviceId: boolean): boolean;
|
|
18
|
+
/** Remove everything the start profile stores (consent withdrawn). */
|
|
19
|
+
export declare function clearStoredIdentity(): void;
|
|
20
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/start/identity.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,6GAA6G;IAC7G,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOzD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAS9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM7C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAOrC;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CASnG;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,mBAAmB,EAAE,OAAO,GAAG,OAAO,CAInH;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser identity for the start profile: the anonymous device id, the signed-in
|
|
3
|
+
* key, and how (or whether) they persist.
|
|
4
|
+
*
|
|
5
|
+
* The device id key and its dev_ prefix are the scaffolded harness's, so an app
|
|
6
|
+
* that migrates keeps every returning visitor in the same ramp bucket. Every
|
|
7
|
+
* storage access is guarded: storage that throws (privacy modes, sandboxed
|
|
8
|
+
* iframes) means one id per page load, never an error.
|
|
9
|
+
*/
|
|
10
|
+
import { STORAGE_KEYS } from './names.js';
|
|
11
|
+
const storage = () => {
|
|
12
|
+
try {
|
|
13
|
+
return globalThis.localStorage ?? undefined;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export function readItem(name) {
|
|
20
|
+
try {
|
|
21
|
+
const value = storage()?.getItem(name);
|
|
22
|
+
return typeof value === 'string' && value.trim() !== '' ? value : undefined;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function writeItem(name, value) {
|
|
29
|
+
try {
|
|
30
|
+
const s = storage();
|
|
31
|
+
if (s === undefined)
|
|
32
|
+
return false;
|
|
33
|
+
s.setItem(name, value);
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function removeItem(name) {
|
|
41
|
+
try {
|
|
42
|
+
storage()?.removeItem(name);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// nothing to clean up if storage is unavailable
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function mintDeviceId() {
|
|
49
|
+
try {
|
|
50
|
+
return `dev_${globalThis.crypto.randomUUID()}`;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// randomUUID needs a secure context; the fallback is per page and never stored as stronger than it is.
|
|
54
|
+
return `dev_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 12)}`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Load (or mint) the identity a start boots under. Writes nothing in memory mode. */
|
|
58
|
+
export function loadIdentity(persistence, deviceIdOption) {
|
|
59
|
+
const user = persistence === 'localStorage' ? readItem(STORAGE_KEYS.identity) : undefined;
|
|
60
|
+
const withUser = (identity) => (user !== undefined ? { ...identity, user } : identity);
|
|
61
|
+
if (deviceIdOption !== undefined)
|
|
62
|
+
return withUser({ deviceId: deviceIdOption, durable: true });
|
|
63
|
+
if (persistence === 'memory')
|
|
64
|
+
return { deviceId: mintDeviceId(), durable: false };
|
|
65
|
+
const stored = readItem(STORAGE_KEYS.deviceId);
|
|
66
|
+
if (stored !== undefined)
|
|
67
|
+
return withUser({ deviceId: stored, durable: true });
|
|
68
|
+
const deviceId = mintDeviceId();
|
|
69
|
+
return withUser({ deviceId, durable: writeItem(STORAGE_KEYS.deviceId, deviceId) });
|
|
70
|
+
}
|
|
71
|
+
/** Write the current ids (consent given). Returns whether the device id is now durable. */
|
|
72
|
+
export function persistIdentity(identity, user, appSuppliedDeviceId) {
|
|
73
|
+
if (user !== undefined)
|
|
74
|
+
writeItem(STORAGE_KEYS.identity, user);
|
|
75
|
+
if (appSuppliedDeviceId)
|
|
76
|
+
return true;
|
|
77
|
+
return writeItem(STORAGE_KEYS.deviceId, identity.deviceId);
|
|
78
|
+
}
|
|
79
|
+
/** Remove everything the start profile stores (consent withdrawn). */
|
|
80
|
+
export function clearStoredIdentity() {
|
|
81
|
+
removeItem(STORAGE_KEYS.deviceId);
|
|
82
|
+
removeItem(STORAGE_KEYS.identity);
|
|
83
|
+
removeItem(STORAGE_KEYS.deviceRegistered);
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/start/identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fireweaveai/web-sdk/start: one start() call for a browser app.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* // src/fireweave/control-points.ts
|
|
6
|
+
* import { defineControlPoints } from '@fireweaveai/web-sdk/start';
|
|
7
|
+
* export const controlPoints = defineControlPoints({ 'new-checkout': { local: true } });
|
|
8
|
+
*
|
|
9
|
+
* // src/fireweave/start.ts — the first import of your entry module
|
|
10
|
+
* import { start } from '@fireweaveai/web-sdk/start';
|
|
11
|
+
* import { controlPoints } from './control-points';
|
|
12
|
+
* export const ready = start({ controlPoints });
|
|
13
|
+
*
|
|
14
|
+
* // anywhere
|
|
15
|
+
* import { fw } from '@fireweaveai/web-sdk/start';
|
|
16
|
+
* if (fw.controlPoints.getBooleanValue('new-checkout', false)) { ... }
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The key, endpoint and environment come from the fireweave() Vite plugin
|
|
20
|
+
* (`@fireweaveai/web-sdk/vite`) or fireweaveDefine() (`/define`) at build
|
|
21
|
+
* time, or from start() options. This module reads no environment.
|
|
22
|
+
*
|
|
23
|
+
* A layer over the unchanged core: it imports only the public barrel
|
|
24
|
+
* (docs/adr/0012-start-profile.md).
|
|
25
|
+
*/
|
|
26
|
+
export { start, resetForTests } from './state.js';
|
|
27
|
+
export type { StartOptions, StartState, StartProblem, FireweaveWebStatus } from './state.js';
|
|
28
|
+
export { fw } from './fw.js';
|
|
29
|
+
export type { FireweaveWebStart, ControlPoints, IdentifyOptions } from './fw.js';
|
|
30
|
+
export { defineControlPoints } from './control-points.js';
|
|
31
|
+
export type { ControlPointDefinition, ControlPointMap } from './control-points.js';
|
|
32
|
+
export type { Persistence } from './identity.js';
|
|
33
|
+
export type { StartMode, SdkChannel } from './policy.js';
|
|
34
|
+
export { SDK_VERSION, SDK_CHANNEL } from './build-info.js';
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/start/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACnF,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fireweaveai/web-sdk/start: one start() call for a browser app.
|
|
3
|
+
*
|
|
4
|
+
* ```ts
|
|
5
|
+
* // src/fireweave/control-points.ts
|
|
6
|
+
* import { defineControlPoints } from '@fireweaveai/web-sdk/start';
|
|
7
|
+
* export const controlPoints = defineControlPoints({ 'new-checkout': { local: true } });
|
|
8
|
+
*
|
|
9
|
+
* // src/fireweave/start.ts — the first import of your entry module
|
|
10
|
+
* import { start } from '@fireweaveai/web-sdk/start';
|
|
11
|
+
* import { controlPoints } from './control-points';
|
|
12
|
+
* export const ready = start({ controlPoints });
|
|
13
|
+
*
|
|
14
|
+
* // anywhere
|
|
15
|
+
* import { fw } from '@fireweaveai/web-sdk/start';
|
|
16
|
+
* if (fw.controlPoints.getBooleanValue('new-checkout', false)) { ... }
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The key, endpoint and environment come from the fireweave() Vite plugin
|
|
20
|
+
* (`@fireweaveai/web-sdk/vite`) or fireweaveDefine() (`/define`) at build
|
|
21
|
+
* time, or from start() options. This module reads no environment.
|
|
22
|
+
*
|
|
23
|
+
* A layer over the unchanged core: it imports only the public barrel
|
|
24
|
+
* (docs/adr/0012-start-profile.md).
|
|
25
|
+
*/
|
|
26
|
+
export { start, resetForTests } from './state.js';
|
|
27
|
+
export { fw } from './fw.js';
|
|
28
|
+
export { defineControlPoints } from './control-points.js';
|
|
29
|
+
export { SDK_VERSION, SDK_CHANNEL } from './build-info.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/start/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every name the web start profile and its build helpers use, in one place, so
|
|
3
|
+
* the README, the initialise skill and the error messages cannot drift apart.
|
|
4
|
+
*
|
|
5
|
+
* Imported by browser code and by the Node build helpers (node/), so it holds
|
|
6
|
+
* constants only.
|
|
7
|
+
*/
|
|
8
|
+
/** Build-time variables the Vite plugin and the define helper read. The browser reads none. */
|
|
9
|
+
export declare const BUILD_ENV: Readonly<{
|
|
10
|
+
key: "FIREWEAVE_BROWSER_KEY";
|
|
11
|
+
url: "FIREWEAVE_URL";
|
|
12
|
+
environment: "FIREWEAVE_ENV";
|
|
13
|
+
}>;
|
|
14
|
+
/** Fallback environment name after FIREWEAVE_ENV, at build time. */
|
|
15
|
+
export declare const ENVIRONMENT_FALLBACK = "APP_ENV";
|
|
16
|
+
/**
|
|
17
|
+
* Names the scaffolded harness used for the browser key. They held a project
|
|
18
|
+
* (server-family) key, which the start profile refuses, so they are detected
|
|
19
|
+
* only to explain what to set instead.
|
|
20
|
+
*/
|
|
21
|
+
export declare const RETIRED_KEY_NAMES: readonly string[];
|
|
22
|
+
/** Server secrets the Vite plugin looks for in output chunks. Never injected, never printed. */
|
|
23
|
+
export declare const SERVER_KEY_NAMES: readonly string[];
|
|
24
|
+
/** Environment names that mean "local development" when no key is set. Case-insensitive. */
|
|
25
|
+
export declare const DEV_ENVIRONMENTS: ReadonlySet<string>;
|
|
26
|
+
/** fw-server host for each release channel of this package. */
|
|
27
|
+
export declare const CHANNEL_URLS: Readonly<{
|
|
28
|
+
production: "https://app-server.fireweave.ai";
|
|
29
|
+
staging: "https://staging-app-server.fireweave.ai";
|
|
30
|
+
}>;
|
|
31
|
+
/** Hosts always allowed beside a custom endpoint, so local stacks keep working. */
|
|
32
|
+
export declare const LOOPBACK_HOSTS: readonly string[];
|
|
33
|
+
/** The only key family a browser may hold. */
|
|
34
|
+
export declare const BROWSER_KEY_PREFIX = "fw_public_";
|
|
35
|
+
/** localStorage keys. The device id key and its dev_ prefix match the scaffolded harness, so returning visitors keep their bucket. */
|
|
36
|
+
export declare const STORAGE_KEYS: Readonly<{
|
|
37
|
+
deviceId: "fireweave.device-id";
|
|
38
|
+
identity: "fireweave.identity";
|
|
39
|
+
deviceRegistered: "fireweave.device-registered";
|
|
40
|
+
}>;
|
|
41
|
+
/** Where the control-points object lives by convention; named in warnings. */
|
|
42
|
+
export declare const CONTROL_POINTS_FILE = "src/fireweave/control-points.ts";
|
|
43
|
+
/** The identifier the build helpers define and the browser reads behind a typeof guard. */
|
|
44
|
+
export declare const INJECTED_CONFIG_NAME = "__FIREWEAVE_WEB_CONFIG__";
|
|
45
|
+
//# sourceMappingURL=names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../src/start/names.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+FAA+F;AAC/F,eAAO,MAAM,SAAS;;;;EAIpB,CAAC;AAEH,oEAAoE;AACpE,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAA4E,CAAC;AAE5H,gGAAgG;AAChG,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EAA2D,CAAC;AAE1G,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAoD,CAAC;AAEtG,+DAA+D;AAC/D,eAAO,MAAM,YAAY;;;EAGvB,CAAC;AAEH,mFAAmF;AACnF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAAqD,CAAC;AAElG,8CAA8C;AAC9C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAE/C,sIAAsI;AACtI,eAAO,MAAM,YAAY;;;;EAIvB,CAAC;AAEH,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,oCAAoC,CAAC;AAErE,2FAA2F;AAC3F,eAAO,MAAM,oBAAoB,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every name the web start profile and its build helpers use, in one place, so
|
|
3
|
+
* the README, the initialise skill and the error messages cannot drift apart.
|
|
4
|
+
*
|
|
5
|
+
* Imported by browser code and by the Node build helpers (node/), so it holds
|
|
6
|
+
* constants only.
|
|
7
|
+
*/
|
|
8
|
+
/** Build-time variables the Vite plugin and the define helper read. The browser reads none. */
|
|
9
|
+
export const BUILD_ENV = Object.freeze({
|
|
10
|
+
key: 'FIREWEAVE_BROWSER_KEY',
|
|
11
|
+
url: 'FIREWEAVE_URL',
|
|
12
|
+
environment: 'FIREWEAVE_ENV',
|
|
13
|
+
});
|
|
14
|
+
/** Fallback environment name after FIREWEAVE_ENV, at build time. */
|
|
15
|
+
export const ENVIRONMENT_FALLBACK = 'APP_ENV';
|
|
16
|
+
/**
|
|
17
|
+
* Names the scaffolded harness used for the browser key. They held a project
|
|
18
|
+
* (server-family) key, which the start profile refuses, so they are detected
|
|
19
|
+
* only to explain what to set instead.
|
|
20
|
+
*/
|
|
21
|
+
export const RETIRED_KEY_NAMES = Object.freeze(['VITE_FW_PROJECT_API_KEY', 'PUBLIC_FW_PROJECT_API_KEY']);
|
|
22
|
+
/** Server secrets the Vite plugin looks for in output chunks. Never injected, never printed. */
|
|
23
|
+
export const SERVER_KEY_NAMES = Object.freeze(['FIREWEAVE_KEY', 'FW_PROJECT_API_KEY']);
|
|
24
|
+
/** Environment names that mean "local development" when no key is set. Case-insensitive. */
|
|
25
|
+
export const DEV_ENVIRONMENTS = new Set(['development', 'dev', 'local', 'test']);
|
|
26
|
+
/** fw-server host for each release channel of this package. */
|
|
27
|
+
export const CHANNEL_URLS = Object.freeze({
|
|
28
|
+
production: 'https://app-server.fireweave.ai',
|
|
29
|
+
staging: 'https://staging-app-server.fireweave.ai',
|
|
30
|
+
});
|
|
31
|
+
/** Hosts always allowed beside a custom endpoint, so local stacks keep working. */
|
|
32
|
+
export const LOOPBACK_HOSTS = Object.freeze(['localhost', '127.0.0.1', '::1']);
|
|
33
|
+
/** The only key family a browser may hold. */
|
|
34
|
+
export const BROWSER_KEY_PREFIX = 'fw_public_';
|
|
35
|
+
/** localStorage keys. The device id key and its dev_ prefix match the scaffolded harness, so returning visitors keep their bucket. */
|
|
36
|
+
export const STORAGE_KEYS = Object.freeze({
|
|
37
|
+
deviceId: 'fireweave.device-id',
|
|
38
|
+
identity: 'fireweave.identity',
|
|
39
|
+
deviceRegistered: 'fireweave.device-registered',
|
|
40
|
+
});
|
|
41
|
+
/** Where the control-points object lives by convention; named in warnings. */
|
|
42
|
+
export const CONTROL_POINTS_FILE = 'src/fireweave/control-points.ts';
|
|
43
|
+
/** The identifier the build helpers define and the browser reads behind a typeof guard. */
|
|
44
|
+
export const INJECTED_CONFIG_NAME = '__FIREWEAVE_WEB_CONFIG__';
|
|
45
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/start/names.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+FAA+F;AAC/F,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,eAAe;IACpB,WAAW,EAAE,eAAe;CAC7B,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,yBAAyB,EAAE,2BAA2B,CAAC,CAAC,CAAC;AAE5H,gGAAgG;AAChG,MAAM,CAAC,MAAM,gBAAgB,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC,CAAC;AAE1G,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtG,+DAA+D;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,UAAU,EAAE,iCAAiC;IAC7C,OAAO,EAAE,yCAAyC;CACnD,CAAC,CAAC;AAEH,mFAAmF;AACnF,MAAM,CAAC,MAAM,cAAc,GAAsB,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;AAElG,8CAA8C;AAC9C,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAE/C,sIAAsI;AACtI,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,oBAAoB;IAC9B,gBAAgB,EAAE,6BAA6B;CAChD,CAAC,CAAC;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,iCAAiC,CAAC;AAErE,2FAA2F;AAC3F,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type StartMode = 'remote' | 'local';
|
|
2
|
+
export type SdkChannel = 'staging' | 'production';
|
|
3
|
+
/** A value and where it came from ('start({ key })', 'FIREWEAVE_BROWSER_KEY', ...). */
|
|
4
|
+
export interface Sourced {
|
|
5
|
+
readonly value: string;
|
|
6
|
+
readonly source: string;
|
|
7
|
+
}
|
|
8
|
+
export type PolicyReason = 'invalid-mode' | 'missing-key' | 'server-key' | 'wrong-key-family' | 'insecure-url';
|
|
9
|
+
export interface PolicyInput {
|
|
10
|
+
readonly mode?: unknown;
|
|
11
|
+
readonly key?: Sourced | undefined;
|
|
12
|
+
readonly url?: Sourced | undefined;
|
|
13
|
+
readonly environment?: Sourced | undefined;
|
|
14
|
+
readonly channel: SdkChannel;
|
|
15
|
+
/** The variable or option a fix should name, e.g. FIREWEAVE_BROWSER_KEY. */
|
|
16
|
+
readonly keyVariable: string;
|
|
17
|
+
/** Where an environment name was looked for, for the missing-key message. */
|
|
18
|
+
readonly environmentChecked: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PolicyConfig {
|
|
21
|
+
readonly mode: StartMode;
|
|
22
|
+
/** Why this mode: the mode option, a present key, or the environment name. */
|
|
23
|
+
readonly modeSource: 'option' | 'key' | 'environment';
|
|
24
|
+
/** Remote only. A value starting with '/' is a same-origin proxy path. */
|
|
25
|
+
readonly url?: string;
|
|
26
|
+
readonly urlSource?: string;
|
|
27
|
+
/** Remote only, and absent for the channel default (the core's own list covers it). */
|
|
28
|
+
readonly allowedHosts?: readonly string[];
|
|
29
|
+
/** Remote only. Never logged. */
|
|
30
|
+
readonly key?: string;
|
|
31
|
+
readonly keySource: string;
|
|
32
|
+
readonly environment?: string;
|
|
33
|
+
readonly environmentSource?: string;
|
|
34
|
+
}
|
|
35
|
+
export type PolicyResult = {
|
|
36
|
+
readonly ok: true;
|
|
37
|
+
readonly config: PolicyConfig;
|
|
38
|
+
readonly warnings: readonly string[];
|
|
39
|
+
} | {
|
|
40
|
+
readonly ok: false;
|
|
41
|
+
readonly reason: PolicyReason;
|
|
42
|
+
readonly variable: string;
|
|
43
|
+
readonly message: string;
|
|
44
|
+
};
|
|
45
|
+
/** A trimmed, non-empty string with its source, or undefined. Non-strings count as unset. */
|
|
46
|
+
export declare function sourced(value: unknown, source: string): Sourced | undefined;
|
|
47
|
+
/** The first candidate that is set. */
|
|
48
|
+
export declare function firstOf(...candidates: ReadonlyArray<Sourced | undefined>): Sourced | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve mode, key and endpoint.
|
|
51
|
+
*
|
|
52
|
+
* An explicit mode wins. Otherwise a key means remote; no key and a
|
|
53
|
+
* development environment name means local; anything else fails closed, so a
|
|
54
|
+
* missing key never turns into silent local evaluation for real visitors.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolvePolicy(input: PolicyInput): PolicyResult;
|
|
57
|
+
/**
|
|
58
|
+
* What the build helpers inject as __FIREWEAVE_WEB_CONFIG__: raw values and
|
|
59
|
+
* their source names, re-resolved in the browser so explicit start() options
|
|
60
|
+
* still win. Never carries a server key or the control-points object.
|
|
61
|
+
*/
|
|
62
|
+
export interface InjectedConfig {
|
|
63
|
+
readonly v: 1;
|
|
64
|
+
readonly key?: string;
|
|
65
|
+
readonly keySource?: string;
|
|
66
|
+
readonly url?: string;
|
|
67
|
+
readonly urlSource?: string;
|
|
68
|
+
readonly environment?: string;
|
|
69
|
+
readonly environmentSource?: string;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/start/policy.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAElD,uFAAuF;AACvF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,kBAAkB,GAAG,cAAc,CAAC;AAE/G,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,QAAQ,GAAG,KAAK,GAAG,aAAa,CAAC;IACtD,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,iCAAiC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC1F;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/G,6FAA6F;AAC7F,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAI3E;AAED,uCAAuC;AACvC,wBAAgB,OAAO,CAAC,GAAG,UAAU,EAAE,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,OAAO,GAAG,SAAS,CAE9F;AAsED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CA+C9D;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;IACd,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The web start-profile policy: one pure resolver shared by the browser
|
|
3
|
+
* start() and the Node build helpers (node/vite.ts, node/define.ts), so a
|
|
4
|
+
* build and the page it produces can never disagree about mode, key or URL.
|
|
5
|
+
*
|
|
6
|
+
* Pure on purpose: no DOM, no env, no core import. Callers hand in values
|
|
7
|
+
* with their source names; the result is a config, or a failure carrying a
|
|
8
|
+
* fixed reason code and a message that names sources and variables, never a
|
|
9
|
+
* value.
|
|
10
|
+
*/
|
|
11
|
+
import { BROWSER_KEY_PREFIX, CHANNEL_URLS, DEV_ENVIRONMENTS, LOOPBACK_HOSTS } from './names.js';
|
|
12
|
+
/** A trimmed, non-empty string with its source, or undefined. Non-strings count as unset. */
|
|
13
|
+
export function sourced(value, source) {
|
|
14
|
+
if (typeof value !== 'string')
|
|
15
|
+
return undefined;
|
|
16
|
+
const trimmed = value.trim();
|
|
17
|
+
return trimmed === '' ? undefined : { value: trimmed, source };
|
|
18
|
+
}
|
|
19
|
+
/** The first candidate that is set. */
|
|
20
|
+
export function firstOf(...candidates) {
|
|
21
|
+
return candidates.find((c) => c !== undefined);
|
|
22
|
+
}
|
|
23
|
+
const fail = (reason, variable, message) => ({
|
|
24
|
+
ok: false,
|
|
25
|
+
reason,
|
|
26
|
+
variable,
|
|
27
|
+
message: `[fireweave] ${message}`,
|
|
28
|
+
});
|
|
29
|
+
/** Key family check. Messages name the source, never the value. */
|
|
30
|
+
function checkKey(key) {
|
|
31
|
+
const v = key.value;
|
|
32
|
+
if (v.startsWith(BROWSER_KEY_PREFIX))
|
|
33
|
+
return undefined;
|
|
34
|
+
if (v.startsWith('project-api-key_')) {
|
|
35
|
+
return fail('server-key', key.source, `The key from ${key.source} is a server key (project-api-key_…), which must never ship to a browser. Use a browser key (fw_public_…) from Project settings, API keys. If a bundle built with this key was deployed, revoke the key.`);
|
|
36
|
+
}
|
|
37
|
+
if (/^ph[a-z]_/.test(v)) {
|
|
38
|
+
return fail('wrong-key-family', key.source, `The key from ${key.source} is an analytics vendor key, not a FireWeave browser key (fw_public_…).`);
|
|
39
|
+
}
|
|
40
|
+
if (v.startsWith('fw_org_') || v.startsWith('cli_at_')) {
|
|
41
|
+
return fail('wrong-key-family', key.source, `The key from ${key.source} is an organisation or CLI token, not a FireWeave browser key (fw_public_…).`);
|
|
42
|
+
}
|
|
43
|
+
return fail('wrong-key-family', key.source, `The key from ${key.source} is not a FireWeave browser key (fw_public_…).`);
|
|
44
|
+
}
|
|
45
|
+
const isLoopback = (hostname) => hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '::1' || hostname === '[::1]';
|
|
46
|
+
function resolveUrl(url, channel) {
|
|
47
|
+
if (url === undefined)
|
|
48
|
+
return { url: CHANNEL_URLS[channel], urlSource: `SDK channel (${channel})` };
|
|
49
|
+
const value = url.value.replace(/\/+$/, '');
|
|
50
|
+
if (value.startsWith('//')) {
|
|
51
|
+
return fail('insecure-url', url.source, `The endpoint from ${url.source} is protocol-relative. Use an https URL or a same-origin path such as '/fw'.`);
|
|
52
|
+
}
|
|
53
|
+
// A same-origin proxy path: the browser resolves it against location.origin.
|
|
54
|
+
if (value.startsWith('/'))
|
|
55
|
+
return { url: value, urlSource: url.source };
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = new URL(value);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return fail('insecure-url', url.source, `The endpoint from ${url.source} is not a valid URL.`);
|
|
62
|
+
}
|
|
63
|
+
const httpsOk = parsed.protocol === 'https:';
|
|
64
|
+
const loopbackHttp = parsed.protocol === 'http:' && isLoopback(parsed.hostname);
|
|
65
|
+
if (!httpsOk && !loopbackHttp) {
|
|
66
|
+
return fail('insecure-url', url.source, `The endpoint from ${url.source} must use https (http is allowed only for localhost).`);
|
|
67
|
+
}
|
|
68
|
+
return { url: value, urlSource: url.source, allowedHosts: [parsed.hostname.replace(/^\[|\]$/g, ''), ...LOOPBACK_HOSTS] };
|
|
69
|
+
}
|
|
70
|
+
function remote(input, key, modeSource, warnings) {
|
|
71
|
+
const keyProblem = checkKey(key);
|
|
72
|
+
if (keyProblem !== undefined)
|
|
73
|
+
return keyProblem;
|
|
74
|
+
const url = resolveUrl(input.url, input.channel);
|
|
75
|
+
if ('ok' in url)
|
|
76
|
+
return url;
|
|
77
|
+
return { ok: true, config: { mode: 'remote', modeSource, ...url, key: key.value, keySource: key.source }, warnings };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Resolve mode, key and endpoint.
|
|
81
|
+
*
|
|
82
|
+
* An explicit mode wins. Otherwise a key means remote; no key and a
|
|
83
|
+
* development environment name means local; anything else fails closed, so a
|
|
84
|
+
* missing key never turns into silent local evaluation for real visitors.
|
|
85
|
+
*/
|
|
86
|
+
export function resolvePolicy(input) {
|
|
87
|
+
const warnings = [];
|
|
88
|
+
const { mode, key, environment } = input;
|
|
89
|
+
if (mode !== undefined && mode !== 'remote' && mode !== 'local') {
|
|
90
|
+
return fail('invalid-mode', 'mode', `start({ mode }) must be 'remote' or 'local'.`);
|
|
91
|
+
}
|
|
92
|
+
if (mode === 'local') {
|
|
93
|
+
if (key !== undefined) {
|
|
94
|
+
warnings.push(`[fireweave] mode 'local' ignores the key from ${key.source}; nothing is sent to fw-server.`);
|
|
95
|
+
}
|
|
96
|
+
return { ok: true, config: { mode: 'local', modeSource: 'option', keySource: 'none' }, warnings };
|
|
97
|
+
}
|
|
98
|
+
if (mode === 'remote') {
|
|
99
|
+
if (key === undefined) {
|
|
100
|
+
return fail('missing-key', input.keyVariable, `mode 'remote' needs a browser key. Set ${input.keyVariable} to a browser key (fw_public_…).`);
|
|
101
|
+
}
|
|
102
|
+
return remote(input, key, 'option', warnings);
|
|
103
|
+
}
|
|
104
|
+
if (key !== undefined)
|
|
105
|
+
return remote(input, key, 'key', warnings);
|
|
106
|
+
if (environment !== undefined && DEV_ENVIRONMENTS.has(environment.value.toLowerCase())) {
|
|
107
|
+
return {
|
|
108
|
+
ok: true,
|
|
109
|
+
config: {
|
|
110
|
+
mode: 'local',
|
|
111
|
+
modeSource: 'environment',
|
|
112
|
+
keySource: 'none',
|
|
113
|
+
environment: environment.value,
|
|
114
|
+
environmentSource: environment.source,
|
|
115
|
+
},
|
|
116
|
+
warnings,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const where = environment === undefined
|
|
120
|
+
? `no environment name is set (checked ${input.environmentChecked})`
|
|
121
|
+
: `the environment is '${environment.value}' (from ${environment.source}), which is not a development name`;
|
|
122
|
+
return fail('missing-key', input.keyVariable, `${input.keyVariable} is not set and ${where}. Set ${input.keyVariable} to a browser key (fw_public_…), or for local work set FIREWEAVE_ENV=development or pass start({ mode: 'local' }).`);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/start/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* start() and the page-wide singleton behind `fw`.
|
|
3
|
+
*
|
|
4
|
+
* One slot per page (or worker) at a Symbol.for key on globalThis, so HMR
|
|
5
|
+
* re-evaluation and two bundled copies of this package share one client.
|
|
6
|
+
*
|
|
7
|
+
* Nothing here throws or rejects. A browser that fails to start must still
|
|
8
|
+
* render: a configuration fault logs one console.error, sets the state to
|
|
9
|
+
* FAILED and `problem`, and every read serves its default. The build helpers
|
|
10
|
+
* (`/vite`, `/define`) are where a bad configuration fails loudly.
|
|
11
|
+
*/
|
|
12
|
+
import { FireweaveError, type FireweaveWebClient } from '../index.js';
|
|
13
|
+
import { type ControlPointMap } from './control-points.js';
|
|
14
|
+
import { type Identity, type Persistence } from './identity.js';
|
|
15
|
+
import { type InjectedConfig, type PolicyConfig, type PolicyReason, type SdkChannel, type StartMode } from './policy.js';
|
|
16
|
+
export interface StartOptions {
|
|
17
|
+
/** Control points and their local values; import from src/fireweave/control-points.ts. */
|
|
18
|
+
readonly controlPoints?: ControlPointMap;
|
|
19
|
+
/** Force a mode. Without it: a key means remote; no key means local only in a dev environment. */
|
|
20
|
+
readonly mode?: StartMode;
|
|
21
|
+
/** Environment name used to infer the mode. Default: what the fireweave() build plugin injected. */
|
|
22
|
+
readonly environment?: string;
|
|
23
|
+
/** fw-server URL, or a same-origin proxy path such as '/fw'. Default: the build config, else this SDK build's channel host. */
|
|
24
|
+
readonly url?: string;
|
|
25
|
+
/** Browser key (fw_public_…). Default: FIREWEAVE_BROWSER_KEY, injected by the build plugin. */
|
|
26
|
+
readonly key?: string;
|
|
27
|
+
/** Initial storage mode. 'memory' writes nothing until fw.setPersistence('localStorage'). Default 'localStorage'. */
|
|
28
|
+
readonly persistence?: Persistence;
|
|
29
|
+
/** An app-supplied anonymous id (for example the analytics id), used verbatim and not stored. */
|
|
30
|
+
readonly deviceId?: string;
|
|
31
|
+
/** Where [fireweave] lines go. Default: console. */
|
|
32
|
+
readonly log?: (line: string) => void;
|
|
33
|
+
/** Transport override for tests. */
|
|
34
|
+
readonly fetch?: typeof fetch;
|
|
35
|
+
}
|
|
36
|
+
export type StartState = 'NOT_STARTED' | 'INITIALIZING' | 'READY' | 'STALE' | 'ERROR' | 'FAILED' | 'SHUTDOWN';
|
|
37
|
+
export interface StartProblem {
|
|
38
|
+
readonly reason: PolicyReason | 'invalid-control-points' | 'start-failed' | 'key-rejected' | 'unreachable';
|
|
39
|
+
/** The variable or option at fault, when there is one. Never a value. */
|
|
40
|
+
readonly variable?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface FireweaveWebStatus {
|
|
43
|
+
readonly state: StartState;
|
|
44
|
+
readonly mode?: StartMode;
|
|
45
|
+
readonly modeSource?: PolicyConfig['modeSource'];
|
|
46
|
+
readonly channel: SdkChannel;
|
|
47
|
+
readonly sdkVersion: string;
|
|
48
|
+
/** fw-server host name only: never a path or a credential. */
|
|
49
|
+
readonly host?: string;
|
|
50
|
+
readonly endpointSource?: string;
|
|
51
|
+
readonly keySource?: string;
|
|
52
|
+
readonly environment?: string;
|
|
53
|
+
readonly controlPointCount?: number;
|
|
54
|
+
readonly problem?: StartProblem;
|
|
55
|
+
}
|
|
56
|
+
export interface Slot {
|
|
57
|
+
readonly protocol: 1;
|
|
58
|
+
state: StartState;
|
|
59
|
+
/** Bumped by every start and shutdown, so a late result from an older attempt is ignored. */
|
|
60
|
+
generation: number;
|
|
61
|
+
fingerprint?: string | undefined;
|
|
62
|
+
config?: PolicyConfig | undefined;
|
|
63
|
+
controlPoints: ControlPointMap;
|
|
64
|
+
persistence: Persistence;
|
|
65
|
+
appDeviceId: boolean;
|
|
66
|
+
identity?: Identity | undefined;
|
|
67
|
+
/** The key the current decisions were prefetched under. */
|
|
68
|
+
currentKey?: string | undefined;
|
|
69
|
+
client?: FireweaveWebClient | undefined;
|
|
70
|
+
problem?: StartProblem | undefined;
|
|
71
|
+
ready: Promise<void>;
|
|
72
|
+
/** Serializes identify / reset / forget, so the last call wins. */
|
|
73
|
+
chain: Promise<unknown>;
|
|
74
|
+
log: (line: string) => void;
|
|
75
|
+
readonly warned: Set<string>;
|
|
76
|
+
readonly listeners: Set<(state: StartState) => void>;
|
|
77
|
+
detachRuntime?: (() => void) | undefined;
|
|
78
|
+
}
|
|
79
|
+
export declare function slot(): Slot;
|
|
80
|
+
export declare function warnOnce(s: Slot, line: string): void;
|
|
81
|
+
/** console.error once per line. Errors bypass the log sink so they always reach the console. */
|
|
82
|
+
export declare function errorOnce(s: Slot, line: string): void;
|
|
83
|
+
/** Change state and notify. `always` re-notifies an unchanged state (a re-prefetch after identify). */
|
|
84
|
+
export declare function setState(s: Slot, next: StartState, always?: boolean): void;
|
|
85
|
+
/** What the fireweave() build plugin or fireweaveDefine() injected, if anything. */
|
|
86
|
+
export declare function injectedConfig(): InjectedConfig | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Start FireWeave for this page. Call once, from src/fireweave/start.ts.
|
|
89
|
+
*
|
|
90
|
+
* Resolves when the first prefetch settles (READY, STALE or ERROR) and never
|
|
91
|
+
* rejects, so `await start(...)` cannot blank a page. Check `fw.status()` for
|
|
92
|
+
* the outcome.
|
|
93
|
+
*/
|
|
94
|
+
export declare function start(options?: StartOptions): Promise<void>;
|
|
95
|
+
export declare function currentStatus(): FireweaveWebStatus;
|
|
96
|
+
/** Switch storage at runtime, for consent. Never part of the start() configuration check. */
|
|
97
|
+
export declare function setPersistenceFor(mode: Persistence): void;
|
|
98
|
+
/** Store (or clear) the signed-in key, when persistence allows it. */
|
|
99
|
+
export declare function rememberUser(s: Slot, user: string | undefined): void;
|
|
100
|
+
export declare function shutdownSlot(): Promise<void>;
|
|
101
|
+
/** Test only: shut down and forget the singleton so the next start() begins fresh. */
|
|
102
|
+
export declare function resetForTests(): Promise<void>;
|
|
103
|
+
export declare const notStartedError: (state: StartState) => FireweaveError;
|
|
104
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/start/state.ts"],"names":[],"mappings":"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"}
|