@econ-v1/domain 6.15.0 → 7.0.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/dist/errors/index.d.ts +3 -3
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/events/index.d.ts +10 -3
- package/dist/events/index.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/models/owner-views.d.ts +14 -0
- package/dist/models/owner-views.d.ts.map +1 -1
- package/dist/services/onboarding-flow-service.d.ts +2 -0
- package/dist/services/onboarding-flow-service.d.ts.map +1 -1
- package/dist/services/owner-view-refresh-service.d.ts +3 -0
- package/dist/services/owner-view-refresh-service.d.ts.map +1 -1
- package/dist/services/owner-view-service.d.ts +12 -0
- package/dist/services/owner-view-service.d.ts.map +1 -1
- package/dist/services/wifi-provisioning-service.d.ts +15 -1
- package/dist/services/wifi-provisioning-service.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/errors/index.js +12 -1
- package/src/events/index.js +3 -2
- package/src/index.js +3 -0
- package/src/models/owner-views.js +4 -1
- package/src/services/onboarding-flow-service.js +76 -5
- package/src/services/owner-view-refresh-service.js +43 -0
- package/src/services/owner-view-service.js +20 -0
- package/src/services/wifi-provisioning-service.js +28 -5
package/dist/errors/index.d.ts
CHANGED
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
/**
|
|
26
26
|
* @typedef {| SerializableError<"domain", DomainErrorCode> | SerializableError<"sync", SyncErrorCode> | SerializableError<"transport", TransportErrorCode>} SerializableClientError
|
|
27
27
|
*/
|
|
28
|
-
/** @type {readonly ["access-code-invalid", "capability_not_declared", "code-already-bound", "conflict", "invalid_request", "not_found", "stage_composition_not_enabled", "unauthorized", "unsupported_query", "validation_failed"]} */
|
|
29
|
-
export const DOMAIN_ERROR_CODES: readonly ["access-code-invalid", "capability_not_declared", "code-already-bound", "conflict", "invalid_request", "not_found", "stage_composition_not_enabled", "unauthorized", "unsupported_query", "validation_failed"];
|
|
28
|
+
/** @type {readonly ["access-code-invalid", "capability_not_declared", "capability_unavailable", "code-already-bound", "conflict", "invalid_request", "not_found", "stage_composition_not_enabled", "unauthorized", "unsupported_query", "validation_failed"]} */
|
|
29
|
+
export const DOMAIN_ERROR_CODES: readonly ["access-code-invalid", "capability_not_declared", "capability_unavailable", "code-already-bound", "conflict", "invalid_request", "not_found", "stage_composition_not_enabled", "unauthorized", "unsupported_query", "validation_failed"];
|
|
30
30
|
/** @type {readonly ["outbox_delivery_failed", "sync_conflict", "sync_terminal_failure"]} */
|
|
31
31
|
export const SYNC_ERROR_CODES: readonly ["outbox_delivery_failed", "sync_conflict", "sync_terminal_failure"];
|
|
32
32
|
/** @type {readonly ["connection_lost", "offline", "unavailable"]} */
|
|
@@ -34,7 +34,7 @@ export const TRANSPORT_ERROR_CODES: readonly ["connection_lost", "offline", "una
|
|
|
34
34
|
/**
|
|
35
35
|
* @extends {SerializableClientErrorBase<"domain", DomainErrorCode>}
|
|
36
36
|
*/
|
|
37
|
-
export class DomainError extends SerializableClientErrorBase<"domain", "conflict" | "access-code-invalid" | "capability_not_declared" | "code-already-bound" | "invalid_request" | "not_found" | "stage_composition_not_enabled" | "unauthorized" | "unsupported_query" | "validation_failed"> {
|
|
37
|
+
export class DomainError extends SerializableClientErrorBase<"domain", "conflict" | "access-code-invalid" | "capability_not_declared" | "capability_unavailable" | "code-already-bound" | "invalid_request" | "not_found" | "stage_composition_not_enabled" | "unauthorized" | "unsupported_query" | "validation_failed"> {
|
|
38
38
|
/**
|
|
39
39
|
* @param {ErrorOptions<DomainErrorCode>} options
|
|
40
40
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;;GAGG;AACH;;;;GAIG;AACH;;GAEG;AACH;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;;GAGG;AACH;;;;GAIG;AACH;;GAEG;AACH;;GAEG;AACH,iQAAiQ;AACjQ,iCADW,SAAS,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,+BAA+B,EAAE,cAAc,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CA4B3P;AACF,4FAA4F;AAC5F,+BADW,SAAS,CAAC,wBAAwB,EAAE,eAAe,EAAE,uBAAuB,CAAC,CACa;AACrG,qEAAqE;AACrE,oCADW,SAAS,CAAC,iBAAiB,EAAE,SAAS,EAAE,aAAa,CAAC,CACkB;AA2CnF;;GAEG;AACH;IACI;;KAEC;IACD,qBAFS,YAAY,CAAC,eAAe,CAAC,EAIrC;CACJ;AACD;;GAEG;AACH;IACI;;KAEC;IACD,qBAFS,YAAY,CAAC,aAAa,CAAC,EAInC;CACJ;AACD;;GAEG;AACH;IACI;;KAEC;IACD,qBAFS,YAAY,CAAC,kBAAkB,CAAC,EAIxC;CACJ;yBArIY,OAAO,oBAAoB,EAAE,UAAU;8BAGvC,CAAC,OAAO,kBAAkB,EAAE,MAAM,CAAC;4BAGnC,CAAC,OAAO,gBAAgB,EAAE,MAAM,CAAC;iCAGjC,CAAC,OAAO,qBAAqB,EAAE,MAAM,CAAC;yBAG7B,KAAK,SAAd,MAAQ,IACR;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAAE;8BAGzE,KAAK,SAAd,MAAQ,EACC,KAAK,SAAd,MAAQ,IACR;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAAE;0BAGxG,WAAW,GAAG,SAAS,GAAG,cAAc;sCAGtC,iBAAiB,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,iBAAiB,CAAC,WAAW,EAAE,kBAAkB,CAAC;AAmC3J;;;;;GAKG;AACH,0CAJsB,KAAK,SAAd,MAAQ,EACC,KAAK,SAAd,MAAQ;IAmBjB;;;;KAIC;IACD,wBAKC;IAzBD;;;KAGC;IACD,eAFQ,KAAK,CAER;IACL;;;KAGC;IACD,eAFQ,KAAK,CAER;IACL;;;KAGC;IACD,kBAFQ,UAAU,GAAG,SAAS,CAEtB;IAYR;;KAEC;IACD,UAFW,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAMzC;CACJ"}
|
package/dist/events/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** @typedef {(typeof KERNEL_EVENT_TYPES)[number]} CoreKernelEventType */
|
|
2
2
|
/** @typedef {AppEventType | CoreKernelEventType} KernelEventType */
|
|
3
|
-
/** @typedef {{ readonly "client-storage.state-changed": { readonly code?: string, readonly message?: string, readonly status: "ready" | "recovery-required" | "starting" }, readonly "offline.stage-readiness-changed": { readonly readiness: OfflineStageReadiness }, readonly "offline.identity-invalidated": { readonly scope: OfflineIdentityScope }, readonly "app.data.changed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "app.data.committed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "device-cleanup.changed": { readonly state?: string }, readonly "domain.entity-changed": { readonly action: "created" | "deleted" | "updated", readonly entityId: string, readonly entityType: string }, readonly "onboarding.flow-changed": { readonly stepId: string }, readonly "outbox.state-changed": { readonly intent: OutboxIntent }, readonly "room.job-stream": RoomJobStreamPayload, readonly "room.turn-stream": RoomTurnStreamPayload, readonly "stage.catalog-invalidated": { readonly reason: string }, readonly "query.invalidated": { readonly name: QueryName }, readonly "stage.registry-changed": { readonly appNames: readonly string[] }, readonly "sync.delta-applied": { readonly domain: string, readonly cursor: string }, readonly "transport.state-changed": { readonly state: TransportState }, readonly "connectivity.changed": { readonly reachability: "online" | "unreachable" | "session-required" | "unknown" } }} KernelEventPayloads */
|
|
3
|
+
/** @typedef {{ readonly "client-storage.state-changed": { readonly code?: string, readonly message?: string, readonly status: "ready" | "recovery-required" | "starting" }, readonly "offline.stage-readiness-changed": { readonly readiness: OfflineStageReadiness }, readonly "offline.identity-invalidated": { readonly scope: OfflineIdentityScope }, readonly "app.data.changed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "app.data.committed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "device-cleanup.changed": { readonly state?: string }, readonly "domain.entity-changed": { readonly action: "created" | "deleted" | "updated", readonly entityId: string, readonly entityType: string }, readonly "onboarding.flow-changed": { readonly stepId: string }, readonly "outbox.state-changed": { readonly intent: OutboxIntent }, readonly "room.job-stream": RoomJobStreamPayload, readonly "room.turn-stream": RoomTurnStreamPayload, readonly "stage.catalog-invalidated": { readonly reason: string }, readonly "query.invalidated": { readonly name: QueryName }, readonly "stage.registry-changed": { readonly appNames: readonly string[] }, readonly "sync.delta-applied": { readonly domain: string, readonly cursor: string }, readonly "transport.state-changed": { readonly state: TransportState }, readonly "connectivity.changed": { readonly reachability: "online" | "unreachable" | "session-required" | "unknown" }, readonly "ip-pool.health-changed": { readonly connectionState: "closed" | "filtered" | "open" | "unknown", readonly consecutiveFailures: number, readonly ipEntryId: string, readonly isHealthy: boolean, readonly latencyMs?: number } }} KernelEventPayloads */
|
|
4
4
|
/** @template {KernelEventType} T @typedef {T extends CoreKernelEventType ? KernelEventPayloads[T] : AppEventPayload} KernelEventPayload */
|
|
5
5
|
/** @template {KernelEventType} T @typedef {{ readonly occurredAt: string, readonly payload: KernelEventPayload<T>, readonly type: T }} KernelEventByType */
|
|
6
6
|
/** @typedef {{ readonly occurredAt: string, readonly payload: AppEventPayload, readonly type: AppEventType }} AppDomainEvent */
|
|
@@ -25,8 +25,8 @@ export function appEventScope(value: string): AppEventType | undefined;
|
|
|
25
25
|
export function appEventType(resource: string, instance?: string): AppEventType;
|
|
26
26
|
/** @param {string} value @returns {value is QueryName} */
|
|
27
27
|
export function isQueryName(value: string): value is QueryName;
|
|
28
|
-
/** @type {readonly ["transport.state-changed", "stage.catalog-invalidated", "stage.registry-changed", "query.invalidated", "outbox.state-changed", "domain.entity-changed", "sync.delta-applied", "client-storage.state-changed", "offline.stage-readiness-changed", "offline.identity-invalidated", "app.data.changed", "app.data.committed", "onboarding.flow-changed", "device-cleanup.changed", "room.turn-stream", "room.job-stream", "connectivity.changed"]} */
|
|
29
|
-
export const KERNEL_EVENT_TYPES: readonly ["transport.state-changed", "stage.catalog-invalidated", "stage.registry-changed", "query.invalidated", "outbox.state-changed", "domain.entity-changed", "sync.delta-applied", "client-storage.state-changed", "offline.stage-readiness-changed", "offline.identity-invalidated", "app.data.changed", "app.data.committed", "onboarding.flow-changed", "device-cleanup.changed", "room.turn-stream", "room.job-stream", "connectivity.changed"];
|
|
28
|
+
/** @type {readonly ["transport.state-changed", "stage.catalog-invalidated", "stage.registry-changed", "query.invalidated", "outbox.state-changed", "domain.entity-changed", "sync.delta-applied", "client-storage.state-changed", "offline.stage-readiness-changed", "offline.identity-invalidated", "app.data.changed", "app.data.committed", "onboarding.flow-changed", "device-cleanup.changed", "room.turn-stream", "room.job-stream", "connectivity.changed", "ip-pool.health-changed"]} */
|
|
29
|
+
export const KERNEL_EVENT_TYPES: readonly ["transport.state-changed", "stage.catalog-invalidated", "stage.registry-changed", "query.invalidated", "outbox.state-changed", "domain.entity-changed", "sync.delta-applied", "client-storage.state-changed", "offline.stage-readiness-changed", "offline.identity-invalidated", "app.data.changed", "app.data.committed", "onboarding.flow-changed", "device-cleanup.changed", "room.turn-stream", "room.job-stream", "connectivity.changed", "ip-pool.health-changed"];
|
|
30
30
|
export type CoreKernelEventType = (typeof KERNEL_EVENT_TYPES)[number];
|
|
31
31
|
export type KernelEventType = AppEventType | CoreKernelEventType;
|
|
32
32
|
export type KernelEventPayloads = {
|
|
@@ -88,6 +88,13 @@ export type KernelEventPayloads = {
|
|
|
88
88
|
readonly "connectivity.changed": {
|
|
89
89
|
readonly reachability: "online" | "unreachable" | "session-required" | "unknown";
|
|
90
90
|
};
|
|
91
|
+
readonly "ip-pool.health-changed": {
|
|
92
|
+
readonly connectionState: "closed" | "filtered" | "open" | "unknown";
|
|
93
|
+
readonly consecutiveFailures: number;
|
|
94
|
+
readonly ipEntryId: string;
|
|
95
|
+
readonly isHealthy: boolean;
|
|
96
|
+
readonly latencyMs?: number;
|
|
97
|
+
};
|
|
91
98
|
};
|
|
92
99
|
export type KernelEventPayload<T extends KernelEventType> = T extends CoreKernelEventType ? KernelEventPayloads[T] : AppEventPayload;
|
|
93
100
|
export type KernelEventByType<T extends KernelEventType> = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/events/index.js"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -164,6 +164,7 @@ export type NodeMetadataWire = import("./services/peer-directory-service.js").No
|
|
|
164
164
|
export type PeerAdvertisement = import("./services/peer-directory-service.js").PeerAdvertisement;
|
|
165
165
|
export type GossipAdvertisement = import("./services/gossip-service.js").GossipAdvertisement;
|
|
166
166
|
export type GossipServiceOptions = import("./services/gossip-service.js").GossipServiceOptions;
|
|
167
|
+
export type ConnectionEntry = import("./models/owner-views.js").ConnectionEntry;
|
|
167
168
|
export type FeedItem = import("./models/owner-views.js").FeedItem;
|
|
168
169
|
export type FeedItemKind = import("./models/owner-views.js").FeedItemKind;
|
|
169
170
|
export type FeedQuery = import("./models/owner-views.js").FeedQuery;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,19 @@ export type HomeSummary = {
|
|
|
13
13
|
readonly lastSyncedAt?: string;
|
|
14
14
|
readonly status: HomeStatus;
|
|
15
15
|
};
|
|
16
|
+
export type ConnectionEntry = {
|
|
17
|
+
readonly address: string;
|
|
18
|
+
readonly consecutiveFailures: number;
|
|
19
|
+
readonly healthy: boolean;
|
|
20
|
+
readonly id: string;
|
|
21
|
+
readonly ipv6: boolean;
|
|
22
|
+
readonly isActive: boolean;
|
|
23
|
+
readonly kind: "direct" | "relay";
|
|
24
|
+
readonly lastCheckedAt?: string;
|
|
25
|
+
readonly nodeId: string;
|
|
26
|
+
readonly openedAt?: string;
|
|
27
|
+
readonly transport: string;
|
|
28
|
+
};
|
|
16
29
|
export type PeerStatus = "offline" | "online" | "unknown";
|
|
17
30
|
export type PeerDirectoryEntry = {
|
|
18
31
|
readonly displayName: string;
|
|
@@ -59,6 +72,7 @@ export type OperationalSummary = {
|
|
|
59
72
|
* projection belongs behind its own repository port instead.
|
|
60
73
|
*/
|
|
61
74
|
export type OwnerViewRepository = {
|
|
75
|
+
listConnections(): Promise<readonly ConnectionEntry[]>;
|
|
62
76
|
listFeed(params: FeedQuery): Promise<readonly FeedItem[]>;
|
|
63
77
|
listPeers(params: PeerDirectoryQuery): Promise<readonly PeerDirectoryEntry[]>;
|
|
64
78
|
readHomeSummary(): Promise<HomeSummary | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-views.d.ts","sourceRoot":"","sources":["../../src/models/owner-views.js"],"names":[],"mappings":";;;;;;oCAGa,CAAC,OAAO,0BAA0B,EAAE,MAAM,OAAO,0BAA0B,CAAC;yBAG5E,SAAS,GAAG,QAAQ,GAAG,SAAS;0BAGhC;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAAE;
|
|
1
|
+
{"version":3,"file":"owner-views.d.ts","sourceRoot":"","sources":["../../src/models/owner-views.js"],"names":[],"mappings":"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"}
|
|
@@ -87,6 +87,7 @@ export type OnboardingCheckpointStore = import("./onboarding-checkpoint-store.js
|
|
|
87
87
|
export type OwnerClaimIdentity = import("./owner-claim-service.js").OwnerClaimIdentity;
|
|
88
88
|
export type OwnerClaimService = import("./owner-claim-service.js").OwnerClaimService;
|
|
89
89
|
export type WifiProvisioningService = import("./wifi-provisioning-service.js").WifiProvisioningService;
|
|
90
|
+
export type WifiStatusOutcome = import("./wifi-provisioning-service.js").WifiStatusOutcome;
|
|
90
91
|
export type OnboardingFlowStepId = (typeof ONBOARDING_FLOW_STEP_IDS)[number];
|
|
91
92
|
export type OnboardingFlowPhase = "connect" | "install" | "secure" | "identify" | "ready";
|
|
92
93
|
export type OnboardingFlowLcdScreenId = "onboard_qr" | "onboard_open_browser" | "onboard_home_qr" | "onboard_wifi_setup" | "onboard_wifi_joined" | "onboard_working" | "onboard_code" | "onboard_trusted" | "onboard_rejected";
|
|
@@ -100,6 +101,7 @@ export type OnboardingFlowApprovalState = "waiting" | "approved" | "rejected" |
|
|
|
100
101
|
export type OnboardingFlowReasonCode = "approval-expired" | "approval-rejected" | "wifi-credentials-rejected" | "wifi-scan-failed" | "wifi-unreachable" | "invitation-invalid" | "claim-failed" | "code-already-bound" | "access-code-invalid";
|
|
101
102
|
export type OnboardingFlowRow = OnboardingFlowRowBase & ({
|
|
102
103
|
readonly networks: readonly OnboardingFlowNetwork[];
|
|
104
|
+
readonly probing: boolean;
|
|
103
105
|
readonly scanning: boolean;
|
|
104
106
|
readonly stepId: "choose-network";
|
|
105
107
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-flow-service.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-flow-service.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"onboarding-flow-service.d.ts","sourceRoot":"","sources":["../../src/services/onboarding-flow-service.js"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ export class OwnerViewRefreshService {
|
|
|
6
6
|
/** @returns {Promise<void>} */
|
|
7
7
|
refreshHome(): Promise<void>;
|
|
8
8
|
/** @returns {Promise<void>} */
|
|
9
|
+
refreshConnections(): Promise<void>;
|
|
10
|
+
/** @returns {Promise<void>} */
|
|
9
11
|
refreshPeers(): Promise<void>;
|
|
10
12
|
/** @returns {Promise<void>} */
|
|
11
13
|
refreshFeed(): Promise<void>;
|
|
@@ -15,6 +17,7 @@ export class OwnerViewRefreshService {
|
|
|
15
17
|
}
|
|
16
18
|
export type RepositoryJsonValue = import("@econ-v1/ports").RepositoryJsonValue;
|
|
17
19
|
export type DomainEvent = import("../events/index.js").DomainEvent;
|
|
20
|
+
export type ConnectionEntry = import("../models/owner-views.js").ConnectionEntry;
|
|
18
21
|
export type FeedItem = import("../models/owner-views.js").FeedItem;
|
|
19
22
|
export type HomeSummary = import("../models/owner-views.js").HomeSummary;
|
|
20
23
|
export type OperationalSummary = import("../models/owner-views.js").OperationalSummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-view-refresh-service.d.ts","sourceRoot":"","sources":["../../src/services/owner-view-refresh-service.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"owner-view-refresh-service.d.ts","sourceRoot":"","sources":["../../src/services/owner-view-refresh-service.js"],"names":[],"mappings":"AAmBA;IAYI,sDAAsD;IACtD,qBADY,8BAA8B,EAOzC;IAED,+BAA+B;IAC/B,cADc,OAAO,CAAC,IAAI,CAAC,CAiB1B;IAED,+BAA+B;IAC/B,eADc,OAAO,CAAC,IAAI,CAAC,CAO1B;IAED,+BAA+B;IAC/B,sBADc,OAAO,CAAC,IAAI,CAAC,CAO1B;IAED,+BAA+B;IAC/B,gBADc,OAAO,CAAC,IAAI,CAAC,CAO1B;IAED,+BAA+B;IAC/B,eADc,OAAO,CAAC,IAAI,CAAC,CAO1B;IAED,+BAA+B;IAC/B,sBADc,OAAO,CAAC,IAAI,CAAC,CAO1B;;CAeJ;kCAnHa,OAAO,gBAAgB,EAAE,mBAAmB;0BAC5C,OAAO,oBAAoB,EAAE,WAAW;8BACxC,OAAO,0BAA0B,EAAE,eAAe;uBAClD,OAAO,0BAA0B,EAAE,QAAQ;0BAC3C,OAAO,0BAA0B,EAAE,WAAW;iCAC9C,OAAO,0BAA0B,EAAE,kBAAkB;kCACrD,OAAO,0BAA0B,EAAE,mBAAmB;iCACtD,OAAO,0BAA0B,EAAE,kBAAkB;uCAgPrD;IAAE,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;IAAC,UAAU,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAA;KAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE;6CAChP;IAAE,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("../models/owner-views.js").ConnectionEntry} ConnectionEntry
|
|
3
|
+
*/
|
|
1
4
|
/**
|
|
2
5
|
* @typedef {import("../models/owner-views.js").FeedItem} FeedItem
|
|
3
6
|
*/
|
|
@@ -40,11 +43,20 @@ export class OwnerViewService {
|
|
|
40
43
|
*/
|
|
41
44
|
listFeed(params: FeedQuery): Promise<readonly FeedItem[]>;
|
|
42
45
|
/**
|
|
46
|
+
* Connections are live transport state read from the online repository, with the local
|
|
47
|
+
* `connections:default` projection as the unreachable-node fallback (mirrors #2440): when the
|
|
48
|
+
* online read fails with a `TransportError` (node offline / path down) the last-known cached
|
|
49
|
+
* rows are returned so first paint still shows connections. Any other error propagates.
|
|
50
|
+
* @returns {Promise<readonly ConnectionEntry[]>}
|
|
51
|
+
*/
|
|
52
|
+
listConnections(): Promise<readonly ConnectionEntry[]>;
|
|
53
|
+
/**
|
|
43
54
|
* @returns {Promise<readonly OperationalSummary[]>}
|
|
44
55
|
*/
|
|
45
56
|
readOperational(): Promise<readonly OperationalSummary[]>;
|
|
46
57
|
#private;
|
|
47
58
|
}
|
|
59
|
+
export type ConnectionEntry = import("../models/owner-views.js").ConnectionEntry;
|
|
48
60
|
export type FeedItem = import("../models/owner-views.js").FeedItem;
|
|
49
61
|
export type FeedQuery = import("../models/owner-views.js").FeedQuery;
|
|
50
62
|
export type HomeSummary = import("../models/owner-views.js").HomeSummary;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"owner-view-service.d.ts","sourceRoot":"","sources":["../../src/services/owner-view-service.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"owner-view-service.d.ts","sourceRoot":"","sources":["../../src/services/owner-view-service.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;;GAEG;AACH;IAQI;;;KAGC;IACD,wBAHS,mBAAmB,qBACnB,mBAAmB,EAK3B;IACD;;KAEC;IACD,YAFW,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAKzC;IACD;;;KAGC;IACD,kBAHS,kBAAkB,GAChB,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAMhD;IACD;;;KAGC;IACD,iBAHS,SAAS,GACP,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAMtC;IACD;;;;;;KAMC;IACD,mBAFW,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAS7C;IACD;;KAEC;IACD,mBAFW,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAAC,CAKhD;;CACJ;8BAtFY,OAAO,0BAA0B,EAAE,eAAe;uBAGlD,OAAO,0BAA0B,EAAE,QAAQ;wBAG3C,OAAO,0BAA0B,EAAE,SAAS;0BAG5C,OAAO,0BAA0B,EAAE,WAAW;iCAG9C,OAAO,0BAA0B,EAAE,kBAAkB;kCAGrD,OAAO,0BAA0B,EAAE,mBAAmB;iCAGtD,OAAO,0BAA0B,EAAE,kBAAkB;iCAGrD,OAAO,0BAA0B,EAAE,kBAAkB"}
|
|
@@ -15,9 +15,23 @@ export class WifiProvisioningService {
|
|
|
15
15
|
* node side (the join tears down and re-adds the connection) and a handshake flake in that
|
|
16
16
|
* window strands the node back in setup AP mode. The wire values are node-server's
|
|
17
17
|
* `http_status` PascalCase strings; only an explicit `"Connected"` counts.
|
|
18
|
+
*
|
|
19
|
+
* `#node.invoke()` (`PrePairingHomeNodeClient`) issues a bare same-origin `fetch` with no
|
|
20
|
+
* `AbortSignal`/timeout of its own. Without a deadline HERE, a request that never settles — a
|
|
21
|
+
* phone mid-network-switch, a thrashing Pi Zero 2W, exactly the hardware this probe targets —
|
|
22
|
+
* used to hang this call forever, which stranded `OnboardingFlowService#probeStatus()` on
|
|
23
|
+
* step 3's "Checking your node." with `#probing` never clearing and no interactive element
|
|
24
|
+
* rendered (no rescan button — the picker's probing branch `return`s before building one).
|
|
25
|
+
* Racing the delay port caps that: past `deadlineMs` the outcome collapses to `unreachable`,
|
|
26
|
+
* same as every other failure this method already treats as a first-class outcome.
|
|
27
|
+
* @param {number} [deadlineMs] Defaults to {@link STATUS_DEADLINE_MS} (3s — the node's own
|
|
28
|
+
* wifi-status proxy deadline is 2s). `OnboardingFlowService#probeStatus()` passes a shorter
|
|
29
|
+
* value for its single retry: a node that missed the full deadline once is not going to
|
|
30
|
+
* answer within milliseconds, so the retry's own deadline only needs to catch a *transient*
|
|
31
|
+
* miss, not wait out a hung one a second time.
|
|
18
32
|
* @returns {Promise<WifiStatusOutcome>}
|
|
19
33
|
*/
|
|
20
|
-
status(): Promise<WifiStatusOutcome>;
|
|
34
|
+
status(deadlineMs?: number): Promise<WifiStatusOutcome>;
|
|
21
35
|
/** Lists what the node's radio can currently see. A failure is a first-class outcome, not a
|
|
22
36
|
* throw: step 4 stays on screen and offers "Scan again".
|
|
23
37
|
* @returns {Promise<WifiScanOutcome>}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wifi-provisioning-service.d.ts","sourceRoot":"","sources":["../../src/services/wifi-provisioning-service.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wifi-provisioning-service.d.ts","sourceRoot":"","sources":["../../src/services/wifi-provisioning-service.js"],"names":[],"mappings":"AAWA;IAyBE;;OAEG;IACH,qBAFW,8BAA8B,EAMxC;IA/BD;;;OAGG;IACH,gCAHW,MAAM,OAAO,GACX,OAAO,CAAC,oBAAoB,CAAC,CASzC;IAqBD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,oBAPW,MAAM,GAKJ,OAAO,CAAC,iBAAiB,CAAC,CAsBtC;IACD;;;OAGG;IACH,QAFa,OAAO,CAAC,eAAe,CAAC,CAwBpC;IACD;;;;;;;OAOG;IACH,gBAJW,MAAM,UACN,MAAM,GAAG,SAAS,GAChB,OAAO,CAAC,oBAAoB,CAAC,CA+BzC;IACD;;;;;;;;;;OAUG;IACH,0BALW,MAAM,YACN,MAAM,oBACN,MAAM,IAAI,GACR,OAAO,CAAC,kBAAkB,CAAC,CA2BvC;;CACF;wBA7La,OAAO,gBAAgB,EAAE,SAAS;6BAClC,OAAO,gBAAgB,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uCAkPxC,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM;8BAG9B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,uBAAuB,EAAE,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE;mCAGxB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACnE;IAAE,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAA;CAAE,GACzC;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE;iCAEzB,WAAW,GAAG,sBAAsB,GAAG,aAAa;mCACpD,WAAW,GAAG,YAAY;;;;;;gCAIzB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAClC;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE;;cAIzB,wBAAwB;;;;YACxB,MAAM;UACN,MAAM;;;WAIN,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;UACvB,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;;;;SAC9B,MAAM,MAAM;;;eAIZ,OAAO;6BACP,OAAO;WACP,OAAO;;;eAIP,SAAS,eAAe,EAAE;;;mBAI1B,OAAO;cACP,OAAO;;;aAIP,OAAO;;;wBAIP,OAAO;mBACP,OAAO"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@econ-v1/domain",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.1",
|
|
4
4
|
"description": "Platform-neutral domain contracts and errors for Node clients",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"author": "Node contributors",
|
|
@@ -57,6 +57,6 @@
|
|
|
57
57
|
"access": "public"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@econ-v1/ports": "
|
|
60
|
+
"@econ-v1/ports": "7.0.1"
|
|
61
61
|
}
|
|
62
62
|
}
|
package/src/errors/index.js
CHANGED
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
/**
|
|
28
28
|
* @typedef {| SerializableError<"domain", DomainErrorCode> | SerializableError<"sync", SyncErrorCode> | SerializableError<"transport", TransportErrorCode>} SerializableClientError
|
|
29
29
|
*/
|
|
30
|
-
/** @type {readonly ["access-code-invalid", "capability_not_declared", "code-already-bound", "conflict", "invalid_request", "not_found", "stage_composition_not_enabled", "unauthorized", "unsupported_query", "validation_failed"]} */
|
|
30
|
+
/** @type {readonly ["access-code-invalid", "capability_not_declared", "capability_unavailable", "code-already-bound", "conflict", "invalid_request", "not_found", "stage_composition_not_enabled", "unauthorized", "unsupported_query", "validation_failed"]} */
|
|
31
31
|
export const DOMAIN_ERROR_CODES = [
|
|
32
32
|
// Onboarding access-code rail (2026-08-10 design): the two envelope codes
|
|
33
33
|
// `onboarding-prepare` refuses with when a code-active node rejects a device's claim
|
|
@@ -36,6 +36,17 @@ export const DOMAIN_ERROR_CODES = [
|
|
|
36
36
|
// `OnboardingFlowService`'s matching `OnboardingFlowReasonCode` members.
|
|
37
37
|
"access-code-invalid",
|
|
38
38
|
"capability_not_declared",
|
|
39
|
+
// The home node ANSWERED, but no app currently provides the invoked capability (the
|
|
40
|
+
// provider is not installed, not loaded, or failed to start). That is a per-capability
|
|
41
|
+
// failure of the node's own app layer, not a transport outage: the path that carried the
|
|
42
|
+
// answer is healthy, so it must never be a `TransportError`. Before this member existed the
|
|
43
|
+
// adapters mapped the node's "No provider registered" answer to
|
|
44
|
+
// `TransportError("unavailable")`, which `ManagedHomeNodeClient` treats as a path failure —
|
|
45
|
+
// one unloaded optional app then tore down the shared WebSocket, re-minted the session and
|
|
46
|
+
// re-dialed on every refresh of the affected query (`observability.snapshot.v1`, and earlier
|
|
47
|
+
// `core.system.info`). Mapped by `client/adapters-web/src/network/envelope-error-mapping.js`
|
|
48
|
+
// (HTTP) and `client-rpc/response-error.js` (WebTransport/WebRTC).
|
|
49
|
+
"capability_unavailable",
|
|
39
50
|
"code-already-bound",
|
|
40
51
|
"conflict",
|
|
41
52
|
"invalid_request",
|
package/src/events/index.js
CHANGED
|
@@ -40,7 +40,7 @@ function parseAppEventType(value) {
|
|
|
40
40
|
return { instance, resource };
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
-
/** @type {readonly ["transport.state-changed", "stage.catalog-invalidated", "stage.registry-changed", "query.invalidated", "outbox.state-changed", "domain.entity-changed", "sync.delta-applied", "client-storage.state-changed", "offline.stage-readiness-changed", "offline.identity-invalidated", "app.data.changed", "app.data.committed", "onboarding.flow-changed", "device-cleanup.changed", "room.turn-stream", "room.job-stream", "connectivity.changed"]} */
|
|
43
|
+
/** @type {readonly ["transport.state-changed", "stage.catalog-invalidated", "stage.registry-changed", "query.invalidated", "outbox.state-changed", "domain.entity-changed", "sync.delta-applied", "client-storage.state-changed", "offline.stage-readiness-changed", "offline.identity-invalidated", "app.data.changed", "app.data.committed", "onboarding.flow-changed", "device-cleanup.changed", "room.turn-stream", "room.job-stream", "connectivity.changed", "ip-pool.health-changed"]} */
|
|
44
44
|
export const KERNEL_EVENT_TYPES = [
|
|
45
45
|
"transport.state-changed",
|
|
46
46
|
"stage.catalog-invalidated",
|
|
@@ -59,6 +59,7 @@ export const KERNEL_EVENT_TYPES = [
|
|
|
59
59
|
"room.turn-stream",
|
|
60
60
|
"room.job-stream",
|
|
61
61
|
"connectivity.changed",
|
|
62
|
+
"ip-pool.health-changed",
|
|
62
63
|
];
|
|
63
64
|
|
|
64
65
|
/** @typedef {(typeof KERNEL_EVENT_TYPES)[number]} CoreKernelEventType */
|
|
@@ -72,7 +73,7 @@ export const KERNEL_EVENT_TYPES = [
|
|
|
72
73
|
* shape a de-duplication would take — declared in `@econ-v1/ports` and re-exported outward — and
|
|
73
74
|
* is the follow-up if this union ever grows a fifth state.
|
|
74
75
|
*/
|
|
75
|
-
/** @typedef {{ readonly "client-storage.state-changed": { readonly code?: string, readonly message?: string, readonly status: "ready" | "recovery-required" | "starting" }, readonly "offline.stage-readiness-changed": { readonly readiness: OfflineStageReadiness }, readonly "offline.identity-invalidated": { readonly scope: OfflineIdentityScope }, readonly "app.data.changed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "app.data.committed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "device-cleanup.changed": { readonly state?: string }, readonly "domain.entity-changed": { readonly action: "created" | "deleted" | "updated", readonly entityId: string, readonly entityType: string }, readonly "onboarding.flow-changed": { readonly stepId: string }, readonly "outbox.state-changed": { readonly intent: OutboxIntent }, readonly "room.job-stream": RoomJobStreamPayload, readonly "room.turn-stream": RoomTurnStreamPayload, readonly "stage.catalog-invalidated": { readonly reason: string }, readonly "query.invalidated": { readonly name: QueryName }, readonly "stage.registry-changed": { readonly appNames: readonly string[] }, readonly "sync.delta-applied": { readonly domain: string, readonly cursor: string }, readonly "transport.state-changed": { readonly state: TransportState }, readonly "connectivity.changed": { readonly reachability: "online" | "unreachable" | "session-required" | "unknown" } }} KernelEventPayloads */
|
|
76
|
+
/** @typedef {{ readonly "client-storage.state-changed": { readonly code?: string, readonly message?: string, readonly status: "ready" | "recovery-required" | "starting" }, readonly "offline.stage-readiness-changed": { readonly readiness: OfflineStageReadiness }, readonly "offline.identity-invalidated": { readonly scope: OfflineIdentityScope }, readonly "app.data.changed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "app.data.committed": { readonly appName: string, readonly cursor: string, readonly revision: string, readonly stream: string }, readonly "device-cleanup.changed": { readonly state?: string }, readonly "domain.entity-changed": { readonly action: "created" | "deleted" | "updated", readonly entityId: string, readonly entityType: string }, readonly "onboarding.flow-changed": { readonly stepId: string }, readonly "outbox.state-changed": { readonly intent: OutboxIntent }, readonly "room.job-stream": RoomJobStreamPayload, readonly "room.turn-stream": RoomTurnStreamPayload, readonly "stage.catalog-invalidated": { readonly reason: string }, readonly "query.invalidated": { readonly name: QueryName }, readonly "stage.registry-changed": { readonly appNames: readonly string[] }, readonly "sync.delta-applied": { readonly domain: string, readonly cursor: string }, readonly "transport.state-changed": { readonly state: TransportState }, readonly "connectivity.changed": { readonly reachability: "online" | "unreachable" | "session-required" | "unknown" }, readonly "ip-pool.health-changed": { readonly connectionState: "closed" | "filtered" | "open" | "unknown", readonly consecutiveFailures: number, readonly ipEntryId: string, readonly isHealthy: boolean, readonly latencyMs?: number } }} KernelEventPayloads */
|
|
76
77
|
/** @template {KernelEventType} T @typedef {T extends CoreKernelEventType ? KernelEventPayloads[T] : AppEventPayload} KernelEventPayload */
|
|
77
78
|
/** @template {KernelEventType} T @typedef {{ readonly occurredAt: string, readonly payload: KernelEventPayload<T>, readonly type: T }} KernelEventByType */
|
|
78
79
|
/** @typedef {{ readonly occurredAt: string, readonly payload: AppEventPayload, readonly type: AppEventType }} AppDomainEvent */
|
package/src/index.js
CHANGED
|
@@ -377,6 +377,9 @@
|
|
|
377
377
|
/**
|
|
378
378
|
* @typedef {import("./services/gossip-service.js").GossipServiceOptions} GossipServiceOptions
|
|
379
379
|
*/
|
|
380
|
+
/**
|
|
381
|
+
* @typedef {import("./models/owner-views.js").ConnectionEntry} ConnectionEntry
|
|
382
|
+
*/
|
|
380
383
|
/**
|
|
381
384
|
* @typedef {import("./models/owner-views.js").FeedItem} FeedItem
|
|
382
385
|
*/
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
/**
|
|
10
10
|
* @typedef {{ readonly cachedAt?: string; readonly displayName: string; readonly homeNodeId: string; readonly lastSyncedAt?: string; readonly status: HomeStatus; }} HomeSummary
|
|
11
11
|
*/
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {{ readonly address: string; readonly consecutiveFailures: number; readonly healthy: boolean; readonly id: string; readonly ipv6: boolean; readonly isActive: boolean; readonly kind: "direct" | "relay"; readonly lastCheckedAt?: string; readonly nodeId: string; readonly openedAt?: string; readonly transport: string; }} ConnectionEntry
|
|
14
|
+
*/
|
|
12
15
|
/**
|
|
13
16
|
* @typedef {"offline" | "online" | "unknown"} PeerStatus
|
|
14
17
|
*/
|
|
@@ -49,7 +52,7 @@
|
|
|
49
52
|
* degraded mode when a browser cannot provide OPFS. A storage-backed
|
|
50
53
|
* projection belongs behind its own repository port instead.
|
|
51
54
|
*
|
|
52
|
-
* @typedef {{ listFeed(params: FeedQuery): Promise<readonly FeedItem[]>; listPeers(params: PeerDirectoryQuery): Promise<readonly PeerDirectoryEntry[]>; readHomeSummary(): Promise<HomeSummary | undefined>; readOperationalSummary(): Promise<OperationalSummary | undefined>; }} OwnerViewRepository
|
|
55
|
+
* @typedef {{ listConnections(): Promise<readonly ConnectionEntry[]>; listFeed(params: FeedQuery): Promise<readonly FeedItem[]>; listPeers(params: PeerDirectoryQuery): Promise<readonly PeerDirectoryEntry[]>; readHomeSummary(): Promise<HomeSummary | undefined>; readOperationalSummary(): Promise<OperationalSummary | undefined>; }} OwnerViewRepository
|
|
53
56
|
*/
|
|
54
57
|
export const OWNER_VIEW_SYNC_STRATEGIES = {
|
|
55
58
|
feeds: "log",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
/** @typedef {import("./owner-claim-service.js").OwnerClaimIdentity} OwnerClaimIdentity */
|
|
9
9
|
/** @typedef {import("./owner-claim-service.js").OwnerClaimService} OwnerClaimService */
|
|
10
10
|
/** @typedef {import("./wifi-provisioning-service.js").WifiProvisioningService} WifiProvisioningService */
|
|
11
|
+
/** @typedef {import("./wifi-provisioning-service.js").WifiStatusOutcome} WifiStatusOutcome */
|
|
11
12
|
import { createNullOnboardingPresence } from "@econ-v1/ports";
|
|
12
13
|
import { DomainError } from "../errors/index.js";
|
|
13
14
|
/** @type {readonly ["join-qr", "open-browser", "choose-network", "network-password", "handoff", "way-back", "install", "match-code", "invitation", "identity", "trusted"]} */
|
|
@@ -57,6 +58,9 @@ const WIFI_SKIPPABLE_STEPS = new Set([
|
|
|
57
58
|
"choose-network",
|
|
58
59
|
"network-password",
|
|
59
60
|
]);
|
|
61
|
+
/** Deadline passed to the SECOND attempt in `#probeStatus()`, far shorter than
|
|
62
|
+
* `WifiProvisioningService#status()`'s own default. See `#probeStatus()` for why. */
|
|
63
|
+
const PROBE_RETRY_DEADLINE_MS = 500;
|
|
60
64
|
const CONFIRMATION_WINDOW_MS = 5 * 60 * 1000;
|
|
61
65
|
const HANDOFF_WINDOW_MS = 3 * 60 * 1000;
|
|
62
66
|
/** @type {Readonly<Record<string, "confirm" | "reject">>} */
|
|
@@ -139,6 +143,20 @@ export class OnboardingFlowService {
|
|
|
139
143
|
#scanGeneration = 0;
|
|
140
144
|
/** @default false */
|
|
141
145
|
#scanning = false;
|
|
146
|
+
/** True while the flow-entry status probe is in flight and no scan has been started. The
|
|
147
|
+
* picker renders a neutral "checking" state on it — the person must never see a network list,
|
|
148
|
+
* or a button, for a node that is about to prove it is already on Wi-Fi (the picker's probing
|
|
149
|
+
* branch renders its own shimmering skeleton rows, same markup as the scanning state's).
|
|
150
|
+
* @default false */
|
|
151
|
+
#probing = false;
|
|
152
|
+
/** Bumped on every event that must invalidate an in-flight `#probeThenScan()` — `cancel()`
|
|
153
|
+
* and `#enterChooseNetwork()` — so a probe answer that lands after the person has left the
|
|
154
|
+
* flow entry it belongs to can neither repaint that entry nor start a scan under it. The
|
|
155
|
+
* `#stepId !== "choose-network"` check alone is not enough: `cancel()` resets `#stepId` back
|
|
156
|
+
* to `FIRST_PWA_STEP`, which IS `"choose-network"`, so the two steps look identical to that
|
|
157
|
+
* check even though the original entry is gone.
|
|
158
|
+
* @default 0 */
|
|
159
|
+
#probeGeneration = 0;
|
|
142
160
|
/** @default false */
|
|
143
161
|
#sessionEstablished = false;
|
|
144
162
|
/** @type {OnboardingFlowStepId} */
|
|
@@ -193,6 +211,7 @@ export class OnboardingFlowService {
|
|
|
193
211
|
return {
|
|
194
212
|
...base,
|
|
195
213
|
networks: this.#networks,
|
|
214
|
+
probing: this.#probing,
|
|
196
215
|
scanning: this.#scanning,
|
|
197
216
|
stepId,
|
|
198
217
|
};
|
|
@@ -269,6 +288,7 @@ export class OnboardingFlowService {
|
|
|
269
288
|
this.#scanning = false;
|
|
270
289
|
this.#sessionEstablished = false;
|
|
271
290
|
this.#stepId = restored ?? FIRST_PWA_STEP;
|
|
291
|
+
this.#probing = this.#stepId === "choose-network";
|
|
272
292
|
// The security of the checkpointed SSID is deliberately NOT persisted: the password is not
|
|
273
293
|
// resumable either, so step 5 is re-shown rather than replayed, and WPA2 is the demanding
|
|
274
294
|
// default (it asks for a secret rather than silently offering to join without one).
|
|
@@ -287,16 +307,22 @@ export class OnboardingFlowService {
|
|
|
287
307
|
// access" moment — independent of which step a resumed checkpoint or the Wi-Fi skip-check
|
|
288
308
|
// below lands on, rather than waiting for a click through the now-absent match-code step.
|
|
289
309
|
if (this.#accessCodeMode) void this.#prepareCode();
|
|
290
|
-
if (this.#stepId === "choose-network") {
|
|
291
|
-
void this.#scan();
|
|
292
|
-
}
|
|
293
310
|
// A node whose Wi-Fi was configured on its own captive portal (or any earlier attempt)
|
|
294
311
|
// needs no credentials from this flow: asking again is the double-prompt this probe
|
|
295
312
|
// exists to kill, and RESUBMITTING working credentials is worse than redundant — the node
|
|
296
313
|
// re-runs the join, and a handshake flake in that window strands it back in setup AP mode
|
|
297
314
|
// (observed live on Pi Zero 2W). Fired for the wifi-skippable steps only; `handoff` keeps
|
|
298
315
|
// its own watcher.
|
|
299
|
-
|
|
316
|
+
//
|
|
317
|
+
// On `choose-network` the probe runs BEFORE the scan, not beside it. Fired together, the
|
|
318
|
+
// node serialises them behind one lock, the status answer queues behind a ~1.7 s hardware
|
|
319
|
+
// scan and dies on the provisioning proxy's 2 s deadline — the flow then showed the picker
|
|
320
|
+
// to a node that was already on its home Wi-Fi until someone refreshed (Pi Zero 2W,
|
|
321
|
+
// 2026-08-21). Probing first also means a connected node never pays for a scan at all.
|
|
322
|
+
if (this.#stepId === "choose-network") {
|
|
323
|
+
this.#probeGeneration += 1;
|
|
324
|
+
void this.#probeThenScan(this.#probeGeneration);
|
|
325
|
+
} else if (WIFI_SKIPPABLE_STEPS.has(this.#stepId)) {
|
|
300
326
|
void this.#skipWifiIfAlreadyConnected();
|
|
301
327
|
}
|
|
302
328
|
if (this.#stepId === "handoff" && this.#wifiOperationId !== undefined) {
|
|
@@ -569,6 +595,8 @@ export class OnboardingFlowService {
|
|
|
569
595
|
this.#lcdTapPending = false;
|
|
570
596
|
this.#networks = [];
|
|
571
597
|
this.#operationHash = undefined;
|
|
598
|
+
this.#probeGeneration += 1;
|
|
599
|
+
this.#probing = false;
|
|
572
600
|
this.#reasonCode = undefined;
|
|
573
601
|
this.#remainingSeconds = 0;
|
|
574
602
|
this.#requiresConfirmation = false;
|
|
@@ -629,6 +657,8 @@ export class OnboardingFlowService {
|
|
|
629
657
|
*/
|
|
630
658
|
#enterChooseNetwork(reasonCode) {
|
|
631
659
|
this.#networks = [];
|
|
660
|
+
this.#probeGeneration += 1;
|
|
661
|
+
this.#probing = false;
|
|
632
662
|
this.#scanning = true;
|
|
633
663
|
this.#wifiOperationId = undefined;
|
|
634
664
|
this.#moveTo("choose-network", reasonCode);
|
|
@@ -640,17 +670,57 @@ export class OnboardingFlowService {
|
|
|
640
670
|
#enterInstall() {
|
|
641
671
|
this.#moveTo("install");
|
|
642
672
|
}
|
|
673
|
+
/** One flow-entry status probe, retried once on `unreachable`. The retry exists for a
|
|
674
|
+
* TRANSIENT miss, not a hung one: `WifiProvisioningService#status()` now enforces its own
|
|
675
|
+
* deadline (see its doc comment), so by the time this method's first attempt reaches
|
|
676
|
+
* `unreachable` the node either answered fast with a real failure, or it burned the full
|
|
677
|
+
* default deadline getting there. A node that missed a several-second deadline once is not
|
|
678
|
+
* going to answer within the next few hundred milliseconds either, so the retry passes a much
|
|
679
|
+
* SHORTER deadline (`PROBE_RETRY_DEADLINE_MS`) — enough to catch a quick transient hiccup
|
|
680
|
+
* without doubling the worst-case wait a real outage imposes on the picker. (Nothing here
|
|
681
|
+
* measured node response times; this is a bound on worst case, not a claim about the typical
|
|
682
|
+
* one.)
|
|
683
|
+
* @returns {Promise<WifiStatusOutcome>} */
|
|
684
|
+
async #probeStatus() {
|
|
685
|
+
const first = await this.#wifi.status();
|
|
686
|
+
if (first.kind !== "unreachable") return first;
|
|
687
|
+
return await this.#wifi.status(PROBE_RETRY_DEADLINE_MS);
|
|
688
|
+
}
|
|
643
689
|
/**
|
|
644
690
|
* @returns {Promise<void>}
|
|
645
691
|
*/
|
|
646
692
|
async #skipWifiIfAlreadyConnected() {
|
|
647
|
-
const outcome = await this.#
|
|
693
|
+
const outcome = await this.#probeStatus();
|
|
648
694
|
if (outcome.kind !== "connected") return;
|
|
649
695
|
if (!WIFI_SKIPPABLE_STEPS.has(this.#stepId)) return;
|
|
650
696
|
if (this.#wifiOperationId !== undefined) return;
|
|
651
697
|
if (outcome.ssid.length > 0) this.#targetSsid = outcome.ssid;
|
|
652
698
|
this.#enterInstall();
|
|
653
699
|
}
|
|
700
|
+
/** Flow entry on `choose-network`: probe, then either skip to `install` or start the scan.
|
|
701
|
+
* A person who left the step while the probe was in flight (cancel, a resumed command) must
|
|
702
|
+
* not get a scan started under a screen they are no longer on — checked both by `#stepId`
|
|
703
|
+
* (a different step) and by `generation` (the same step id, re-entered after a `cancel()`).
|
|
704
|
+
* @param {number} generation
|
|
705
|
+
* @returns {Promise<void>} */
|
|
706
|
+
async #probeThenScan(generation) {
|
|
707
|
+
const outcome = await this.#probeStatus();
|
|
708
|
+
// A stale generation means this probe is not the one the CURRENT entry started — do not
|
|
709
|
+
// touch `#probing`. Both places that bump `#probeGeneration` (`cancel()`,
|
|
710
|
+
// `#enterChooseNetwork()`) already clear `#probing` themselves for the entry that actually
|
|
711
|
+
// owns it; clearing it again here would stomp the current entry's own flag out from under
|
|
712
|
+
// it if it happened to still be probing.
|
|
713
|
+
if (this.#stepId !== "choose-network" || generation !== this.#probeGeneration) {
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
this.#probing = false;
|
|
717
|
+
if (outcome.kind === "connected" && this.#wifiOperationId === undefined) {
|
|
718
|
+
if (outcome.ssid.length > 0) this.#targetSsid = outcome.ssid;
|
|
719
|
+
this.#enterInstall();
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
await this.#scan();
|
|
723
|
+
}
|
|
654
724
|
/**
|
|
655
725
|
* @returns {Promise<void>}
|
|
656
726
|
*/
|
|
@@ -987,6 +1057,7 @@ function accessCodeReasonCode(error) {
|
|
|
987
1057
|
/**
|
|
988
1058
|
* @typedef {OnboardingFlowRowBase & ({
|
|
989
1059
|
* readonly networks: readonly OnboardingFlowNetwork[];
|
|
1060
|
+
* readonly probing: boolean;
|
|
990
1061
|
* readonly scanning: boolean;
|
|
991
1062
|
* readonly stepId: "choose-network";
|
|
992
1063
|
* }
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/** @typedef {import("@econ-v1/ports").RepositoryJsonValue} RepositoryJsonValue */
|
|
4
4
|
/** @typedef {import("../events/index.js").DomainEvent} DomainEvent */
|
|
5
|
+
/** @typedef {import("../models/owner-views.js").ConnectionEntry} ConnectionEntry */
|
|
5
6
|
/** @typedef {import("../models/owner-views.js").FeedItem} FeedItem */
|
|
6
7
|
/** @typedef {import("../models/owner-views.js").HomeSummary} HomeSummary */
|
|
7
8
|
/** @typedef {import("../models/owner-views.js").OperationalSummary} OperationalSummary */
|
|
@@ -9,6 +10,7 @@
|
|
|
9
10
|
/** @typedef {import("../models/owner-views.js").PeerDirectoryEntry} PeerDirectoryEntry */
|
|
10
11
|
|
|
11
12
|
const OWNER_VIEW_PROJECTION_KEYS = Object.freeze({
|
|
13
|
+
connections: "connections:default",
|
|
12
14
|
feed: "feed:default",
|
|
13
15
|
home: "home",
|
|
14
16
|
operations: "operations",
|
|
@@ -40,6 +42,7 @@ export class OwnerViewRefreshService {
|
|
|
40
42
|
async refreshAll() {
|
|
41
43
|
const homeValue = await this.#network.readHomeSummary();
|
|
42
44
|
const home = homeValue === undefined ? null : parseHome(homeValue);
|
|
45
|
+
const connections = [...parseConnections(await this.#network.listConnections())];
|
|
43
46
|
const peers = [...parsePeers(await this.#network.listPeers({}))];
|
|
44
47
|
const feed = [...parseFeed(await this.#network.listFeed({}))];
|
|
45
48
|
const operationsValue = await this.#network.readOperationalSummary();
|
|
@@ -47,6 +50,7 @@ export class OwnerViewRefreshService {
|
|
|
47
50
|
|
|
48
51
|
await this.#persist([
|
|
49
52
|
{ key: OWNER_VIEW_PROJECTION_KEYS.home, payload: home },
|
|
53
|
+
{ key: OWNER_VIEW_PROJECTION_KEYS.connections, payload: connections },
|
|
50
54
|
{ key: OWNER_VIEW_PROJECTION_KEYS.peers, payload: peers },
|
|
51
55
|
{ key: OWNER_VIEW_PROJECTION_KEYS.feed, payload: feed },
|
|
52
56
|
{ key: OWNER_VIEW_PROJECTION_KEYS.operations, payload: operations },
|
|
@@ -62,6 +66,15 @@ export class OwnerViewRefreshService {
|
|
|
62
66
|
}]);
|
|
63
67
|
}
|
|
64
68
|
|
|
69
|
+
/** @returns {Promise<void>} */
|
|
70
|
+
async refreshConnections() {
|
|
71
|
+
const value = await this.#network.listConnections();
|
|
72
|
+
await this.#persist([{
|
|
73
|
+
key: OWNER_VIEW_PROJECTION_KEYS.connections,
|
|
74
|
+
payload: [...parseConnections(value)],
|
|
75
|
+
}]);
|
|
76
|
+
}
|
|
77
|
+
|
|
65
78
|
/** @returns {Promise<void>} */
|
|
66
79
|
async refreshPeers() {
|
|
67
80
|
const value = await this.#network.listPeers({});
|
|
@@ -132,6 +145,36 @@ function parsePeers(value) {
|
|
|
132
145
|
});
|
|
133
146
|
}
|
|
134
147
|
|
|
148
|
+
/** @param {unknown} value @returns {readonly ConnectionEntry[]} */
|
|
149
|
+
function parseConnections(value) {
|
|
150
|
+
if (!Array.isArray(value)) throw invalid("connections");
|
|
151
|
+
return value.map((entry, index) => {
|
|
152
|
+
const label = `connections[${index}]`;
|
|
153
|
+
const record = exactRecord(entry, ["address", "consecutiveFailures", "healthy", "id", "ipv6", "isActive", "kind", "lastCheckedAt", "nodeId", "openedAt", "transport"], label);
|
|
154
|
+
if (typeof record.healthy !== "boolean") throw invalid(`${label} healthy`);
|
|
155
|
+
if (typeof record.ipv6 !== "boolean") throw invalid(`${label} ipv6`);
|
|
156
|
+
if (typeof record.isActive !== "boolean") throw invalid(`${label} isActive`);
|
|
157
|
+
if (!Number.isSafeInteger(record.consecutiveFailures) || /** @type {number} */ (record.consecutiveFailures) < 0) {
|
|
158
|
+
throw invalid(`${label} consecutiveFailures`);
|
|
159
|
+
}
|
|
160
|
+
const lastCheckedAt = optionalTimestamp(record.lastCheckedAt, `${label} lastCheckedAt`);
|
|
161
|
+
const openedAt = optionalTimestamp(record.openedAt, `${label} openedAt`);
|
|
162
|
+
return {
|
|
163
|
+
address: requiredString(record.address, `${label} address`),
|
|
164
|
+
consecutiveFailures: /** @type {number} */ (record.consecutiveFailures),
|
|
165
|
+
healthy: record.healthy,
|
|
166
|
+
id: requiredString(record.id, `${label} id`),
|
|
167
|
+
ipv6: record.ipv6,
|
|
168
|
+
isActive: record.isActive,
|
|
169
|
+
kind: oneOf(record.kind, ["direct", "relay"], `${label} kind`),
|
|
170
|
+
...(lastCheckedAt === undefined ? {} : { lastCheckedAt }),
|
|
171
|
+
nodeId: requiredString(record.nodeId, `${label} nodeId`),
|
|
172
|
+
...(openedAt === undefined ? {} : { openedAt }),
|
|
173
|
+
transport: requiredString(record.transport, `${label} transport`),
|
|
174
|
+
};
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
|
|
135
178
|
/** @param {unknown} value @returns {readonly FeedItem[]} */
|
|
136
179
|
function parseFeed(value) {
|
|
137
180
|
if (!Array.isArray(value)) throw invalid("feed");
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
|
|
3
|
+
import { TransportError } from "../errors/index.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {import("../models/owner-views.js").ConnectionEntry} ConnectionEntry
|
|
7
|
+
*/
|
|
3
8
|
/**
|
|
4
9
|
* @typedef {import("../models/owner-views.js").FeedItem} FeedItem
|
|
5
10
|
*/
|
|
@@ -63,6 +68,21 @@ export class OwnerViewService {
|
|
|
63
68
|
: this.#onlineRepository.listFeed(params));
|
|
64
69
|
}
|
|
65
70
|
/**
|
|
71
|
+
* Connections are live transport state read from the online repository, with the local
|
|
72
|
+
* `connections:default` projection as the unreachable-node fallback (mirrors #2440): when the
|
|
73
|
+
* online read fails with a `TransportError` (node offline / path down) the last-known cached
|
|
74
|
+
* rows are returned so first paint still shows connections. Any other error propagates.
|
|
75
|
+
* @returns {Promise<readonly ConnectionEntry[]>}
|
|
76
|
+
*/
|
|
77
|
+
async listConnections() {
|
|
78
|
+
try {
|
|
79
|
+
return await this.#onlineRepository.listConnections();
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (error instanceof TransportError) return await this.#repository.listConnections();
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
66
86
|
* @returns {Promise<readonly OperationalSummary[]>}
|
|
67
87
|
*/
|
|
68
88
|
async readOperational() {
|
|
@@ -5,6 +5,10 @@ import { DomainError } from "../errors/index.js";
|
|
|
5
5
|
const HANDOFF_POLL_INTERVAL_MS = 3000;
|
|
6
6
|
const HANDOFF_TRANSPORT_LOST_POLLS = 2;
|
|
7
7
|
const RECONNECT_POLL_INTERVAL_MS = 4000;
|
|
8
|
+
/** Default deadline for {@link WifiProvisioningService#status}. The node's own wifi-status
|
|
9
|
+
* proxy deadline is 2s, so 3s covers a slow-but-alive answer without stranding the caller much
|
|
10
|
+
* past that. See the doc comment on `status()` for why this exists at all. */
|
|
11
|
+
const STATUS_DEADLINE_MS = 3000;
|
|
8
12
|
export class WifiProvisioningService {
|
|
9
13
|
/**
|
|
10
14
|
* @param {() => boolean} [shouldContinue]
|
|
@@ -45,14 +49,33 @@ export class WifiProvisioningService {
|
|
|
45
49
|
* node side (the join tears down and re-adds the connection) and a handshake flake in that
|
|
46
50
|
* window strands the node back in setup AP mode. The wire values are node-server's
|
|
47
51
|
* `http_status` PascalCase strings; only an explicit `"Connected"` counts.
|
|
52
|
+
*
|
|
53
|
+
* `#node.invoke()` (`PrePairingHomeNodeClient`) issues a bare same-origin `fetch` with no
|
|
54
|
+
* `AbortSignal`/timeout of its own. Without a deadline HERE, a request that never settles — a
|
|
55
|
+
* phone mid-network-switch, a thrashing Pi Zero 2W, exactly the hardware this probe targets —
|
|
56
|
+
* used to hang this call forever, which stranded `OnboardingFlowService#probeStatus()` on
|
|
57
|
+
* step 3's "Checking your node." with `#probing` never clearing and no interactive element
|
|
58
|
+
* rendered (no rescan button — the picker's probing branch `return`s before building one).
|
|
59
|
+
* Racing the delay port caps that: past `deadlineMs` the outcome collapses to `unreachable`,
|
|
60
|
+
* same as every other failure this method already treats as a first-class outcome.
|
|
61
|
+
* @param {number} [deadlineMs] Defaults to {@link STATUS_DEADLINE_MS} (3s — the node's own
|
|
62
|
+
* wifi-status proxy deadline is 2s). `OnboardingFlowService#probeStatus()` passes a shorter
|
|
63
|
+
* value for its single retry: a node that missed the full deadline once is not going to
|
|
64
|
+
* answer within milliseconds, so the retry's own deadline only needs to catch a *transient*
|
|
65
|
+
* miss, not wait out a hung one a second time.
|
|
48
66
|
* @returns {Promise<WifiStatusOutcome>}
|
|
49
67
|
*/
|
|
50
|
-
async status() {
|
|
68
|
+
async status(deadlineMs = STATUS_DEADLINE_MS) {
|
|
51
69
|
try {
|
|
52
|
-
const wire = await
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
70
|
+
const wire = await Promise.race([
|
|
71
|
+
this.#node.invoke({
|
|
72
|
+
operation: "GET /api/v2/wifi/status",
|
|
73
|
+
payload: {},
|
|
74
|
+
}),
|
|
75
|
+
this.#delay.wait(deadlineMs).then(() => {
|
|
76
|
+
throw new Error("wifi status request exceeded its deadline");
|
|
77
|
+
}),
|
|
78
|
+
]);
|
|
56
79
|
if (wire.connection_status !== "Connected")
|
|
57
80
|
return { kind: "not-connected" };
|
|
58
81
|
return {
|