@chipmobilesdk/rn-camera 0.4.0 → 0.5.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 (185) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/README.md +11 -7
  3. package/lib/commonjs/config/types.js +54 -0
  4. package/lib/commonjs/config/types.js.map +1 -0
  5. package/lib/commonjs/core/capabilities.js +45 -0
  6. package/lib/commonjs/core/capabilities.js.map +1 -0
  7. package/lib/commonjs/core/captureController.js +107 -0
  8. package/lib/commonjs/core/captureController.js.map +1 -0
  9. package/lib/commonjs/core/contract.js +16 -0
  10. package/lib/commonjs/core/contract.js.map +1 -0
  11. package/lib/commonjs/core/controller.js +452 -0
  12. package/lib/commonjs/core/controller.js.map +1 -0
  13. package/lib/commonjs/core/sessionMachine.js +116 -0
  14. package/lib/commonjs/core/sessionMachine.js.map +1 -0
  15. package/lib/commonjs/core/sessionRuntime.js +218 -0
  16. package/lib/commonjs/core/sessionRuntime.js.map +1 -0
  17. package/lib/commonjs/diagnostics/errors.js +86 -0
  18. package/lib/commonjs/diagnostics/errors.js.map +1 -0
  19. package/lib/commonjs/diagnostics/logger.js +40 -0
  20. package/lib/commonjs/diagnostics/logger.js.map +1 -0
  21. package/lib/commonjs/geometry/coordinateMapping.js +156 -0
  22. package/lib/commonjs/geometry/coordinateMapping.js.map +1 -0
  23. package/lib/commonjs/index.js +130 -0
  24. package/lib/commonjs/index.js.map +1 -0
  25. package/lib/commonjs/native/cameraEngine.js +86 -0
  26. package/lib/commonjs/native/cameraEngine.js.map +1 -0
  27. package/lib/commonjs/native/visionCameraPeer.js +28 -0
  28. package/lib/commonjs/native/visionCameraPeer.js.map +1 -0
  29. package/lib/commonjs/native/visionSurface.js +38 -0
  30. package/lib/commonjs/native/visionSurface.js.map +1 -0
  31. package/lib/commonjs/package.json +1 -0
  32. package/lib/commonjs/permissions/permissionPort.js +105 -0
  33. package/lib/commonjs/permissions/permissionPort.js.map +1 -0
  34. package/lib/commonjs/react/CameraPreview.js +136 -0
  35. package/lib/commonjs/react/CameraPreview.js.map +1 -0
  36. package/lib/commonjs/react/VisionCameraFeed.js +196 -0
  37. package/lib/commonjs/react/VisionCameraFeed.js.map +1 -0
  38. package/lib/commonjs/react/hooks.js +50 -0
  39. package/lib/commonjs/react/hooks.js.map +1 -0
  40. package/lib/commonjs/storage/artifactStore.js +98 -0
  41. package/lib/commonjs/storage/artifactStore.js.map +1 -0
  42. package/lib/commonjs/testing/conformance.js +109 -0
  43. package/lib/commonjs/testing/conformance.js.map +1 -0
  44. package/lib/commonjs/testing/index.js +50 -0
  45. package/lib/commonjs/testing/index.js.map +1 -0
  46. package/lib/commonjs/testing/testCameraAdapter.js +191 -0
  47. package/lib/commonjs/testing/testCameraAdapter.js.map +1 -0
  48. package/lib/module/config/types.js +49 -0
  49. package/lib/module/config/types.js.map +1 -0
  50. package/lib/module/core/capabilities.js +37 -0
  51. package/lib/module/core/capabilities.js.map +1 -0
  52. package/lib/module/core/captureController.js +98 -0
  53. package/lib/module/core/captureController.js.map +1 -0
  54. package/lib/module/core/contract.js +12 -0
  55. package/lib/module/core/contract.js.map +1 -0
  56. package/lib/module/core/controller.js +442 -0
  57. package/lib/module/core/controller.js.map +1 -0
  58. package/lib/module/core/sessionMachine.js +109 -0
  59. package/lib/module/core/sessionMachine.js.map +1 -0
  60. package/lib/module/core/sessionRuntime.js +215 -0
  61. package/lib/module/core/sessionRuntime.js.map +1 -0
  62. package/lib/module/diagnostics/errors.js +79 -0
  63. package/lib/module/diagnostics/errors.js.map +1 -0
  64. package/lib/module/diagnostics/logger.js +35 -0
  65. package/lib/module/diagnostics/logger.js.map +1 -0
  66. package/lib/module/geometry/coordinateMapping.js +149 -0
  67. package/lib/module/geometry/coordinateMapping.js.map +1 -0
  68. package/lib/module/index.js +44 -0
  69. package/lib/module/index.js.map +1 -0
  70. package/lib/module/native/cameraEngine.js +83 -0
  71. package/lib/module/native/cameraEngine.js.map +1 -0
  72. package/lib/module/native/visionCameraPeer.js +24 -0
  73. package/lib/module/native/visionCameraPeer.js.map +1 -0
  74. package/lib/module/native/visionSurface.js +34 -0
  75. package/lib/module/native/visionSurface.js.map +1 -0
  76. package/lib/module/package.json +1 -0
  77. package/lib/module/permissions/permissionPort.js +101 -0
  78. package/lib/module/permissions/permissionPort.js.map +1 -0
  79. package/lib/module/react/CameraPreview.js +130 -0
  80. package/lib/module/react/CameraPreview.js.map +1 -0
  81. package/lib/module/react/VisionCameraFeed.js +190 -0
  82. package/lib/module/react/VisionCameraFeed.js.map +1 -0
  83. package/lib/module/react/hooks.js +45 -0
  84. package/lib/module/react/hooks.js.map +1 -0
  85. package/lib/module/storage/artifactStore.js +94 -0
  86. package/lib/module/storage/artifactStore.js.map +1 -0
  87. package/lib/module/testing/conformance.js +102 -0
  88. package/lib/module/testing/conformance.js.map +1 -0
  89. package/lib/module/testing/index.js +13 -0
  90. package/lib/module/testing/index.js.map +1 -0
  91. package/lib/module/testing/testCameraAdapter.js +185 -0
  92. package/lib/module/testing/testCameraAdapter.js.map +1 -0
  93. package/lib/typescript/commonjs/config/types.d.ts +122 -0
  94. package/lib/typescript/commonjs/config/types.d.ts.map +1 -0
  95. package/lib/typescript/commonjs/core/capabilities.d.ts +16 -0
  96. package/lib/typescript/commonjs/core/capabilities.d.ts.map +1 -0
  97. package/lib/typescript/commonjs/core/captureController.d.ts +48 -0
  98. package/lib/typescript/commonjs/core/captureController.d.ts.map +1 -0
  99. package/lib/typescript/commonjs/core/contract.d.ts +92 -0
  100. package/lib/typescript/commonjs/core/contract.d.ts.map +1 -0
  101. package/lib/typescript/commonjs/core/controller.d.ts +15 -0
  102. package/lib/typescript/commonjs/core/controller.d.ts.map +1 -0
  103. package/lib/typescript/commonjs/core/sessionMachine.d.ts +46 -0
  104. package/lib/typescript/commonjs/core/sessionMachine.d.ts.map +1 -0
  105. package/lib/typescript/commonjs/core/sessionRuntime.d.ts +64 -0
  106. package/lib/typescript/commonjs/core/sessionRuntime.d.ts.map +1 -0
  107. package/lib/typescript/commonjs/diagnostics/errors.d.ts +24 -0
  108. package/lib/typescript/commonjs/diagnostics/errors.d.ts.map +1 -0
  109. package/lib/typescript/commonjs/diagnostics/logger.d.ts +24 -0
  110. package/lib/typescript/commonjs/diagnostics/logger.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/geometry/coordinateMapping.d.ts +23 -0
  112. package/lib/typescript/commonjs/geometry/coordinateMapping.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/index.d.ts +32 -0
  114. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/native/cameraEngine.d.ts +50 -0
  116. package/lib/typescript/commonjs/native/cameraEngine.d.ts.map +1 -0
  117. package/lib/typescript/commonjs/native/visionCameraPeer.d.ts +2 -0
  118. package/lib/typescript/commonjs/native/visionCameraPeer.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/native/visionSurface.d.ts +41 -0
  120. package/lib/typescript/commonjs/native/visionSurface.d.ts.map +1 -0
  121. package/lib/typescript/commonjs/package.json +1 -0
  122. package/lib/typescript/commonjs/permissions/permissionPort.d.ts +24 -0
  123. package/lib/typescript/commonjs/permissions/permissionPort.d.ts.map +1 -0
  124. package/lib/typescript/commonjs/react/CameraPreview.d.ts +25 -0
  125. package/lib/typescript/commonjs/react/CameraPreview.d.ts.map +1 -0
  126. package/lib/typescript/commonjs/react/VisionCameraFeed.d.ts +31 -0
  127. package/lib/typescript/commonjs/react/VisionCameraFeed.d.ts.map +1 -0
  128. package/lib/typescript/commonjs/react/hooks.d.ts +12 -0
  129. package/lib/typescript/commonjs/react/hooks.d.ts.map +1 -0
  130. package/lib/typescript/commonjs/storage/artifactStore.d.ts +54 -0
  131. package/lib/typescript/commonjs/storage/artifactStore.d.ts.map +1 -0
  132. package/lib/typescript/commonjs/testing/conformance.d.ts +37 -0
  133. package/lib/typescript/commonjs/testing/conformance.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/testing/index.d.ts +12 -0
  135. package/lib/typescript/commonjs/testing/index.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/testing/testCameraAdapter.d.ts +61 -0
  137. package/lib/typescript/commonjs/testing/testCameraAdapter.d.ts.map +1 -0
  138. package/lib/typescript/module/config/types.d.ts +122 -0
  139. package/lib/typescript/module/config/types.d.ts.map +1 -0
  140. package/lib/typescript/module/core/capabilities.d.ts +16 -0
  141. package/lib/typescript/module/core/capabilities.d.ts.map +1 -0
  142. package/lib/typescript/module/core/captureController.d.ts +48 -0
  143. package/lib/typescript/module/core/captureController.d.ts.map +1 -0
  144. package/lib/typescript/module/core/contract.d.ts +92 -0
  145. package/lib/typescript/module/core/contract.d.ts.map +1 -0
  146. package/lib/typescript/module/core/controller.d.ts +15 -0
  147. package/lib/typescript/module/core/controller.d.ts.map +1 -0
  148. package/lib/typescript/module/core/sessionMachine.d.ts +46 -0
  149. package/lib/typescript/module/core/sessionMachine.d.ts.map +1 -0
  150. package/lib/typescript/module/core/sessionRuntime.d.ts +64 -0
  151. package/lib/typescript/module/core/sessionRuntime.d.ts.map +1 -0
  152. package/lib/typescript/module/diagnostics/errors.d.ts +24 -0
  153. package/lib/typescript/module/diagnostics/errors.d.ts.map +1 -0
  154. package/lib/typescript/module/diagnostics/logger.d.ts +24 -0
  155. package/lib/typescript/module/diagnostics/logger.d.ts.map +1 -0
  156. package/lib/typescript/module/geometry/coordinateMapping.d.ts +23 -0
  157. package/lib/typescript/module/geometry/coordinateMapping.d.ts.map +1 -0
  158. package/lib/typescript/module/index.d.ts +32 -0
  159. package/lib/typescript/module/index.d.ts.map +1 -0
  160. package/lib/typescript/module/native/cameraEngine.d.ts +50 -0
  161. package/lib/typescript/module/native/cameraEngine.d.ts.map +1 -0
  162. package/lib/typescript/module/native/visionCameraPeer.d.ts +2 -0
  163. package/lib/typescript/module/native/visionCameraPeer.d.ts.map +1 -0
  164. package/lib/typescript/module/native/visionSurface.d.ts +41 -0
  165. package/lib/typescript/module/native/visionSurface.d.ts.map +1 -0
  166. package/lib/typescript/module/package.json +1 -0
  167. package/lib/typescript/module/permissions/permissionPort.d.ts +24 -0
  168. package/lib/typescript/module/permissions/permissionPort.d.ts.map +1 -0
  169. package/lib/typescript/module/react/CameraPreview.d.ts +25 -0
  170. package/lib/typescript/module/react/CameraPreview.d.ts.map +1 -0
  171. package/lib/typescript/module/react/VisionCameraFeed.d.ts +31 -0
  172. package/lib/typescript/module/react/VisionCameraFeed.d.ts.map +1 -0
  173. package/lib/typescript/module/react/hooks.d.ts +12 -0
  174. package/lib/typescript/module/react/hooks.d.ts.map +1 -0
  175. package/lib/typescript/module/storage/artifactStore.d.ts +54 -0
  176. package/lib/typescript/module/storage/artifactStore.d.ts.map +1 -0
  177. package/lib/typescript/module/testing/conformance.d.ts +37 -0
  178. package/lib/typescript/module/testing/conformance.d.ts.map +1 -0
  179. package/lib/typescript/module/testing/index.d.ts +12 -0
  180. package/lib/typescript/module/testing/index.d.ts.map +1 -0
  181. package/lib/typescript/module/testing/testCameraAdapter.d.ts +61 -0
  182. package/lib/typescript/module/testing/testCameraAdapter.d.ts.map +1 -0
  183. package/package.json +49 -13
  184. package/skills/sdk-rn-camera/SKILL.md +6 -3
  185. package/src/index.ts +4 -12
@@ -0,0 +1,452 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.DEFAULT_START_TIMEOUT_MS = void 0;
7
+ Object.defineProperty(exports, "DEFAULT_TEMPORARY_TTL_MS", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _contract.DEFAULT_TEMPORARY_TTL_MS;
11
+ }
12
+ });
13
+ exports.createCameraController = createCameraController;
14
+ var _rnCore = require("@chipmobilesdk/rn-core");
15
+ var _errors = require("../diagnostics/errors.js");
16
+ var _logger = require("../diagnostics/logger.js");
17
+ var _contract = require("./contract.js");
18
+ var _capabilities = require("./capabilities.js");
19
+ var _captureController = require("./captureController.js");
20
+ var _sessionMachine = require("./sessionMachine.js");
21
+ var _sessionRuntime = require("./sessionRuntime.js");
22
+ /**
23
+ * Camera controller — the object consuming apps actually drive.
24
+ *
25
+ * It owns observable state and orchestrates the three ports (engine,
26
+ * permissions, artifact store). All I/O lives here; the decisions live in
27
+ * `sessionMachine` and `captureController`, which stay pure so they can be
28
+ * tested without a camera.
29
+ */
30
+
31
+ /** 24 hours (FR-029). */
32
+
33
+ function defaultAppStateSubscribe(listener) {
34
+ // rn-core's one lifecycle subscription, shared with every other package; it
35
+ // requires react-native only on first subscribe (PERF-07).
36
+ return (0, _rnCore.appLifecycle)().subscribe(state => listener(state === 'active' ? 'active' : 'background'));
37
+ }
38
+
39
+ /** 8 s: a cold camera on a slow device, with room to spare (PERF-001 is 1.5 s). */
40
+ const DEFAULT_START_TIMEOUT_MS = exports.DEFAULT_START_TIMEOUT_MS = 8_000;
41
+ function createCameraController(options) {
42
+ if (!options?.engine || !options?.permissions) {
43
+ // A configuration fault, named as one. The ports are required by the type;
44
+ // this is the answer for a JavaScript caller or a cast.
45
+ throw new _errors.CameraError('unsupportedCapability', 'createCameraController requires `engine` and `permissions` ports. Use the ' + 'default adapters, or createTestCamera() in tests.');
46
+ }
47
+ const engine = options.engine;
48
+ const permissions = options.permissions;
49
+ const store = options.store;
50
+ const logger = (0, _logger.withSdkSinks)(options.logger ?? _logger.silentLogger);
51
+ const ttlMs = options.temporaryTtlMs ?? _contract.DEFAULT_TEMPORARY_TTL_MS;
52
+ const startTimeoutMs = options.startTimeoutMs ?? DEFAULT_START_TIMEOUT_MS;
53
+ const scheduler = options.scheduler ?? {
54
+ setTimeout: (callback, ms) => setTimeout(callback, ms),
55
+ clearTimeout: handle => clearTimeout(handle)
56
+ };
57
+ let session = _sessionMachine.initialSession;
58
+ let permission = 'undetermined';
59
+ let capabilities = null;
60
+ let cameraPosition = 'back';
61
+ let flashMode = 'off';
62
+ let torchEnabled = false;
63
+ let surfaceMounted = false;
64
+ let disposed = false;
65
+ let warnedUnmanaged = false;
66
+ let detach = null;
67
+ const capture = new _captureController.SingleFlight();
68
+ const listeners = (0, _rnCore.createListenerSet)({
69
+ onListenerError: () => logger.log({
70
+ type: 'session',
71
+ code: 'listener-threw'
72
+ })
73
+ });
74
+
75
+ /**
76
+ * The session's own I/O (`sessionRuntime`): starting it, waiting for frames,
77
+ * releasing it, following the app in and out of the foreground. It reads and
78
+ * writes the state above through this context, so one snapshot reaches
79
+ * subscribers whichever part changed it.
80
+ */
81
+ const runtime = (0, _sessionRuntime.createSessionRuntime)({
82
+ engine,
83
+ logger,
84
+ startTimeoutMs,
85
+ scheduler,
86
+ session: () => session,
87
+ dispatch,
88
+ emit,
89
+ cameraPosition: () => cameraPosition,
90
+ setCameraPosition: position => {
91
+ cameraPosition = position;
92
+ },
93
+ torchEnabled: () => torchEnabled,
94
+ setTorchEnabled: enabled => {
95
+ torchEnabled = enabled;
96
+ },
97
+ surfaceMounted: () => surfaceMounted,
98
+ permissionGranted: () => permission === 'granted',
99
+ disposed: () => disposed
100
+ });
101
+ function snapshot() {
102
+ return {
103
+ session: session.status,
104
+ permission,
105
+ capabilities,
106
+ cameraPosition,
107
+ flashMode,
108
+ torchEnabled,
109
+ capturing: capture.busy,
110
+ // What the mounted preview turned out to be, once it reported: the
111
+ // format's pixel size and the orientation coordinate mapping needs.
112
+ surface: runtime.surfaceInfo(),
113
+ error: session.error ? {
114
+ code: session.error.code,
115
+ recoverable: session.error.recoverable,
116
+ message: session.error.message
117
+ } : null
118
+ };
119
+ }
120
+ let current = snapshot();
121
+ function emit() {
122
+ current = snapshot();
123
+ // Isolated: one throwing subscriber neither starves the others nor unwinds
124
+ // into the transition that emitted, which left the controller half-updated.
125
+ listeners.notify(current);
126
+ }
127
+ function dispatch(event) {
128
+ const next = (0, _sessionMachine.sessionReducer)(session, event);
129
+ if (next !== session) {
130
+ session = next;
131
+ logger.log({
132
+ type: 'session',
133
+ code: session.status,
134
+ recoverable: session.error?.recoverable
135
+ });
136
+ emit();
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Subscribes to permission and app-state changes and runs the sweep, on first
142
+ * use rather than at construction. React may build a controller during a
143
+ * render it then throws away (StrictMode does so on purpose); construction
144
+ * that subscribed leaked a listener pair every time.
145
+ */
146
+ function attach() {
147
+ if (detach || disposed) {
148
+ return;
149
+ }
150
+ const unsubscribePermission = permissions.subscribe(next => {
151
+ permission = next;
152
+ logger.log({
153
+ type: 'permission',
154
+ code: next
155
+ });
156
+ emit();
157
+ // A revocation while running must tear the session down, not leave a
158
+ // frozen preview on screen (FR-007).
159
+ if (next !== 'granted') {
160
+ runtime.armResumeOnForeground();
161
+ if (session.status !== 'idle' && session.status !== 'stopped') {
162
+ runtime.release().catch(() => undefined);
163
+ }
164
+ }
165
+ });
166
+ const unsubscribeAppState = (options.subscribeToAppState ?? defaultAppStateSubscribe)(status => runtime.onAppState(status));
167
+ // The OS can take the camera at any moment — another app, an incoming
168
+ // call, a disconnected device. The session has to go with it (CAM-19).
169
+ const unsubscribeInterruptions = engine.subscribeToInterruptions?.(code => runtime.onInterruption(code)) ?? (() => undefined);
170
+ detach = () => {
171
+ unsubscribePermission();
172
+ unsubscribeAppState();
173
+ unsubscribeInterruptions();
174
+ };
175
+
176
+ // FR-029: sweep our own temp directory once, asynchronously, so it can
177
+ // never add latency to the capture path or the preview start.
178
+ if (store && options.sweepOnInit !== false) {
179
+ store.sweep(ttlMs).then(removed => {
180
+ if (removed > 0) {
181
+ logger.log({
182
+ type: 'cleanup',
183
+ code: `swept:${removed}`
184
+ });
185
+ }
186
+ }).catch(() => {
187
+ // A failed sweep must never block startup.
188
+ });
189
+ }
190
+ }
191
+
192
+ /** Entry guard for operations that need a live controller. */
193
+ function live(operation) {
194
+ if (disposed) {
195
+ throw new _errors.CameraError('notReady', `${operation}() called on a disposed camera controller`);
196
+ }
197
+ attach();
198
+ }
199
+
200
+ /**
201
+ * Puts a package-temporary capture under the store so `cleanup()` and the
202
+ * sweep can reach it. Never throws: the capture itself succeeded, and a file
203
+ * the store cannot manage is still a usable photo.
204
+ */
205
+ async function manage(image) {
206
+ if (image.ownership !== 'packageTemporary') {
207
+ return image;
208
+ }
209
+ if (store?.adopt) {
210
+ try {
211
+ return {
212
+ ...image,
213
+ uri: await store.adopt(image.uri)
214
+ };
215
+ } catch {
216
+ logger.log({
217
+ type: 'cleanup',
218
+ code: 'adopt-failed'
219
+ });
220
+ return image;
221
+ }
222
+ }
223
+ if (!store?.owns(image.uri) && !warnedUnmanaged) {
224
+ warnedUnmanaged = true;
225
+ logger.log({
226
+ type: 'cleanup',
227
+ code: store ? 'unmanaged:store-cannot-adopt' : 'unmanaged:no-store'
228
+ });
229
+ }
230
+ return image;
231
+ }
232
+ const controller = {
233
+ get state() {
234
+ return current;
235
+ },
236
+ subscribe(listener) {
237
+ if (disposed) {
238
+ return () => undefined;
239
+ }
240
+ attach();
241
+ return listeners.add(listener);
242
+ },
243
+ async getPermission() {
244
+ live('getPermission');
245
+ permission = await permissions.getStatus();
246
+ emit();
247
+ return permission;
248
+ },
249
+ async requestPermission() {
250
+ live('requestPermission');
251
+ permission = 'requesting';
252
+ emit();
253
+ try {
254
+ permission = await permissions.request();
255
+ } catch (error) {
256
+ // A native call that failed used to leave the state at `requesting`
257
+ // forever, with no way for the app to ask again (CAM-07).
258
+ permission = await permissions.getStatus().catch(() => 'unavailable');
259
+ emit();
260
+ throw (0, _errors.isCameraError)(error) ? error : new _errors.CameraError('permissionDenied', 'The permission request could not be completed');
261
+ }
262
+ emit();
263
+ return permission;
264
+ },
265
+ async start(startOptions = {}) {
266
+ live('start');
267
+ if (permission !== 'granted') {
268
+ dispatch({
269
+ type: 'FAIL',
270
+ code: 'permissionDenied'
271
+ });
272
+ throw new _errors.CameraError('permissionDenied', 'Camera permission is not granted');
273
+ }
274
+ if (!(0, _sessionMachine.canStart)(session.status)) {
275
+ throw new _errors.CameraError('sessionConflict', `Session already ${session.status}`);
276
+ }
277
+ if (startOptions.cameraPosition) {
278
+ cameraPosition = startOptions.cameraPosition;
279
+ }
280
+ dispatch({
281
+ type: 'START'
282
+ });
283
+ await runtime.start(startOptions);
284
+ if (session.error) {
285
+ throw session.error;
286
+ }
287
+ },
288
+ async pause() {
289
+ if (disposed) {
290
+ return;
291
+ }
292
+ await runtime.forceTorchOff();
293
+ dispatch({
294
+ type: 'PAUSE'
295
+ });
296
+ },
297
+ async resume() {
298
+ live('resume');
299
+ dispatch({
300
+ type: 'RESUME'
301
+ });
302
+ if (session.status === 'starting') {
303
+ await runtime.start();
304
+ }
305
+ },
306
+ async stop() {
307
+ // An explicit stop is the user's decision; foregrounding must not undo it.
308
+ runtime.armResumeOnForeground();
309
+ if (disposed) {
310
+ return;
311
+ }
312
+ await runtime.release();
313
+ },
314
+ async capture(request = {}) {
315
+ live('capture');
316
+ const context = {
317
+ engine,
318
+ sessionStatus: session.status,
319
+ permissionGranted: permission === 'granted',
320
+ capabilities,
321
+ cameraPosition,
322
+ flashMode
323
+ };
324
+ // Guards run before the single-flight slot is taken so a rejected
325
+ // request cannot block a subsequent legal one.
326
+ (0, _captureController.assertCaptureAllowed)(context, request);
327
+ try {
328
+ const result = await capture.run(async () => {
329
+ emit();
330
+ const raw = await engine.capture({
331
+ ...request,
332
+ flashMode: request.flashMode ?? flashMode,
333
+ cameraPosition: request.cameraPosition ?? cameraPosition
334
+ });
335
+ return manage((0, _captureController.finalizeResult)(raw, request, context));
336
+ });
337
+ logger.log({
338
+ type: 'capture',
339
+ code: 'succeeded'
340
+ });
341
+ return result;
342
+ } catch (error) {
343
+ // The contract promises a CameraError; a raw native error carries
344
+ // no code to branch on and its message may hold a file path.
345
+ const failure = (0, _errors.isCameraError)(error) ? error : new _errors.CameraError('captureFailed', 'The camera failed to capture a photo');
346
+ logger.log({
347
+ type: 'capture',
348
+ code: failure.code,
349
+ recoverable: failure.recoverable
350
+ });
351
+ throw failure;
352
+ } finally {
353
+ // Without this a failed capture left `capturing: true` published
354
+ // until some unrelated change emitted again.
355
+ emit();
356
+ }
357
+ },
358
+ async cleanup(image) {
359
+ const uri = typeof image === 'string' ? image : image.uri;
360
+ if (!store) {
361
+ return;
362
+ }
363
+ // Refuse anything we did not create rather than deleting an arbitrary
364
+ // path, which also covers every appOwned artifact (FR-026b, FR-028).
365
+ if (!store.owns(uri)) {
366
+ logger.log({
367
+ type: 'cleanup',
368
+ code: 'refused-not-owned'
369
+ });
370
+ return;
371
+ }
372
+ await store.remove(uri);
373
+ logger.log({
374
+ type: 'cleanup',
375
+ code: 'removed'
376
+ });
377
+ },
378
+ async getCapabilities() {
379
+ live('getCapabilities');
380
+ try {
381
+ capabilities = await engine.getCapabilities();
382
+ } catch {
383
+ capabilities = _capabilities.EMPTY_CAPABILITIES;
384
+ }
385
+ logger.log({
386
+ type: 'capability',
387
+ code: capabilities.hasCameraHardware ? 'available' : 'no-hardware'
388
+ });
389
+ emit();
390
+ return capabilities;
391
+ },
392
+ setFlashMode(mode) {
393
+ (0, _capabilities.assertSupported)(mode === 'off' || capabilities?.hasFlash === true, `flash mode "${mode}"`);
394
+ flashMode = mode;
395
+ emit();
396
+ },
397
+ async setTorch(enabled) {
398
+ if (disposed && !enabled) {
399
+ return;
400
+ }
401
+ live('setTorch');
402
+ if (enabled) {
403
+ (0, _capabilities.assertSupported)((0, _capabilities.supportsTorch)(capabilities), 'torch');
404
+ }
405
+ await engine.setTorch(enabled);
406
+ torchEnabled = enabled;
407
+ emit();
408
+ },
409
+ reportSurfaceUnavailable() {
410
+ if (disposed) {
411
+ return;
412
+ }
413
+ logger.log({
414
+ type: 'session',
415
+ code: 'surface-unavailable',
416
+ recoverable: false
417
+ });
418
+ dispatch({
419
+ type: 'FAIL',
420
+ code: 'cameraUnavailable'
421
+ });
422
+ },
423
+ attachSurface(surface) {
424
+ return engine.attachSurface?.(surface) ?? (() => undefined);
425
+ },
426
+ reportSurfaceStarted(info) {
427
+ runtime.reportSurfaceStarted(info);
428
+ },
429
+ reportSurfaceFailed(code) {
430
+ runtime.reportSurfaceFailed(code);
431
+ },
432
+ setSurfaceMounted(mounted) {
433
+ if (disposed) {
434
+ return;
435
+ }
436
+ surfaceMounted = mounted;
437
+ },
438
+ async dispose() {
439
+ if (disposed) {
440
+ return;
441
+ }
442
+ disposed = true;
443
+ runtime.armResumeOnForeground();
444
+ detach?.();
445
+ detach = null;
446
+ await runtime.release();
447
+ listeners.clear();
448
+ }
449
+ };
450
+ return controller;
451
+ }
452
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_rnCore","require","_errors","_logger","_contract","_capabilities","_captureController","_sessionMachine","_sessionRuntime","defaultAppStateSubscribe","listener","appLifecycle","subscribe","state","DEFAULT_START_TIMEOUT_MS","exports","createCameraController","options","engine","permissions","CameraError","store","logger","withSdkSinks","silentLogger","ttlMs","temporaryTtlMs","DEFAULT_TEMPORARY_TTL_MS","startTimeoutMs","scheduler","setTimeout","callback","ms","clearTimeout","handle","session","initialSession","permission","capabilities","cameraPosition","flashMode","torchEnabled","surfaceMounted","disposed","warnedUnmanaged","detach","capture","SingleFlight","listeners","createListenerSet","onListenerError","log","type","code","runtime","createSessionRuntime","dispatch","emit","setCameraPosition","position","setTorchEnabled","enabled","permissionGranted","snapshot","status","capturing","busy","surface","surfaceInfo","error","recoverable","message","current","notify","event","next","sessionReducer","attach","unsubscribePermission","armResumeOnForeground","release","catch","undefined","unsubscribeAppState","subscribeToAppState","onAppState","unsubscribeInterruptions","subscribeToInterruptions","onInterruption","sweepOnInit","sweep","then","removed","live","operation","manage","image","ownership","adopt","uri","owns","controller","add","getPermission","getStatus","requestPermission","request","isCameraError","start","startOptions","canStart","pause","forceTorchOff","resume","stop","context","sessionStatus","assertCaptureAllowed","result","run","raw","finalizeResult","failure","cleanup","remove","getCapabilities","EMPTY_CAPABILITIES","hasCameraHardware","setFlashMode","mode","assertSupported","hasFlash","setTorch","supportsTorch","reportSurfaceUnavailable","attachSurface","reportSurfaceStarted","info","reportSurfaceFailed","setSurfaceMounted","mounted","dispose","clear"],"sourceRoot":"../../../src","sources":["core/controller.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.canCapture = canCapture;
7
+ exports.canStart = canStart;
8
+ exports.initialSession = void 0;
9
+ exports.sessionReducer = sessionReducer;
10
+ var _errors = require("../diagnostics/errors.js");
11
+ /**
12
+ * Session lifecycle state machine (FR-014..FR-019).
13
+ *
14
+ * Pure and synchronous: it decides what a transition means, the controller
15
+ * performs the I/O. That split is what makes every lifecycle rule in
16
+ * `data-model.md` section 2 testable without a camera.
17
+ *
18
+ * Backgrounding STOPS rather than pauses. Both operating systems can reclaim
19
+ * the camera anyway, and holding it risks leaving the OS camera indicator lit
20
+ * after the app is no longer in front of the user (FR-015).
21
+ */
22
+
23
+ const initialSession = exports.initialSession = {
24
+ status: 'idle',
25
+ error: null
26
+ };
27
+
28
+ /** Statuses from which a fresh start is allowed (FR-019). */
29
+ const STARTABLE = new Set(['idle', 'stopped', 'error']);
30
+ function canStart(status) {
31
+ return STARTABLE.has(status);
32
+ }
33
+
34
+ /** Capture is only ever legal from a fully active session (FR-020). */
35
+ function canCapture(status) {
36
+ return status === 'active';
37
+ }
38
+ function fail(code) {
39
+ return {
40
+ status: 'error',
41
+ error: new _errors.CameraError(code)
42
+ };
43
+ }
44
+ function sessionReducer(snapshot, event) {
45
+ const {
46
+ status
47
+ } = snapshot;
48
+ switch (event.type) {
49
+ case 'START':
50
+ if (!canStart(status)) {
51
+ // Refuse rather than silently stealing the camera from the surface
52
+ // that already holds it (FR-019).
53
+ return {
54
+ status,
55
+ error: new _errors.CameraError('sessionConflict')
56
+ };
57
+ }
58
+ return {
59
+ status: 'starting',
60
+ error: null
61
+ };
62
+ case 'STARTED':
63
+ return status === 'starting' ? {
64
+ status: 'active',
65
+ error: null
66
+ } : snapshot;
67
+ case 'START_TIMEOUT':
68
+ // Never sit in `starting` forever when frames stop arriving.
69
+ return status === 'starting' ? fail('captureFailed') : snapshot;
70
+ case 'PAUSE':
71
+ return status === 'active' ? {
72
+ status: 'paused',
73
+ error: null
74
+ } : snapshot;
75
+ case 'RESUME':
76
+ return status === 'paused' ? {
77
+ status: 'starting',
78
+ error: null
79
+ } : snapshot;
80
+ case 'STOP':
81
+ if (status === 'stopped' || status === 'idle') {
82
+ return snapshot;
83
+ }
84
+ return {
85
+ status: 'stopping',
86
+ error: snapshot.error
87
+ };
88
+ case 'STOPPED':
89
+ return {
90
+ status: 'stopped',
91
+ error: null
92
+ };
93
+ case 'BACKGROUND':
94
+ // Release, do not hold (FR-015).
95
+ if (status === 'active' || status === 'paused' || status === 'starting') {
96
+ return {
97
+ status: 'stopping',
98
+ error: null
99
+ };
100
+ }
101
+ return snapshot;
102
+ case 'FOREGROUND':
103
+ if (event.surfaceMounted && (status === 'stopped' || status === 'idle')) {
104
+ return {
105
+ status: 'starting',
106
+ error: null
107
+ };
108
+ }
109
+ return snapshot;
110
+ case 'FAIL':
111
+ return fail(event.code);
112
+ default:
113
+ return snapshot;
114
+ }
115
+ }
116
+ //# sourceMappingURL=sessionMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_errors","require","initialSession","exports","status","error","STARTABLE","Set","canStart","has","canCapture","fail","code","CameraError","sessionReducer","snapshot","event","type","surfaceMounted"],"sourceRoot":"../../../src","sources":["core/sessionMachine.ts"],"mappings":";;;;;;;;;AAaA,IAAAA,OAAA,GAAAC,OAAA;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAsBO,MAAMC,cAA+B,GAAAC,OAAA,CAAAD,cAAA,GAAG;EAAEE,MAAM,EAAE,MAAM;EAAEC,KAAK,EAAE;AAAK,CAAC;;AAE9E;AACA,MAAMC,SAAqC,GAAG,IAAIC,GAAG,CAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAE3F,SAASC,QAAQA,CAACJ,MAAqB,EAAW;EACxD,OAAOE,SAAS,CAACG,GAAG,CAACL,MAAM,CAAC;AAC7B;;AAEA;AACO,SAASM,UAAUA,CAACN,MAAqB,EAAW;EAC1D,OAAOA,MAAM,KAAK,QAAQ;AAC3B;AAEA,SAASO,IAAIA,CAACC,IAAqB,EAAmB;EACrD,OAAO;IAAER,MAAM,EAAE,OAAO;IAAEC,KAAK,EAAE,IAAIQ,mBAAW,CAACD,IAAI;EAAE,CAAC;AACzD;AAEO,SAASE,cAAcA,CAACC,QAAyB,EAAEC,KAAmB,EAAmB;EAC/F,MAAM;IAAEZ;EAAO,CAAC,GAAGW,QAAQ;EAE3B,QAAQC,KAAK,CAACC,IAAI;IACjB,KAAK,OAAO;MACX,IAAI,CAACT,QAAQ,CAACJ,MAAM,CAAC,EAAE;QACtB;QACA;QACA,OAAO;UAAEA,MAAM;UAAEC,KAAK,EAAE,IAAIQ,mBAAW,CAAC,iBAAiB;QAAE,CAAC;MAC7D;MACA,OAAO;QAAET,MAAM,EAAE,UAAU;QAAEC,KAAK,EAAE;MAAK,CAAC;IAE3C,KAAK,SAAS;MACb,OAAOD,MAAM,KAAK,UAAU,GAAG;QAAEA,MAAM,EAAE,QAAQ;QAAEC,KAAK,EAAE;MAAK,CAAC,GAAGU,QAAQ;IAE5E,KAAK,eAAe;MACnB;MACA,OAAOX,MAAM,KAAK,UAAU,GAAGO,IAAI,CAAC,eAAe,CAAC,GAAGI,QAAQ;IAEhE,KAAK,OAAO;MACX,OAAOX,MAAM,KAAK,QAAQ,GAAG;QAAEA,MAAM,EAAE,QAAQ;QAAEC,KAAK,EAAE;MAAK,CAAC,GAAGU,QAAQ;IAE1E,KAAK,QAAQ;MACZ,OAAOX,MAAM,KAAK,QAAQ,GAAG;QAAEA,MAAM,EAAE,UAAU;QAAEC,KAAK,EAAE;MAAK,CAAC,GAAGU,QAAQ;IAE5E,KAAK,MAAM;MACV,IAAIX,MAAM,KAAK,SAAS,IAAIA,MAAM,KAAK,MAAM,EAAE;QAC9C,OAAOW,QAAQ;MAChB;MACA,OAAO;QAAEX,MAAM,EAAE,UAAU;QAAEC,KAAK,EAAEU,QAAQ,CAACV;MAAM,CAAC;IAErD,KAAK,SAAS;MACb,OAAO;QAAED,MAAM,EAAE,SAAS;QAAEC,KAAK,EAAE;MAAK,CAAC;IAE1C,KAAK,YAAY;MAChB;MACA,IAAID,MAAM,KAAK,QAAQ,IAAIA,MAAM,KAAK,QAAQ,IAAIA,MAAM,KAAK,UAAU,EAAE;QACxE,OAAO;UAAEA,MAAM,EAAE,UAAU;UAAEC,KAAK,EAAE;QAAK,CAAC;MAC3C;MACA,OAAOU,QAAQ;IAEhB,KAAK,YAAY;MAChB,IAAIC,KAAK,CAACE,cAAc,KAAKd,MAAM,KAAK,SAAS,IAAIA,MAAM,KAAK,MAAM,CAAC,EAAE;QACxE,OAAO;UAAEA,MAAM,EAAE,UAAU;UAAEC,KAAK,EAAE;QAAK,CAAC;MAC3C;MACA,OAAOU,QAAQ;IAEhB,KAAK,MAAM;MACV,OAAOJ,IAAI,CAACK,KAAK,CAACJ,IAAI,CAAC;IAExB;MACC,OAAOG,QAAQ;EACjB;AACD","ignoreList":[]}