@latchway/react-native 0.0.0-bootstrap.0 → 1.1.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/LatchwayReactNative.podspec +33 -0
  3. package/NOTICE +7 -0
  4. package/README.md +293 -3
  5. package/SECURITY.md +69 -0
  6. package/android/build.gradle.kts +62 -0
  7. package/android/consumer-rules.pro +2 -0
  8. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  9. package/android/gradle/wrapper/gradle-wrapper.properties +9 -0
  10. package/android/gradle.properties +4 -0
  11. package/android/gradlew +251 -0
  12. package/android/gradlew.bat +94 -0
  13. package/android/settings.gradle.kts +33 -0
  14. package/android/src/main/AndroidManifest.xml +3 -0
  15. package/android/src/main/java/dev/latchway/reactnative/LatchwayReactNativePackage.kt +25 -0
  16. package/android/src/main/java/dev/latchway/reactnative/NativeLatchwayModule.kt +964 -0
  17. package/android/src/test/java/dev/latchway/reactnative/NativeLatchwayModuleTest.kt +521 -0
  18. package/babel.cjs +22 -0
  19. package/babel.d.cts +7 -0
  20. package/contract.lock +7 -0
  21. package/docs/architecture.md +145 -0
  22. package/docs/conformance.md +68 -0
  23. package/docs/langchain.md +135 -0
  24. package/docs/native-installation.md +172 -0
  25. package/docs/physical-device-evidence.md +559 -0
  26. package/docs/releasing.md +360 -0
  27. package/docs/security.md +55 -0
  28. package/ios/LatchwayNativeBridge.swift +1551 -0
  29. package/ios/RCTNativeLatchway.h +9 -0
  30. package/ios/RCTNativeLatchway.mm +175 -0
  31. package/lib/client.d.ts +29 -0
  32. package/lib/client.d.ts.map +1 -0
  33. package/lib/client.js +939 -0
  34. package/lib/client.js.map +1 -0
  35. package/lib/component-client.d.ts +15 -0
  36. package/lib/component-client.d.ts.map +1 -0
  37. package/lib/component-client.js +141 -0
  38. package/lib/component-client.js.map +1 -0
  39. package/lib/config.d.ts +25 -0
  40. package/lib/config.d.ts.map +1 -0
  41. package/lib/config.js +261 -0
  42. package/lib/config.js.map +1 -0
  43. package/lib/coordinator.d.ts +19 -0
  44. package/lib/coordinator.d.ts.map +1 -0
  45. package/lib/coordinator.js +167 -0
  46. package/lib/coordinator.js.map +1 -0
  47. package/lib/errors.d.ts +5 -0
  48. package/lib/errors.d.ts.map +1 -0
  49. package/lib/errors.js +201 -0
  50. package/lib/errors.js.map +1 -0
  51. package/lib/index.d.ts +8 -0
  52. package/lib/index.d.ts.map +1 -0
  53. package/lib/index.js +13 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/native/NativeLatchway.d.ts +25 -0
  56. package/lib/native/NativeLatchway.d.ts.map +1 -0
  57. package/lib/native/NativeLatchway.js +3 -0
  58. package/lib/native/NativeLatchway.js.map +1 -0
  59. package/lib/native/bridge.d.ts +5 -0
  60. package/lib/native/bridge.d.ts.map +1 -0
  61. package/lib/native/bridge.js +17 -0
  62. package/lib/native/bridge.js.map +1 -0
  63. package/lib/native-output.d.ts +3 -0
  64. package/lib/native-output.d.ts.map +1 -0
  65. package/lib/native-output.js +43 -0
  66. package/lib/native-output.js.map +1 -0
  67. package/lib/polyfills.d.ts +8 -0
  68. package/lib/polyfills.d.ts.map +1 -0
  69. package/lib/polyfills.js +56 -0
  70. package/lib/polyfills.js.map +1 -0
  71. package/lib/request-id.d.ts +2 -0
  72. package/lib/request-id.d.ts.map +1 -0
  73. package/lib/request-id.js +5 -0
  74. package/lib/request-id.js.map +1 -0
  75. package/lib/runtime-symbols.d.ts +2 -0
  76. package/lib/runtime-symbols.d.ts.map +1 -0
  77. package/lib/runtime-symbols.js +9 -0
  78. package/lib/runtime-symbols.js.map +1 -0
  79. package/lib/testing.d.ts +7 -0
  80. package/lib/testing.d.ts.map +1 -0
  81. package/lib/testing.js +9 -0
  82. package/lib/testing.js.map +1 -0
  83. package/lib/types.d.ts +200 -0
  84. package/lib/types.d.ts.map +1 -0
  85. package/lib/types.js +2 -0
  86. package/lib/types.js.map +1 -0
  87. package/lib/version.d.ts +8 -0
  88. package/lib/version.d.ts.map +1 -0
  89. package/lib/version.js +8 -0
  90. package/lib/version.js.map +1 -0
  91. package/package.json +152 -6
  92. package/react-native.config.cjs +7 -0
  93. package/release-compatibility.json +64 -0
  94. package/src/client.ts +1022 -0
  95. package/src/component-client.ts +158 -0
  96. package/src/config.ts +368 -0
  97. package/src/coordinator.ts +195 -0
  98. package/src/errors.ts +225 -0
  99. package/src/index.ts +53 -0
  100. package/src/native/NativeLatchway.ts +75 -0
  101. package/src/native/bridge.ts +23 -0
  102. package/src/native-output.ts +43 -0
  103. package/src/polyfills.ts +50 -0
  104. package/src/request-id.ts +5 -0
  105. package/src/runtime-symbols.ts +9 -0
  106. package/src/testing.ts +11 -0
  107. package/src/types.ts +241 -0
  108. package/src/version.ts +7 -0
@@ -0,0 +1,167 @@
1
+ import { LatchwayError } from "@latchway/client";
2
+ import { fromNativeError, nativeUnavailable } from "./errors.js";
3
+ import { assertNoCredentialFields } from "./native-output.js";
4
+ import { nativeModule } from "./native/bridge.js";
5
+ import { CONTRACT_VERSION, PROTOCOL_VERSION, SDK_VERSION } from "./version.js";
6
+ const entries = new Map();
7
+ const componentEntries = new Map();
8
+ const moduleIDs = new WeakMap();
9
+ let nextModuleID = 1;
10
+ let nextClientID = 1;
11
+ export async function acquire(config) {
12
+ let module;
13
+ try {
14
+ module = await nativeModule();
15
+ }
16
+ catch (cause) {
17
+ throw nativeUnavailable(cause);
18
+ }
19
+ const moduleID = identityFor(module);
20
+ const key = `${moduleID}|${config.scope}`;
21
+ const existing = entries.get(key);
22
+ if (existing !== undefined) {
23
+ if (existing.fingerprint !== config.fingerprint) {
24
+ throw new LatchwayError("client_configuration_invalid", "Conflicting Latchway native configuration is active for this application scope.");
25
+ }
26
+ existing.references += 1;
27
+ return lease(entries, key, existing);
28
+ }
29
+ const clientID = `latchway-rn-${nextClientID++}`;
30
+ const entry = {
31
+ clientID,
32
+ fingerprint: config.fingerprint,
33
+ module,
34
+ references: 1,
35
+ ready: Promise.resolve({
36
+ platform: "react_native_ios",
37
+ nativeSDKVersion: "",
38
+ contractVersion: "",
39
+ protocolVersion: 0,
40
+ }),
41
+ };
42
+ entry.ready = module.configure(clientID, config.nativeJSON)
43
+ .then(parseCompatibility)
44
+ .catch(async (cause) => {
45
+ if (entries.get(key) === entry)
46
+ entries.delete(key);
47
+ // configure may have created native state before compatibility parsing
48
+ // failed. Disposal is idempotent on both bridges and its failure must not
49
+ // hide the original configuration error.
50
+ try {
51
+ await module.dispose(clientID);
52
+ }
53
+ catch { /* preserve the original failure */ }
54
+ throw fromNativeError(cause);
55
+ });
56
+ entries.set(key, entry);
57
+ return lease(entries, key, entry);
58
+ }
59
+ export async function acquireComponent(config) {
60
+ let module;
61
+ try {
62
+ module = await nativeModule();
63
+ }
64
+ catch (cause) {
65
+ throw nativeUnavailable(cause);
66
+ }
67
+ const moduleID = identityFor(module);
68
+ const key = `${moduleID}|component|${config.scope}`;
69
+ const existing = componentEntries.get(key);
70
+ if (existing !== undefined) {
71
+ if (existing.fingerprint !== config.fingerprint) {
72
+ throw new LatchwayError("client_configuration_invalid", "Conflicting Latchway component configuration is active for this extension scope.");
73
+ }
74
+ existing.references += 1;
75
+ return lease(componentEntries, key, existing);
76
+ }
77
+ const clientID = `latchway-rn-component-${nextClientID++}`;
78
+ const entry = {
79
+ clientID,
80
+ fingerprint: config.fingerprint,
81
+ module,
82
+ references: 1,
83
+ ready: emptyCompatibility(),
84
+ };
85
+ entry.ready = module.configureComponent(clientID, config.nativeJSON, config.componentJSON)
86
+ .then(parseCompatibility)
87
+ .catch(async (cause) => {
88
+ if (componentEntries.get(key) === entry)
89
+ componentEntries.delete(key);
90
+ try {
91
+ await module.dispose(clientID);
92
+ }
93
+ catch { /* preserve the original failure */ }
94
+ throw fromNativeError(cause);
95
+ });
96
+ componentEntries.set(key, entry);
97
+ return lease(componentEntries, key, entry);
98
+ }
99
+ function lease(owner, key, entry) {
100
+ let released = false;
101
+ return {
102
+ clientID: entry.clientID,
103
+ module: entry.module,
104
+ ready: entry.ready,
105
+ async release() {
106
+ if (released)
107
+ return;
108
+ released = true;
109
+ entry.references -= 1;
110
+ if (entry.references !== 0 || owner.get(key) !== entry)
111
+ return;
112
+ owner.delete(key);
113
+ try {
114
+ await entry.ready;
115
+ await entry.module.dispose(entry.clientID);
116
+ }
117
+ catch (cause) {
118
+ throw fromNativeError(cause);
119
+ }
120
+ },
121
+ };
122
+ }
123
+ function emptyCompatibility() {
124
+ return Promise.resolve({
125
+ platform: "react_native_ios",
126
+ nativeSDKVersion: "",
127
+ contractVersion: "",
128
+ protocolVersion: 0,
129
+ });
130
+ }
131
+ function parseCompatibility(encoded) {
132
+ const value = parseRecord(encoded, "native compatibility");
133
+ assertNoCredentialFields(value);
134
+ if (!hasOnlyKeys(value, ["platform", "nativeSDKVersion", "contractVersion", "protocolVersion"]) ||
135
+ (value.platform !== "react_native_ios" && value.platform !== "react_native_android") ||
136
+ typeof value.nativeSDKVersion !== "string" || value.nativeSDKVersion.length === 0 ||
137
+ value.nativeSDKVersion.length > 128 || /\p{Cc}/u.test(value.nativeSDKVersion) ||
138
+ value.contractVersion !== CONTRACT_VERSION || value.protocolVersion !== PROTOCOL_VERSION) {
139
+ throw new LatchwayError("protocol_response_invalid", `The native Latchway SDK is incompatible with JavaScript SDK ${SDK_VERSION}.`);
140
+ }
141
+ return value;
142
+ }
143
+ function hasOnlyKeys(value, names) {
144
+ const expected = new Set(names);
145
+ return Object.keys(value).every((name) => expected.has(name));
146
+ }
147
+ function parseRecord(encoded, label) {
148
+ try {
149
+ const value = JSON.parse(encoded);
150
+ if (typeof value === "object" && value !== null && !Array.isArray(value)) {
151
+ return value;
152
+ }
153
+ }
154
+ catch {
155
+ // Report only a stable protocol error; native output may contain sensitive detail.
156
+ }
157
+ throw new LatchwayError("protocol_response_invalid", `Latchway returned invalid ${label}.`);
158
+ }
159
+ function identityFor(module) {
160
+ const existing = moduleIDs.get(module);
161
+ if (existing !== undefined)
162
+ return existing;
163
+ const value = nextModuleID++;
164
+ moduleIDs.set(module, value);
165
+ return value;
166
+ }
167
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../src/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { LatchwayError } from "@latchway/client";
2
+ export declare function fromNativeError(value: unknown): Error;
3
+ export declare function nativeUnavailable(cause: unknown): LatchwayError;
4
+ export declare function abortError(): Error;
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA4FjD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAiErD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAM/D;AAED,wBAAgB,UAAU,IAAI,KAAK,CAKlC"}
package/lib/errors.js ADDED
@@ -0,0 +1,201 @@
1
+ import { LatchwayError } from "@latchway/client";
2
+ import { isCanonicalRequestID } from "./request-id.js";
3
+ import { assertNoCredentialFields } from "./native-output.js";
4
+ const knownCodeMap = {
5
+ request_invalid: true,
6
+ identity_token_missing: true,
7
+ identity_token_invalid: true,
8
+ identity_token_expired: true,
9
+ identity_reauthentication_required: true,
10
+ attestation_required: true,
11
+ attestation_unsupported: true,
12
+ attestation_invalid: true,
13
+ attestation_stale: true,
14
+ attestation_step_up_required: true,
15
+ dpop_missing: true,
16
+ dpop_invalid: true,
17
+ dpop_replayed: true,
18
+ dpop_nonce_required: true,
19
+ session_expired: true,
20
+ session_revoked: true,
21
+ refresh_token_reused: true,
22
+ installation_revoked: true,
23
+ installation_family_revoked: true,
24
+ installation_family_not_found: true,
25
+ component_definition_not_found: true,
26
+ component_not_configured: true,
27
+ component_not_provisioned: true,
28
+ component_revoked: true,
29
+ component_key_invalid: true,
30
+ component_key_replaced: true,
31
+ component_delegation_expired: true,
32
+ component_feature_not_granted: true,
33
+ component_parent_trust_expired: true,
34
+ component_direct_attestation_required: true,
35
+ containing_app_setup_required: true,
36
+ framework_integration_unsupported: true,
37
+ framework_version_unsupported: true,
38
+ transport_destination_not_allowed: true,
39
+ transport_request_not_replayable: true,
40
+ feature_not_found: true,
41
+ feature_not_allowed: true,
42
+ model_not_allowed: true,
43
+ quota_exceeded: true,
44
+ concurrency_exceeded: true,
45
+ output_limit_exceeded: true,
46
+ pricing_unavailable: true,
47
+ route_not_found: true,
48
+ upstream_unavailable: true,
49
+ upstream_timeout: true,
50
+ upstream_protocol_error: true,
51
+ configuration_invalid: true,
52
+ server_not_ready: true,
53
+ protocol_version_unsupported: true,
54
+ authentication_required: true,
55
+ permission_denied: true,
56
+ resource_not_found: true,
57
+ conflict: true,
58
+ etag_required: true,
59
+ etag_mismatch: true,
60
+ bootstrap_disabled: true,
61
+ rate_limited: true,
62
+ operation_indeterminate: true,
63
+ internal_error: true,
64
+ client_configuration_invalid: true,
65
+ storage_unavailable: true,
66
+ crypto_unavailable: true,
67
+ attestation_provider_missing: true,
68
+ protocol_response_invalid: true,
69
+ request_not_replayable: true,
70
+ network_error: true,
71
+ };
72
+ const knownCodes = new Set(Object.keys(knownCodeMap));
73
+ const localCodeMap = {
74
+ cancelled: "network_error",
75
+ invalid_configuration: "client_configuration_invalid",
76
+ invalid_request: "request_invalid",
77
+ key_unavailable: "crypto_unavailable",
78
+ secure_enclave_unavailable: "crypto_unavailable",
79
+ secure_state_unavailable: "storage_unavailable",
80
+ key_storage_failure: "storage_unavailable",
81
+ response_invalid: "protocol_response_invalid",
82
+ invalid_server_response: "protocol_response_invalid",
83
+ network_unavailable: "network_error",
84
+ transport_failure: "network_error",
85
+ session_unavailable: "session_expired",
86
+ attestation_unavailable: "attestation_unsupported",
87
+ };
88
+ export function fromNativeError(value) {
89
+ try {
90
+ assertNoCredentialFields(value);
91
+ }
92
+ catch (cause) {
93
+ return cause instanceof LatchwayError
94
+ ? cause
95
+ : new LatchwayError("protocol_response_invalid", "Latchway returned unsafe native error metadata.");
96
+ }
97
+ if (isAbortError(value))
98
+ return abortError();
99
+ const record = isRecord(value) ? value : {};
100
+ const userInfo = isRecord(record.userInfo) ? record.userInfo : {};
101
+ const rawCode = firstString(record.code, userInfo.code);
102
+ const mapped = rawCode === undefined
103
+ ? "internal_error"
104
+ : localCodeMap[rawCode] ?? (knownCodes.has(rawCode)
105
+ ? rawCode
106
+ : "internal_error");
107
+ const codeValues = presentValues(record, userInfo, ["code"]);
108
+ const requestIDValues = presentValues(record, userInfo, ["requestID", "request_id"]);
109
+ const requestIDCandidate = firstString(record.requestID, record.request_id, userInfo.requestID, userInfo.request_id);
110
+ const requestID = isCanonicalRequestID(requestIDCandidate) ? requestIDCandidate : undefined;
111
+ const statusValues = presentValues(record, userInfo, ["status"]);
112
+ const status = safeStatus(record.status ?? userInfo.status);
113
+ const retryableValues = presentValues(record, userInfo, ["retryable"]);
114
+ const retryable = record.retryable === true || userInfo.retryable === true;
115
+ const documentationURLValues = presentValues(record, userInfo, ["documentationURL", "documentation_url"]);
116
+ const canonicalNativeDocumentationURL = rawCode !== undefined && isNativeErrorCode(rawCode)
117
+ ? `https://docs.latchway.dev/errors/${rawCode.replaceAll("_", "-")}`
118
+ : undefined;
119
+ const documentationURLIsValid = documentationURLValues.length > 0 &&
120
+ canonicalNativeDocumentationURL !== undefined &&
121
+ documentationURLValues.every((candidate) => candidate === canonicalNativeDocumentationURL);
122
+ const operationValues = presentValues(record, userInfo, ["operationID", "operation_id"]);
123
+ const operationID = operationValues.length > 0 &&
124
+ operationValues.every((candidate) => candidate === operationValues[0]) &&
125
+ isCanonicalOperationID(operationValues[0])
126
+ ? operationValues[0]
127
+ : undefined;
128
+ const validIndeterminateMetadata = operationID !== undefined && requestID !== undefined &&
129
+ status === 503 && retryable && codeValues.length > 0 &&
130
+ codeValues.every((candidate) => candidate === "operation_indeterminate") &&
131
+ requestIDValues.length > 0 && requestIDValues.every((candidate) => candidate === requestID) &&
132
+ statusValues.length > 0 && statusValues.every((candidate) => candidate === 503) &&
133
+ retryableValues.length > 0 && retryableValues.every((candidate) => candidate === true);
134
+ const hasServerMetadata = requestIDValues.length > 0 || statusValues.length > 0;
135
+ if ((documentationURLValues.length > 0 && !documentationURLIsValid) ||
136
+ (hasServerMetadata && !documentationURLIsValid) ||
137
+ (mapped === "operation_indeterminate" && !validIndeterminateMetadata) ||
138
+ (mapped !== "operation_indeterminate" && operationValues.length > 0)) {
139
+ return new LatchwayError("protocol_response_invalid", "Latchway returned invalid native error metadata.", { requestID, status });
140
+ }
141
+ return new LatchwayError(mapped, safeMessage(firstString(record.message, userInfo.message)), {
142
+ requestID,
143
+ status,
144
+ retryable,
145
+ operationID,
146
+ });
147
+ }
148
+ export function nativeUnavailable(cause) {
149
+ return new LatchwayError("client_configuration_invalid", "The Latchway native module is unavailable. Rebuild the application after installing the SDK.", { cause });
150
+ }
151
+ export function abortError() {
152
+ if (typeof DOMException === "function")
153
+ return new DOMException("The operation was aborted.", "AbortError");
154
+ const error = new Error("The operation was aborted.");
155
+ error.name = "AbortError";
156
+ return error;
157
+ }
158
+ function isAbortError(value) {
159
+ if (!isRecord(value))
160
+ return false;
161
+ const code = firstString(value.code, value.name);
162
+ return code === "cancelled" || code === "E_ABORTED" || code === "AbortError";
163
+ }
164
+ function safeMessage(value) {
165
+ if (value === undefined || value.length === 0)
166
+ return "The Latchway native operation failed.";
167
+ const bounded = value.replace(/\p{Cc}/gu, " ").slice(0, 512);
168
+ if (/eyJ|lwa_|lws_|refresh.?token|identity.?token|integrity.?token|[A-Za-z0-9_-]{64,}/iu.test(bounded)) {
169
+ return "Sensitive native error detail was redacted.";
170
+ }
171
+ return bounded;
172
+ }
173
+ function safeStatus(value) {
174
+ return Number.isInteger(value) && value >= 100 && value <= 599
175
+ ? value
176
+ : undefined;
177
+ }
178
+ function firstString(...values) {
179
+ return values.find((value) => typeof value === "string");
180
+ }
181
+ function presentValues(record, userInfo, keys) {
182
+ const values = [];
183
+ for (const source of [record, userInfo]) {
184
+ for (const key of keys) {
185
+ const candidate = source[key];
186
+ if (Object.hasOwn(source, key) && candidate !== undefined && candidate !== null)
187
+ values.push(candidate);
188
+ }
189
+ }
190
+ return values;
191
+ }
192
+ function isCanonicalOperationID(value) {
193
+ return typeof value === "string" && /^arq_[0-7][0-9A-HJKMNPQRSTVWXYZ]{25}$/u.test(value);
194
+ }
195
+ function isNativeErrorCode(value) {
196
+ return /^[a-z][a-z0-9_]{0,62}$/u.test(value);
197
+ }
198
+ function isRecord(value) {
199
+ return typeof value === "object" && value !== null && !Array.isArray(value);
200
+ }
201
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { LatchwayClient, LatchwayComponentClient, LatchwayComponentOptions, LatchwayOptions } from "./types.js";
2
+ export { errorFromResponse, LatchwayError } from "@latchway/client";
3
+ export { CONTRACT_VERSION, PROTOCOL_VERSION, SDK_KIND, SDK_VERSION, SUPPORTED_PROTOCOL_VERSIONS, } from "./version.js";
4
+ export type { AndroidKeyPolicy, AndroidSecurityOptions, AppleSecurityOptions, AppleSoftwareKeyFallbackPolicy, FetchImplementation, GetIdentityToken, IdentityTokenProvider, LatchwayClient, LatchwayComponentClient, LatchwayComponentOptions, LatchwayFetchInit, LatchwayFetch, LatchwayOptions, QuotaLimit, QuotaSnapshot, ReactNativeComponentDiagnostics, ReactNativeComponentAppleOptions, ReactNativeComponentTrustSource, ReactNativeDiagnostics, ReactNativeIOSComponent, ReactNativeIOSComponentKind, ReactNativeDirectAttestationComponent, ReactNativeDirectAttestationComponentKind, ReactNativePlatform, } from "./types.js";
5
+ export declare function createLatchwayClient(options: LatchwayOptions): LatchwayClient;
6
+ /** Creates a client only for JavaScript executing inside the signed iOS extension bundle. */
7
+ export declare function createLatchwayComponentClient(options: LatchwayComponentOptions): LatchwayComponentClient;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,8BAA8B,EAC9B,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,UAAU,EACV,aAAa,EACb,+BAA+B,EAC/B,gCAAgC,EAChC,+BAA+B,EAC/B,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAC3B,qCAAqC,EACrC,yCAAyC,EACzC,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAE7E;AAED,6FAA6F;AAC7F,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB,CAExG"}
package/lib/index.js ADDED
@@ -0,0 +1,13 @@
1
+ import { DefaultLatchwayClient } from "./client.js";
2
+ import { DefaultLatchwayComponentClient } from "./component-client.js";
3
+ import { configure, configureComponent } from "./config.js";
4
+ export { errorFromResponse, LatchwayError } from "@latchway/client";
5
+ export { CONTRACT_VERSION, PROTOCOL_VERSION, SDK_KIND, SDK_VERSION, SUPPORTED_PROTOCOL_VERSIONS, } from "./version.js";
6
+ export function createLatchwayClient(options) {
7
+ return new DefaultLatchwayClient(configure(options));
8
+ }
9
+ /** Creates a client only for JavaScript executing inside the signed iOS extension bundle. */
10
+ export function createLatchwayComponentClient(options) {
11
+ return new DefaultLatchwayComponentClient(configureComponent(options));
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAQ5D,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,2BAA2B,GAC5B,MAAM,cAAc,CAAC;AA4BtB,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,OAAO,IAAI,qBAAqB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,6BAA6B,CAAC,OAAiC;IAC7E,OAAO,IAAI,8BAA8B,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { TurboModule } from "react-native";
2
+ export interface Spec extends TurboModule {
3
+ configure(clientID: string, configurationJSON: string): Promise<string>;
4
+ configureComponent(clientID: string, configurationJSON: string, componentJSON: string): Promise<string>;
5
+ startRequest(clientID: string, operationID: string, identityToken: string, requestJSON: string): Promise<string>;
6
+ readResponseChunk(clientID: string, operationID: string, responseID: string, maximumBytes: number): Promise<string>;
7
+ closeResponse(clientID: string, responseID: string): Promise<void>;
8
+ refresh(clientID: string, operationID: string, identityToken: string): Promise<void>;
9
+ quota(clientID: string, operationID: string, identityToken: string, feature: string): Promise<string>;
10
+ diagnostics(clientID: string, operationID: string, identityToken: string): Promise<string>;
11
+ establishDirectAttestation(clientID: string, operationID: string): Promise<void>;
12
+ componentDiagnostics(clientID: string, operationID: string): Promise<string>;
13
+ prepareComponents(clientID: string, operationID: string, identityToken: string, componentsJSON: string): Promise<string>;
14
+ replaceComponent(clientID: string, operationID: string, identityToken: string, componentJSON: string): Promise<string>;
15
+ rootComponentDiagnostics(clientID: string, operationID: string, componentJSON: string): Promise<string>;
16
+ revokeComponent(clientID: string, operationID: string, identityToken: string, componentJSON: string): Promise<void>;
17
+ revoke(clientID: string, operationID: string, identityToken: string): Promise<void>;
18
+ revokeFamily(clientID: string, operationID: string, identityToken: string): Promise<void>;
19
+ revokeFamilyWithComponents(clientID: string, operationID: string, identityToken: string, componentsJSON: string): Promise<void>;
20
+ cancel(clientID: string, operationID: string): void;
21
+ dispose(clientID: string): Promise<void>;
22
+ }
23
+ declare const _default: Spec;
24
+ export default _default;
25
+ //# sourceMappingURL=NativeLatchway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeLatchway.d.ts","sourceRoot":"","sources":["../../src/native/NativeLatchway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { TurboModuleRegistry } from "react-native";
2
+ export default TurboModuleRegistry.getEnforcing("NativeLatchway");
3
+ //# sourceMappingURL=NativeLatchway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeLatchway.js","sourceRoot":"","sources":["../../src/native/NativeLatchway.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAyEnD,eAAe,mBAAmB,CAAC,YAAY,CAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Spec } from "./NativeLatchway.js";
2
+ export type NativeLatchwayModule = Spec;
3
+ export declare function nativeModule(): Promise<NativeLatchwayModule>;
4
+ export declare function setTestingNativeModule(module: NativeLatchwayModule | undefined): void;
5
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/native/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAIxC,wBAAsB,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAYlE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI,CAErF"}
@@ -0,0 +1,17 @@
1
+ let testingModule;
2
+ export async function nativeModule() {
3
+ if (testingModule !== undefined)
4
+ return testingModule;
5
+ try {
6
+ return (await import("./NativeLatchway.js")).default;
7
+ }
8
+ catch (cause) {
9
+ const error = new Error("The Latchway TurboModule is unavailable. Rebuild the native application after installing @latchway/react-native.", { cause });
10
+ error.name = "LatchwayNativeModuleUnavailable";
11
+ throw error;
12
+ }
13
+ }
14
+ export function setTestingNativeModule(module) {
15
+ testingModule = module;
16
+ }
17
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/native/bridge.ts"],"names":[],"mappings":"AAIA,IAAI,aAA+C,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,aAAa,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IACtD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,kHAAkH,EAClH,EAAE,KAAK,EAAE,CACV,CAAC;QACF,KAAK,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC/C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAAwC;IAC7E,aAAa,GAAG,MAAM,CAAC;AACzB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Fails closed when a native return or rejection envelope names credential material. */
2
+ export declare function assertNoCredentialFields(value: unknown): void;
3
+ //# sourceMappingURL=native-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-output.d.ts","sourceRoot":"","sources":["../src/native-output.ts"],"names":[],"mappings":"AAqBA,yFAAyF;AACzF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAI7D"}
@@ -0,0 +1,43 @@
1
+ import { LatchwayError } from "@latchway/client";
2
+ const forbiddenCredentialKeyFragments = [
3
+ "authorization",
4
+ "dpop",
5
+ "accesstoken",
6
+ "refreshtoken",
7
+ "privatekey",
8
+ "sessiontoken",
9
+ "identitytoken",
10
+ "integritytoken",
11
+ "attestationevidence",
12
+ "clientdatahash",
13
+ "requesthash",
14
+ "credential",
15
+ "secret",
16
+ "jwk",
17
+ ];
18
+ const forbiddenExactCredentialKeys = new Set(["key", "proof", "token"]);
19
+ /** Fails closed when a native return or rejection envelope names credential material. */
20
+ export function assertNoCredentialFields(value) {
21
+ if (containsCredentialField(value)) {
22
+ throw new LatchwayError("protocol_response_invalid", "Latchway native output crossed the credential boundary.");
23
+ }
24
+ }
25
+ function containsCredentialField(value) {
26
+ if (Array.isArray(value))
27
+ return value.some(containsCredentialField);
28
+ if (!isRecord(value))
29
+ return false;
30
+ for (const [key, item] of Object.entries(value)) {
31
+ const compact = key.replace(/[^A-Za-z0-9]/gu, "").toLowerCase();
32
+ if (forbiddenExactCredentialKeys.has(compact) ||
33
+ forbiddenCredentialKeyFragments.some((fragment) => compact.includes(fragment)))
34
+ return true;
35
+ if (containsCredentialField(item))
36
+ return true;
37
+ }
38
+ return false;
39
+ }
40
+ function isRecord(value) {
41
+ return typeof value === "object" && value !== null && !Array.isArray(value);
42
+ }
43
+ //# sourceMappingURL=native-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-output.js","sourceRoot":"","sources":["../src/native-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,+BAA+B,GAAG;IACtC,eAAe;IACf,MAAM;IACN,aAAa;IACb,cAAc;IACd,YAAY;IACZ,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,qBAAqB;IACrB,gBAAgB;IAChB,aAAa;IACb,YAAY;IACZ,QAAQ;IACR,KAAK;CACG,CAAC;AAEX,MAAM,4BAA4B,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAExE,yFAAyF;AACzF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,aAAa,CAAC,2BAA2B,EAAE,yDAAyD,CAAC,CAAC;IAClH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChE,IAAI,4BAA4B,CAAC,GAAG,CAAC,OAAO,CAAC;YACzC,+BAA+B,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAChG,IAAI,uBAAuB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Explicit, opt-in React Native compatibility bootstrap. Import this before
3
+ * LangChain or any SDK/stream dependency. The ordinary SDK entry has no global
4
+ * initialization side effects. Native keys and attestation are never polyfilled.
5
+ */
6
+ import "./runtime-symbols.js";
7
+ import "react-native-get-random-values";
8
+ //# sourceMappingURL=polyfills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polyfills.d.ts","sourceRoot":"","sources":["../src/polyfills.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,sBAAsB,CAAC;AAC9B,OAAO,gCAAgC,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Explicit, opt-in React Native compatibility bootstrap. Import this before
3
+ * LangChain or any SDK/stream dependency. The ordinary SDK entry has no global
4
+ * initialization side effects. Native keys and attestation are never polyfilled.
5
+ */
6
+ import "./runtime-symbols.js";
7
+ import "react-native-get-random-values";
8
+ import { URL as CompatibleURL, URLSearchParams as CompatibleURLSearchParams } from "react-native-url-polyfill";
9
+ import { ReadableStream, TransformStream, WritableStream } from "web-streams-polyfill";
10
+ import { TextDecoder, TextEncoder } from "text-encoding";
11
+ // React Native's built-in URL is present but incomplete. Replace it only when
12
+ // this small capability check fails, retaining complete application polyfills.
13
+ function hasWorkingURL() {
14
+ try {
15
+ const url = new globalThis.URL("child?q=hello%20world", "https://example.invalid/root/");
16
+ return url.href === "https://example.invalid/root/child?q=hello%20world" &&
17
+ url.searchParams.get("q") === "hello world" &&
18
+ new globalThis.URLSearchParams({ q: "hello world" }).get("q") === "hello world";
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ if (!hasWorkingURL())
25
+ Object.assign(globalThis, { URL: CompatibleURL, URLSearchParams: CompatibleURLSearchParams });
26
+ if (typeof globalThis.TextEncoder === "undefined")
27
+ Object.assign(globalThis, { TextEncoder });
28
+ if (typeof globalThis.TextDecoder === "undefined")
29
+ Object.assign(globalThis, { TextDecoder });
30
+ if (typeof globalThis.ReadableStream === "undefined")
31
+ Object.assign(globalThis, { ReadableStream });
32
+ if (typeof globalThis.TransformStream === "undefined")
33
+ Object.assign(globalThis, { TransformStream });
34
+ if (typeof globalThis.WritableStream === "undefined")
35
+ Object.assign(globalThis, { WritableStream });
36
+ if (typeof AbortSignal.prototype.throwIfAborted === "undefined") {
37
+ Object.defineProperty(AbortSignal.prototype, "throwIfAborted", {
38
+ configurable: true,
39
+ writable: true,
40
+ value() {
41
+ if (!this.aborted)
42
+ return;
43
+ if (this.reason !== undefined)
44
+ throw this.reason;
45
+ const error = new Error("The operation was aborted.");
46
+ error.name = "AbortError";
47
+ throw error;
48
+ },
49
+ });
50
+ }
51
+ // LangChain expects a string when navigator exists. This is runtime detection,
52
+ // not caller-supplied trust or framework attribution in the native protocol.
53
+ if (typeof navigator !== "undefined" && typeof navigator.userAgent !== "string") {
54
+ Object.defineProperty(navigator, "userAgent", { value: "ReactNative/0.82", configurable: true });
55
+ }
56
+ //# sourceMappingURL=polyfills.js.map