@appport/mobile 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @appport/mobile
2
+
3
+ The lifecycle-aware AppPort client for React Native and Expo. It uses platform `fetch` and `WebSocket`; no native module or Node polyfill is required.
4
+
5
+ ```ts
6
+ import { AppPortMobile } from "@appport/mobile";
7
+
8
+ const app = await AppPortMobile.connect({ url: "https://api.example.com" });
9
+ await app.documents.save({ documentId: "doc_1", content: "mobile" });
10
+ ```
@@ -0,0 +1,66 @@
1
+ import { type CallOptions, type TypedStream, type Unsubscribe } from "@appport/client";
2
+ export type MobileConnectionState = "connecting" | "connected" | "reconnecting" | "disconnected" | "closed";
3
+ export type MobileLifecycleState = "active" | "background" | "inactive" | "unknown" | "extension";
4
+ export interface MobileLifecycle {
5
+ currentState?: MobileLifecycleState | null;
6
+ addEventListener(type: "change", listener: (state: MobileLifecycleState) => void): {
7
+ remove(): void;
8
+ };
9
+ }
10
+ export interface MobileStorage {
11
+ getItem(key: string): Promise<string | null>;
12
+ setItem(key: string, value: string): Promise<void>;
13
+ removeItem?(key: string): Promise<void>;
14
+ }
15
+ export interface MobileConnectOptions {
16
+ url: string;
17
+ headers?: Record<string, string>;
18
+ fetch?: typeof globalThis.fetch;
19
+ WebSocket?: unknown;
20
+ lifecycle?: MobileLifecycle;
21
+ storage?: MobileStorage;
22
+ storageKey?: string;
23
+ sessionId?: string;
24
+ reconnect?: {
25
+ delaysMs?: readonly number[];
26
+ };
27
+ }
28
+ export interface MobileSession {
29
+ sessionId: string;
30
+ applicationId: string;
31
+ connectedAt: string;
32
+ transport: string;
33
+ state: MobileConnectionState;
34
+ }
35
+ export interface MobileCapability {
36
+ (input: unknown, options?: CallOptions): any;
37
+ readonly [namespace: string]: MobileCapability;
38
+ }
39
+ export type MobileAppPort = MobileAppPortClient & Record<string, MobileCapability>;
40
+ export declare class MobileAppPortClient {
41
+ #private;
42
+ readonly connection: {
43
+ state: MobileConnectionState;
44
+ };
45
+ session: MobileSession | undefined;
46
+ private constructor();
47
+ static connect(options: MobileConnectOptions): Promise<MobileAppPort>;
48
+ static discover(options: Omit<MobileConnectOptions, "url"> & {
49
+ origin: string;
50
+ }): Promise<MobileAppPort>;
51
+ get manifest(): import("@appport/protocol").AppPortManifest | undefined;
52
+ onConnectionState(handler: (state: MobileConnectionState) => void): Unsubscribe;
53
+ readonly events: {
54
+ on: (name: string, handler: (payload: unknown, event: unknown) => void) => Promise<Unsubscribe>;
55
+ };
56
+ call<T = unknown>(name: string, input: unknown, options?: CallOptions): Promise<T>;
57
+ stream<T = unknown>(name: string, input: unknown, options?: CallOptions): TypedStream<T>;
58
+ reconnect(): Promise<void>;
59
+ setLifecycleState(state: MobileLifecycleState): Promise<void>;
60
+ close(): Promise<void>;
61
+ }
62
+ export declare const AppPortMobile: {
63
+ connect: typeof MobileAppPortClient.connect;
64
+ discover: typeof MobileAppPortClient.discover;
65
+ };
66
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,182 @@
1
+ import { AppPort } from "@appport/client";
2
+ import { AppPortError } from "@appport/protocol";
3
+ export class MobileAppPortClient {
4
+ connection = { state: "disconnected" };
5
+ session;
6
+ #client;
7
+ #options;
8
+ #subscriptions = new Set();
9
+ #stateListeners = new Set();
10
+ #lifecycleRelease;
11
+ #closed = false;
12
+ #reconnecting;
13
+ constructor(options, client) {
14
+ this.#options = options;
15
+ this.#client = client;
16
+ const lifecycle = options.lifecycle;
17
+ if (lifecycle) {
18
+ const subscription = lifecycle.addEventListener("change", (state) => { void this.setLifecycleState(state); });
19
+ this.#lifecycleRelease = () => subscription.remove();
20
+ }
21
+ }
22
+ static async connect(options) {
23
+ validateOptions(options);
24
+ const sessionId = await resolveSessionId(options);
25
+ const client = await AppPort.discover({ origin: options.url, headers: options.headers, fetch: options.fetch, WebSocket: options.WebSocket, sessionId });
26
+ const mobile = new MobileAppPortClient(options, client);
27
+ mobile.#connected(sessionId);
28
+ return capabilitySurface(mobile);
29
+ }
30
+ static discover(options) {
31
+ return MobileAppPortClient.connect({ ...options, url: options.origin });
32
+ }
33
+ get manifest() { return this.#client.manifest; }
34
+ onConnectionState(handler) {
35
+ this.#stateListeners.add(handler);
36
+ return () => this.#stateListeners.delete(handler);
37
+ }
38
+ events = {
39
+ on: async (name, handler) => {
40
+ const entry = { name, handler };
41
+ entry.release = await this.#client.events.subscribe(name, handler);
42
+ this.#subscriptions.add(entry);
43
+ return () => { entry.release?.(); this.#subscriptions.delete(entry); };
44
+ }
45
+ };
46
+ async call(name, input, options) {
47
+ try {
48
+ return await this.#client.call(name, input, options);
49
+ }
50
+ catch (error) {
51
+ if (!retryable(error) || this.#closed)
52
+ throw error;
53
+ await this.reconnect();
54
+ return this.#client.call(name, input, options);
55
+ }
56
+ }
57
+ stream(name, input, options) {
58
+ const underlying = this.#client.stream(name, input, options);
59
+ const self = this;
60
+ return {
61
+ cancel: (reason) => underlying.cancel(reason),
62
+ async *[Symbol.asyncIterator]() {
63
+ try {
64
+ yield* underlying;
65
+ }
66
+ catch (error) {
67
+ if (retryable(error) && !self.#closed)
68
+ void self.reconnect();
69
+ throw error;
70
+ }
71
+ }
72
+ };
73
+ }
74
+ async reconnect() {
75
+ if (this.#closed)
76
+ throw new AppPortError("CANCELLED", "The mobile client is closed");
77
+ if (this.#reconnecting)
78
+ return this.#reconnecting;
79
+ this.#reconnecting = this.#reconnectLoop().finally(() => { this.#reconnecting = undefined; });
80
+ return this.#reconnecting;
81
+ }
82
+ async #reconnectLoop() {
83
+ this.#setState("reconnecting");
84
+ await this.#client.close().catch(() => undefined);
85
+ const delays = this.#options.reconnect?.delaysMs ?? [1_000, 2_000, 4_000, 8_000, 16_000, 30_000];
86
+ let last;
87
+ for (const delay of [0, ...delays]) {
88
+ if (this.#closed)
89
+ return;
90
+ if (delay)
91
+ await wait(delay);
92
+ try {
93
+ const sessionId = await resolveSessionId(this.#options);
94
+ this.#client = await AppPort.discover({ origin: this.#options.url, headers: this.#options.headers, fetch: this.#options.fetch, WebSocket: this.#options.WebSocket, sessionId });
95
+ for (const entry of this.#subscriptions)
96
+ entry.release = await this.#client.events.subscribe(entry.name, entry.handler);
97
+ this.#connected(sessionId);
98
+ return;
99
+ }
100
+ catch (error) {
101
+ last = error;
102
+ }
103
+ }
104
+ this.#setState("disconnected");
105
+ throw new AppPortError("INTERNAL_ERROR", "Mobile reconnect attempts were exhausted", { retryable: true, cause: last });
106
+ }
107
+ async setLifecycleState(state) {
108
+ if (state === "active") {
109
+ if (!this.#closed && this.connection.state !== "connected")
110
+ await this.reconnect();
111
+ return;
112
+ }
113
+ if (state === "background" || state === "inactive") {
114
+ await this.#client.close();
115
+ this.#setState("disconnected");
116
+ }
117
+ }
118
+ async close() {
119
+ this.#closed = true;
120
+ this.#lifecycleRelease?.();
121
+ for (const entry of this.#subscriptions)
122
+ entry.release?.();
123
+ this.#subscriptions.clear();
124
+ await this.#client.close();
125
+ this.#setState("closed");
126
+ }
127
+ #connected(sessionId) {
128
+ this.#setState("connected");
129
+ this.session = { sessionId, applicationId: this.#client.manifest.application.id, connectedAt: new Date().toISOString(), transport: this.#client.transport.kind, state: "connected" };
130
+ }
131
+ #setState(state) {
132
+ this.connection.state = state;
133
+ if (this.session)
134
+ this.session.state = state;
135
+ for (const listener of this.#stateListeners)
136
+ listener(state);
137
+ }
138
+ }
139
+ function capabilitySurface(client) {
140
+ return new Proxy(client, {
141
+ get(target, property, receiver) {
142
+ // An async factory resolves its return value as a thenable. Capability
143
+ // namespaces must never synthesize a `then` property.
144
+ if (property === "then")
145
+ return undefined;
146
+ if (typeof property !== "string" || property in target) {
147
+ const value = Reflect.get(target, property, receiver);
148
+ return typeof value === "function" ? value.bind(target) : value;
149
+ }
150
+ return capabilityProxy(target, [property]);
151
+ }
152
+ });
153
+ }
154
+ function capabilityProxy(client, path) {
155
+ const invoke = (input, options) => {
156
+ const name = path.join(".");
157
+ return client.manifest?.capabilities.find((entry) => entry.name === name)?.kind === "stream" ? client.stream(name, input, options) : client.call(name, input, options);
158
+ };
159
+ return new Proxy(invoke, { get: (_target, property) => typeof property === "string" ? capabilityProxy(client, [...path, property]) : undefined, apply: (_target, _this, args) => invoke(args[0], args[1]) });
160
+ }
161
+ function validateOptions(options) {
162
+ const url = new URL(options.url);
163
+ if (url.protocol !== "https:" && url.protocol !== "http:")
164
+ throw new AppPortError("INVALID_REQUEST", "Mobile AppPort URLs must use http or https");
165
+ }
166
+ async function resolveSessionId(options, replace = false) {
167
+ if (options.sessionId && !replace)
168
+ return options.sessionId;
169
+ const key = options.storageKey ?? "appport.mobile.session";
170
+ if (!replace) {
171
+ const stored = await options.storage?.getItem(key);
172
+ if (stored)
173
+ return stored;
174
+ }
175
+ const id = `ses_${globalThis.crypto?.randomUUID?.().replaceAll("-", "") ?? Math.random().toString(36).slice(2)}`;
176
+ await options.storage?.setItem(key, id);
177
+ return id;
178
+ }
179
+ const retryable = (error) => error instanceof AppPortError && (error.retryable || error.code === "STREAM_ERROR" || error.code === "INTERNAL_ERROR");
180
+ const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
181
+ export const AppPortMobile = { connect: MobileAppPortClient.connect, discover: MobileAppPortClient.discover };
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@appport/mobile",
3
+ "version": "1.0.0",
4
+ "description": "Lifecycle-aware AppPort client for React Native, Expo, iOS and Android.",
5
+ "license": "Apache-2.0",
6
+ "repository": { "type": "git", "url": "git+https://github.com/rkendel1/appport.git", "directory": "packages/mobile" },
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "react-native": "./dist/index.js",
11
+ "sideEffects": false,
12
+ "exports": {
13
+ ".": {
14
+ "react-native": "./dist/index.js",
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "README.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -b",
26
+ "clean": "tsc -b --clean"
27
+ },
28
+ "dependencies": {
29
+ "@appport/client": "1.0.0",
30
+ "@appport/protocol": "1.0.0"
31
+ },
32
+ "publishConfig": { "access": "public" }
33
+ }