@g9tm/lynxcontrols-native 1.4.3 → 1.4.4
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 +19 -4
- package/android/build.gradle.kts +3 -0
- package/android/src/main/AndroidManifest.xml +7 -0
- package/android/src/main/java/com/g9lynx/g9native/G9SpeechModule.kt +206 -0
- package/android/src/main/java/com/g9lynx/g9native/generated/G9SpeechModuleSpec.java +27 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/protocol.d.ts +14 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/speech.d.ts +24 -0
- package/dist/speech.d.ts.map +1 -0
- package/dist/speech.js +114 -0
- package/dist/speech.js.map +1 -0
- package/generated/G9SpeechModule.ts +64 -0
- package/ios/g9lynx-native.podspec +4 -3
- package/ios/src/G9SpeechModule.h +18 -0
- package/ios/src/G9SpeechModule.m +201 -0
- package/ios/src/generated/G9SpeechModuleSpec.h +16 -0
- package/ios/src/generated/G9SpeechModuleSpec.m +2 -0
- package/package.json +4 -4
- package/types/platform-native-module.d.ts +21 -0
package/README.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# @g9tm/lynxcontrols-native
|
|
2
2
|
|
|
3
|
-
Android and iOS platform layer for G9:
|
|
3
|
+
Android and iOS platform layer for G9: three Lynx native modules and one element (`<g9-video>`), linked into a host by
|
|
4
4
|
**Lynx Autolink** from `node_modules`, plus their JS adapters.
|
|
5
5
|
|
|
6
6
|
| Module | JS adapter | Android (Kotlin) | iOS (Objective-C) |
|
|
7
7
|
| --- | --- | --- | --- |
|
|
8
8
|
| `G9SqliteModule` | `createNativeSqliteDriver()` | androidx.sqlite `BundledSQLiteDriver` 2.7.1 | system `sqlite3` (iOS 15+, serial queue per session, `sqlite3_interrupt`) |
|
|
9
9
|
| `G9HostModule` | `createNativeHostServices()` | `SharedPreferences`, `moveTaskToBack`, `InputMethodManager`, haptics, insets, `appDataDirectory()` = `filesDir` | `NSUserDefaults` suite, `resignFirstResponder`, `UIImpactFeedbackGenerator`, safe-area insets, `appDataDirectory()` = `Library` |
|
|
10
|
+
| `G9SpeechModule` | `createNativeSpeechToText()` → `services.speech` (dictation into fields) | `SpeechRecognizer` (main thread, partial results), the microphone asked through the host activity's `ActivityResultRegistry` | `SFSpeechRecognizer` over `AVAudioEngine`; register it on the host's `LynxConfig`; Info.plist `NSMicrophoneUsageDescription` + `NSSpeechRecognitionUsageDescription` |
|
|
10
11
|
| `<g9-video>` element | `createNativeMediaProvider()` (`@g9tm/lynxcontrols-native/media`) | `G9VideoUI`: Media3 ExoPlayer 1.8.0 into a `TextureView` (opacity fades work); register `G9VideoBehaviors.create()` | `G9VideoUI`: `AVQueuePlayer` + `AVPlayerLooper` in an `AVPlayerLayer`; self-registers (`LYNX_REGISTER_UI`) |
|
|
11
12
|
|
|
12
13
|
```ts
|
|
@@ -21,6 +22,17 @@ const db = createG9Sqlite({ driver: createNativeSqliteDriver(), locator: singleF
|
|
|
21
22
|
|
|
22
23
|
## How it works
|
|
23
24
|
|
|
25
|
+
- **Dictation** (`services.speech`, MAUI `IG9SpeechToText`). `createNativeSpeechToText()` returns `null` where
|
|
26
|
+
`G9SpeechModule` is not linked, so the fields hide their microphone. One session at a time natively; the adapter
|
|
27
|
+
numbers sessions, routes the `g9:speech` global event (`{"session","text"}`, interim hypotheses) to the session that
|
|
28
|
+
asked, turns an abort into `cancel(session)` and settles every `listen` once (`recognized` / `no-match` /
|
|
29
|
+
`cancelled` / `denied`; a recogniser fault rejects with a `G9Error`). Android: the manifest merges `RECORD_AUDIO` and
|
|
30
|
+
the `RecognitionService` query Android 11+ needs to see a recogniser; androidx.activity is compile-only (every host
|
|
31
|
+
has it; a host activity that is not an `ActivityResultRegistryOwner` gets the current permission state, never a
|
|
32
|
+
prompt).
|
|
33
|
+
`isAvailable(locale)` is "a recogniser exists" on Android (asking a locale needs a broadcast some recognisers never
|
|
34
|
+
answer; an unsupported language ends as `no-match`) and `SFSpeechRecognizer(locale).isAvailable` on iOS.
|
|
35
|
+
|
|
24
36
|
- **Video** (the intro carousel's `services.media`). `<g9-video>` props: `src`, `paused`, `loop`, `muted`,
|
|
25
37
|
`start-seconds`, `near-end-seconds`, `object-fit`; events `ready`, `nearend`, `looped`, `error`. The provider's
|
|
26
38
|
player renders it with reactive props (no UI-method calls) and unmounts it on `dispose()`, which releases the native
|
|
@@ -54,13 +66,16 @@ android/src/main/java/com/g9lynx/g9native/
|
|
|
54
66
|
sqlite/core/ pure Kotlin: G9SqliteCore, G9SqliteService (executors), G9SqliteTransport, values/errors
|
|
55
67
|
sqlite/androidx/ AndroidxSqlEngine (BundledSQLiteDriver)
|
|
56
68
|
host/core/ G9PreferencesCore
|
|
57
|
-
G9SqliteModule.kt, G9HostModule.kt, G9Bridge.kt Lynx modules (kapt + lynx-processor →
|
|
69
|
+
G9SqliteModule.kt, G9HostModule.kt, G9SpeechModule.kt, G9Bridge.kt Lynx modules (kapt + lynx-processor →
|
|
70
|
+
LynxLibraryProviderImpl)
|
|
58
71
|
android/src/test/ JVM tests: contract runner, core, service, transport golden, preferences
|
|
59
72
|
ios/src/core/ portable Objective-C (Foundation + sqlite3): G9SqliteCore, G9SqliteTransport, G9PreferencesCore
|
|
60
|
-
ios/src/ G9SqliteModule.m, G9HostModule.m (dispatch queues, UIKit); register them
|
|
73
|
+
ios/src/ G9SqliteModule.m, G9HostModule.m, G9SpeechModule.m (dispatch queues, UIKit, Speech); register them
|
|
74
|
+
on the host's LynxConfig
|
|
61
75
|
ios/Tests/ G9NativeTestSuite (XCTest on a simulator; Linux harness in Tests/linux)
|
|
62
76
|
jvm/ JVM-only Gradle build of the core + tests (no Android SDK needed)
|
|
63
|
-
android-check/ cloud compile check of module + reference host against the published Lynx 4.1.0 classes,
|
|
77
|
+
android-check/ cloud compile check of module + reference host against the published Lynx 4.1.0 classes (Media3,
|
|
78
|
+
androidx.sqlite and androidx.activity as compile-only stubs under stubs/), and
|
|
64
79
|
LynxBridgeSignatureTest: every @LynxMethod through Lynx's own LynxMethodWrapper
|
|
65
80
|
```
|
|
66
81
|
|
package/android/build.gradle.kts
CHANGED
|
@@ -34,6 +34,9 @@ dependencies {
|
|
|
34
34
|
// The generated specs import androidx.annotation and lynx-processor's output uses @Keep, but Lynx's POMs declare it
|
|
35
35
|
// at runtime scope only: without this line kapt depends on androidx.sqlite / media3 bringing it in transitively.
|
|
36
36
|
compileOnly("androidx.annotation:annotation:1.9.1")
|
|
37
|
+
// G9SpeechModule asks for the microphone through the host activity's ActivityResultRegistry: compile-only, as every
|
|
38
|
+
// host of these libraries ships androidx.activity (a host without it gets the current state, never a prompt).
|
|
39
|
+
compileOnly("androidx.activity:activity:1.10.1")
|
|
37
40
|
implementation("androidx.sqlite:sqlite-bundled:2.7.1")
|
|
38
41
|
// <g9-video> (video/G9VideoUI.kt): ExoPlayer drawing into a TextureView. Google Maven only.
|
|
39
42
|
implementation("androidx.media3:media3-exoplayer:1.8.0")
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
<manifest
|
|
2
2
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
3
3
|
package="com.g9lynx.g9native">
|
|
4
|
+
<!-- G9SpeechModule: dictation records the microphone, and Android 11+ only sees a recogniser it declares a query for. -->
|
|
5
|
+
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
6
|
+
<queries>
|
|
7
|
+
<intent>
|
|
8
|
+
<action android:name="android.speech.RecognitionService" />
|
|
9
|
+
</intent>
|
|
10
|
+
</queries>
|
|
4
11
|
<application />
|
|
5
12
|
</manifest>
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
package com.g9lynx.g9native
|
|
2
|
+
|
|
3
|
+
import android.Manifest
|
|
4
|
+
import android.app.Activity
|
|
5
|
+
import android.content.Context
|
|
6
|
+
import android.content.ContextWrapper
|
|
7
|
+
import android.content.Intent
|
|
8
|
+
import android.content.pm.PackageManager
|
|
9
|
+
import android.os.Bundle
|
|
10
|
+
import android.os.Handler
|
|
11
|
+
import android.os.Looper
|
|
12
|
+
import android.speech.RecognitionListener
|
|
13
|
+
import android.speech.RecognizerIntent
|
|
14
|
+
import android.speech.SpeechRecognizer
|
|
15
|
+
import androidx.activity.result.ActivityResultLauncher
|
|
16
|
+
import androidx.activity.result.ActivityResultRegistryOwner
|
|
17
|
+
import androidx.activity.result.contract.ActivityResultContracts
|
|
18
|
+
import com.g9lynx.g9native.generated.G9SpeechModuleSpec
|
|
19
|
+
import com.lynx.jsbridge.LynxMethod
|
|
20
|
+
import com.lynx.jsbridge.LynxNativeModule
|
|
21
|
+
import com.lynx.react.bridge.Callback
|
|
22
|
+
import com.lynx.react.bridge.JavaOnlyArray
|
|
23
|
+
import com.lynx.tasm.behavior.LynxContext
|
|
24
|
+
import org.json.JSONObject
|
|
25
|
+
import java.util.concurrent.atomic.AtomicInteger
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* `NativeModules.G9SpeechModule` (`G9SpeechToText`, MAUI `IG9SpeechToText`): Android's `SpeechRecognizer`, one session at
|
|
29
|
+
* a time, on the main thread (the recogniser demands it). Partial hypotheses go out as the global event `g9:speech`
|
|
30
|
+
* (`{"session","text"}`); the `listen` reply settles once. The microphone permission is asked through the activity's
|
|
31
|
+
* `ActivityResultRegistry` — the host's activity must be an `ActivityResultRegistryOwner` (every `ComponentActivity`;
|
|
32
|
+
* androidx.activity is compile-only here, every host of these libraries has it); another activity answers with the
|
|
33
|
+
* current state instead of a prompt.
|
|
34
|
+
* TWIN: ios/src/G9SpeechModule.m.
|
|
35
|
+
*/
|
|
36
|
+
@LynxNativeModule(name = "G9SpeechModule")
|
|
37
|
+
class G9SpeechModule(private val lynxContext: LynxContext) : G9SpeechModuleSpec(lynxContext) {
|
|
38
|
+
private val main = Handler(Looper.getMainLooper())
|
|
39
|
+
|
|
40
|
+
private class Session(val id: String, val recognizer: SpeechRecognizer, val callback: Callback?) {
|
|
41
|
+
var settled = false
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private var current: Session? = null
|
|
45
|
+
|
|
46
|
+
private fun activity(): Activity? {
|
|
47
|
+
var context: Context? = lynxContext
|
|
48
|
+
while (context is ContextWrapper) {
|
|
49
|
+
if (context is Activity) return context
|
|
50
|
+
context = context.baseContext
|
|
51
|
+
}
|
|
52
|
+
return null
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private fun ok(callback: Callback?, value: Any?) = G9Bridge.reply(callback, mapOf("ok" to true, "value" to value))
|
|
56
|
+
|
|
57
|
+
private fun fail(callback: Callback?, code: String, message: String) =
|
|
58
|
+
G9Bridge.reply(callback, mapOf("ok" to false, "error" to mapOf("code" to code, "message" to message)))
|
|
59
|
+
|
|
60
|
+
private fun micGranted(): Boolean =
|
|
61
|
+
lynxContext.checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
|
|
62
|
+
|
|
63
|
+
@LynxMethod
|
|
64
|
+
override fun isAvailable(locale: String?, callback: Callback?) {
|
|
65
|
+
// The locale cannot be asked without starting a session (RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS needs a
|
|
66
|
+
// broadcast round-trip that some recognisers never answer): a recogniser that exists is "available"; an unsupported
|
|
67
|
+
// language then ends its session as no-match.
|
|
68
|
+
main.post { ok(callback, SpeechRecognizer.isRecognitionAvailable(lynxContext)) }
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@LynxMethod
|
|
72
|
+
override fun requestPermission(callback: Callback?) {
|
|
73
|
+
if (micGranted()) return ok(callback, "granted")
|
|
74
|
+
main.post {
|
|
75
|
+
val host = activity()
|
|
76
|
+
try {
|
|
77
|
+
if (host !is ActivityResultRegistryOwner || host.isFinishing) return@post ok(callback, "denied")
|
|
78
|
+
var launcher: ActivityResultLauncher<String>? = null
|
|
79
|
+
launcher =
|
|
80
|
+
host.activityResultRegistry.register("g9.speech.mic." + nextKey.incrementAndGet(), ActivityResultContracts.RequestPermission()) { granted ->
|
|
81
|
+
launcher?.unregister()
|
|
82
|
+
ok(callback, if (granted) "granted" else "denied")
|
|
83
|
+
}
|
|
84
|
+
launcher.launch(Manifest.permission.RECORD_AUDIO)
|
|
85
|
+
} catch (t: Throwable) {
|
|
86
|
+
// No androidx.activity in this host, or the registry refused: say what is true now rather than fail.
|
|
87
|
+
ok(callback, if (micGranted()) "granted" else "denied")
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@LynxMethod
|
|
93
|
+
override fun listen(session: String?, locale: String?, callback: Callback?) {
|
|
94
|
+
val id = session ?: ""
|
|
95
|
+
main.post {
|
|
96
|
+
if (!micGranted()) return@post ok(callback, mapOf("status" to "denied"))
|
|
97
|
+
if (!SpeechRecognizer.isRecognitionAvailable(lynxContext)) return@post fail(callback, "speech-unavailable", "No speech recogniser on this device.")
|
|
98
|
+
current?.let { finish(it, mapOf("status" to "cancelled")) }
|
|
99
|
+
val recognizer =
|
|
100
|
+
try {
|
|
101
|
+
SpeechRecognizer.createSpeechRecognizer(lynxContext)
|
|
102
|
+
} catch (t: Throwable) {
|
|
103
|
+
return@post fail(callback, "speech-recognition", t.message ?: "The recogniser could not start.")
|
|
104
|
+
}
|
|
105
|
+
val s = Session(id, recognizer, callback)
|
|
106
|
+
current = s
|
|
107
|
+
recognizer.setRecognitionListener(listener(s))
|
|
108
|
+
val intent =
|
|
109
|
+
Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
|
|
110
|
+
putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
|
|
111
|
+
putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true)
|
|
112
|
+
putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1)
|
|
113
|
+
if (!locale.isNullOrBlank()) {
|
|
114
|
+
putExtra(RecognizerIntent.EXTRA_LANGUAGE, locale)
|
|
115
|
+
putExtra(RecognizerIntent.EXTRA_LANGUAGE_PREFERENCE, locale)
|
|
116
|
+
}
|
|
117
|
+
putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, lynxContext.packageName)
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
recognizer.startListening(intent)
|
|
121
|
+
} catch (t: Throwable) {
|
|
122
|
+
finishWithError(s, "speech-recognition", t.message ?: "The recogniser could not start.")
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@LynxMethod
|
|
128
|
+
override fun cancel(session: String?) {
|
|
129
|
+
main.post {
|
|
130
|
+
val s = current ?: return@post
|
|
131
|
+
if (s.id != session) return@post
|
|
132
|
+
try {
|
|
133
|
+
s.recognizer.cancel()
|
|
134
|
+
} catch (_: Throwable) {
|
|
135
|
+
}
|
|
136
|
+
finish(s, mapOf("status" to "cancelled"))
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private fun listener(s: Session) =
|
|
141
|
+
object : RecognitionListener {
|
|
142
|
+
override fun onReadyForSpeech(params: Bundle?) {}
|
|
143
|
+
|
|
144
|
+
override fun onBeginningOfSpeech() {}
|
|
145
|
+
|
|
146
|
+
override fun onRmsChanged(rmsdB: Float) {}
|
|
147
|
+
|
|
148
|
+
override fun onBufferReceived(buffer: ByteArray?) {}
|
|
149
|
+
|
|
150
|
+
override fun onEndOfSpeech() {}
|
|
151
|
+
|
|
152
|
+
override fun onEvent(eventType: Int, params: Bundle?) {}
|
|
153
|
+
|
|
154
|
+
override fun onPartialResults(partialResults: Bundle?) {
|
|
155
|
+
val text = best(partialResults) ?: return
|
|
156
|
+
if (s.settled || text.isEmpty()) return
|
|
157
|
+
val args = JavaOnlyArray().apply { pushString(JSONObject(mapOf("session" to s.id, "text" to text)).toString()) }
|
|
158
|
+
try {
|
|
159
|
+
lynxContext.sendGlobalEvent("g9:speech", args)
|
|
160
|
+
} catch (_: Throwable) {
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
override fun onResults(results: Bundle?) {
|
|
165
|
+
val text = best(results)?.trim().orEmpty()
|
|
166
|
+
finish(s, if (text.isEmpty()) mapOf("status" to "no-match") else mapOf("status" to "recognized", "text" to text))
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
override fun onError(error: Int) {
|
|
170
|
+
when (error) {
|
|
171
|
+
SpeechRecognizer.ERROR_NO_MATCH, SpeechRecognizer.ERROR_SPEECH_TIMEOUT -> finish(s, mapOf("status" to "no-match"))
|
|
172
|
+
SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS -> finish(s, mapOf("status" to "denied"))
|
|
173
|
+
SpeechRecognizer.ERROR_CLIENT -> finish(s, mapOf("status" to "cancelled"))
|
|
174
|
+
else -> finishWithError(s, "speech-recognition", "Speech recognition failed (SpeechRecognizer error $error).")
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private fun best(bundle: Bundle?): String? = bundle?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)?.firstOrNull()
|
|
180
|
+
|
|
181
|
+
private fun finish(s: Session, value: Map<String, Any?>) {
|
|
182
|
+
if (s.settled) return
|
|
183
|
+
s.settled = true
|
|
184
|
+
release(s)
|
|
185
|
+
ok(s.callback, value)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
private fun finishWithError(s: Session, code: String, message: String) {
|
|
189
|
+
if (s.settled) return
|
|
190
|
+
s.settled = true
|
|
191
|
+
release(s)
|
|
192
|
+
fail(s.callback, code, message)
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private fun release(s: Session) {
|
|
196
|
+
if (current === s) current = null
|
|
197
|
+
try {
|
|
198
|
+
s.recognizer.destroy()
|
|
199
|
+
} catch (_: Throwable) {
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private companion object {
|
|
204
|
+
val nextKey = AtomicInteger()
|
|
205
|
+
}
|
|
206
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Generated by @lynx-js/autolink-codegen. Do not edit.
|
|
2
|
+
// Parameter types: scripts/android-bridge-types.mjs --fix (Lynx's bridge rejects the generator's Object).
|
|
3
|
+
package com.g9lynx.g9native.generated;
|
|
4
|
+
|
|
5
|
+
import androidx.annotation.Nullable;
|
|
6
|
+
import com.lynx.jsbridge.LynxContextModule;
|
|
7
|
+
import com.lynx.jsbridge.LynxMethod;
|
|
8
|
+
import com.lynx.react.bridge.Callback;
|
|
9
|
+
import com.lynx.tasm.behavior.LynxContext;
|
|
10
|
+
|
|
11
|
+
public abstract class G9SpeechModuleSpec extends LynxContextModule {
|
|
12
|
+
public G9SpeechModuleSpec(LynxContext context) {
|
|
13
|
+
super(context);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@LynxMethod
|
|
17
|
+
public abstract void isAvailable(String locale, Callback callback);
|
|
18
|
+
|
|
19
|
+
@LynxMethod
|
|
20
|
+
public abstract void requestPermission(Callback callback);
|
|
21
|
+
|
|
22
|
+
@LynxMethod
|
|
23
|
+
public abstract void listen(String session, String locale, Callback callback);
|
|
24
|
+
|
|
25
|
+
@LynxMethod
|
|
26
|
+
public abstract void cancel(String session);
|
|
27
|
+
}
|
package/dist/.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/@types/react/node_modules/csstype/index.d.ts","../../../node_modules/@types/prop-types/index.d.ts","../../../node_modules/@types/react/index.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/animation.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@lynx-js/types/types/common/csstype.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/animation.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/element.d.ts","../../../node_modules/@lynx-js/types/types/common/events.d.ts","../../../node_modules/@lynx-js/types/types/common/system-info.d.ts","../../../node_modules/@lynx-js/types/types/common/performance.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/lynx.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/events.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/index.d.ts","../../../node_modules/@lynx-js/types/types/common/lynx.d.ts","../../../node_modules/@lynx-js/types/types/common/global.d.ts","../../../node_modules/@lynx-js/types/types/common/props.d.ts","../../../node_modules/@lynx-js/types/types/common/element/component.d.ts","../../../node_modules/@lynx-js/types/types/common/element/filter-image.d.ts","../../../node_modules/@lynx-js/types/types/common/element/image.d.ts","../../../node_modules/@lynx-js/types/types/common/element/common.d.ts","../../../node_modules/@lynx-js/types/types/common/element/list.d.ts","../../../node_modules/@lynx-js/types/types/common/element/list-item.d.ts","../../../node_modules/@lynx-js/types/types/common/element/page.d.ts","../../../node_modules/@lynx-js/types/types/common/element/scroll-view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/text.d.ts","../../../node_modules/@lynx-js/types/types/common/element/view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/input.d.ts","../../../node_modules/@lynx-js/types/types/common/element/textarea.d.ts","../../../node_modules/@lynx-js/types/types/common/element/title-bar-view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/svg.d.ts","../../../node_modules/@lynx-js/types/types/common/element/refresh.d.ts","../../../node_modules/@lynx-js/types/types/common/element/scroll-coordinator.d.ts","../../../node_modules/@lynx-js/types/types/common/element/viewpager.d.ts","../../../node_modules/@lynx-js/types/types/common/element/blur-view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/webview.d.ts","../../../node_modules/@lynx-js/types/types/common/element/markdown.d.ts","../../../node_modules/@lynx-js/types/types/common/element/video.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/lynx-performance-entry.d.ts","../../../node_modules/@lynx-js/types/types/common/element/frame.d.ts","../../../node_modules/@lynx-js/types/types/common/element/overlay.d.ts","../../../node_modules/@lynx-js/types/types/common/element/element.d.ts","../../../node_modules/@lynx-js/types/types/common/element/methods.d.ts","../../../node_modules/@lynx-js/types/types/common/element/attributes.d.ts","../../../node_modules/@lynx-js/types/types/common/element/index.d.ts","../../../node_modules/@lynx-js/types/types/common/console.d.ts","../../../node_modules/@lynx-js/types/types/common/index.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/event.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/nodes-ref.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/app.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/performance.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/fetch.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/lynx.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/native-modules.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/text-encoder-decoder.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/index.d.ts","../../../node_modules/@lynx-js/types/types/index.d.ts","../../../node_modules/@types/react/jsx-runtime.d.ts","../../../node_modules/@lynx-js/react/runtime/jsx-runtime/index.d.ts","../../sqlite/dist/values/ids.d.ts","../../sqlite/dist/values/int64.d.ts","../../sqlite/dist/values/local-date-time.d.ts","../../sqlite/dist/values/sql-value.d.ts","../../sqlite/dist/codecs/codecs.d.ts","../../foundation/dist/collections.d.ts","../../foundation/dist/culture/digits.d.ts","../../foundation/dist/culture/culture.d.ts","../../foundation/dist/culture/calendar.d.ts","../../foundation/dist/culture/date-format.d.ts","../../foundation/dist/culture/duration.d.ts","../../foundation/dist/culture/numbers.d.ts","../../foundation/dist/culture/strings.d.ts","../../foundation/dist/culture/relative-time.d.ts","../../foundation/dist/culture/index.d.ts","../../foundation/dist/enums/index.d.ts","../../foundation/dist/errors.d.ts","../../foundation/dist/exec/diagnostics.d.ts","../../foundation/dist/services/abort.d.ts","../../foundation/dist/exec/options.d.ts","../../foundation/dist/services/clock.d.ts","../../foundation/dist/exec/trace.d.ts","../../foundation/dist/exec/safe-executor.d.ts","../../foundation/dist/exec/index.d.ts","../../foundation/dist/icons/generated/glyph-svg.d.ts","../../foundation/dist/icons/glyph.d.ts","../../foundation/dist/icons/icon.d.ts","../../foundation/dist/icons/glyph-slots.d.ts","../../foundation/dist/icons/icon-fonts.d.ts","../../foundation/dist/icons/svg.d.ts","../../foundation/dist/icons/index.d.ts","../../foundation/dist/services/preferences.d.ts","../../foundation/dist/services/contracts.d.ts","../../foundation/dist/services/index.d.ts","../../foundation/dist/theme/color.d.ts","../../foundation/dist/tokens/generated/palettes.d.ts","../../foundation/dist/theme/theme.d.ts","../../foundation/dist/theme/control-colors.d.ts","../../foundation/dist/theme/variants.d.ts","../../foundation/dist/theme/index.d.ts","../../foundation/dist/tokens/generated/metrics.d.ts","../../foundation/dist/tokens/layout-metrics.d.ts","../../foundation/dist/tokens/css-vars.d.ts","../../foundation/dist/tokens/index.d.ts","../../foundation/dist/index.d.ts","../../sqlite/dist/driver/types.d.ts","../../sqlite/dist/contract/run-contract.d.ts","../../sqlite/dist/errors.d.ts","../../sqlite/dist/schema/columns.d.ts","../../sqlite/dist/query/expr.d.ts","../../sqlite/dist/schema/policies.d.ts","../../sqlite/dist/schema/entity.d.ts","../../sqlite/dist/query/compile.d.ts","../../sqlite/dist/query/builders.d.ts","../../sqlite/dist/repo/audit.d.ts","../../sqlite/dist/session/ambient.d.ts","../../sqlite/dist/session/locator.d.ts","../../sqlite/dist/session/migrations.d.ts","../../sqlite/dist/session/mutex.d.ts","../../sqlite/dist/session/write-hooks.d.ts","../../sqlite/dist/session/database.d.ts","../../sqlite/dist/session/cache.d.ts","../../sqlite/dist/session/scope.d.ts","../../sqlite/dist/repo/repository.d.ts","../../sqlite/dist/session/schema-setup.d.ts","../../sqlite/dist/index.d.ts","../src/protocol.ts","../src/transport.ts","../src/driver.ts","../src/services.ts","../src/index.ts","../../../node_modules/@lynx-js/react/runtime/lib/runtime-marker.d.ts","../../../node_modules/preact/src/jsx.d.ts","../../../node_modules/preact/src/dom.d.ts","../../../node_modules/preact/src/index.d.ts","../../../node_modules/preact/hooks/src/index.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/hooks/react.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/runwithforce.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/lynx.d.ts","../../../node_modules/preact/compat/src/suspense.d.ts","../../../node_modules/preact/compat/src/index.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/children.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/element.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/portalspending.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/portals.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/suspense.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/hooks/uselynxglobaleventlistener.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/globalprops.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/initdata.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/background-function/run-on-background.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/worklet/call/runonmainthread.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/api/animation/effect.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/api/animation/animation.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/api/element.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/bindings/types.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/main-thread-ref.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/lynx-api.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/index.d.ts","../../../node_modules/@lynx-js/react/types/react.docs.d.ts","../../../node_modules/@lynx-js/react/types/react.d.ts","../src/media.tsx"],"fileIdsList":[[41,95,96,197,198],[172,173,178,184],[41,173],[41,172,173,178,184],[41,192],[169,172,174,176,178,179,180,182,183,194],[41,184,185,186,187,188,193],[174,175],[172,178],[41,95,197,198],[41,95,172,181,197,198],[172],[189],[191],[190],[41,95,97,196,197,198],[41,174,194,195],[42,85,86,87],[53],[42,77,86,87,88,89,91,92,93],[42,85,86,87,89,90],[85,87],[42,85],[49,77],[43],[44],[51,55],[47],[41,51,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79],[47,51,55,77],[47,51,55],[56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82],[47,51,55,59],[47,60,63],[46],[48,52,53,94],[44,47,48,49,51,53,54,55,83,84],[44,47],[52,85,94],[45,85],[46,47,55],[45,46,50,51],[49,85],[38,39,40],[41],[170,172,173,177],[170,171],[105],[104],[104,105,106],[104,105,106,107,108,109,110,111],[110],[115,117,119,120],[116],[110,115,116,117,118,119],[115,118],[124],[123],[122,123,124,125,126,127],[103,112,113,114,121,128,131,137,141],[114,116,118,129],[116,118,129,130],[114],[132,134],[132,134,135,136],[132,133],[113,132,133],[133,138,139],[133,138,139,140],[97,163,164,165],[97,164,165,166,167],[95,97,142,164,197],[97],[97,142,164],[97,163,164],[98,99,100,101],[101,143],[101,142],[142],[98,99,100,101,102,143,144,145,146,147,148,149,150,151,152,153,154,155,157,158,159,160,161,162],[101,102,147,149,150],[101,102,147],[101,102,146],[98,100,149],[100,101,142,143,147,148,149,151,157,158,159,160,163],[99,100,102],[146,147,148],[147],[98,100,142],[148,149,158],[98,100,102,142,143,149,151,153,154,155,156,157,159],[142,149],[102,143,149,158],[143,148,149,151,157,158,159,161],[142,145,147,149],[99]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"07b03f752ae52a7130e06c5a8399d3a0dde07a1a634f8430b80cd6236c56b5c8","impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"acbac4ca6cd4b2b459debc4a274535775cb6278a8315be383fafa623ab78f18e","impliedFormat":1},{"version":"e421d0b097c78304a2597c1f33da586630e1dc665ae381c0c36e5ebc4aaf4566","impliedFormat":1},{"version":"adf624c89a0d509a789f3c0bf522969d2c47033dbeb50920b37cd89be475a65e","impliedFormat":1},{"version":"8ff8dade82d215fba372ec8ca795cb433997a41287e049acf294dd50cba08cc4","impliedFormat":1},{"version":"b32b532dcbe0a91d71fd94cb780e94bdfdce10be21608d914c29fb4b8939b24a","impliedFormat":1},{"version":"eb2b64881998b562a4fe9330e55aa2466cd3a41a1a57e93feac6555218cec06f","impliedFormat":1},{"version":"6db1694d205177322d792d924335b046b80607445a45c0d2de1fcffd190b48c0","impliedFormat":1},{"version":"2b47193137d251e8a5d4cea2d67fe85a68199795ba019e41d635f7cf5f8a35c5","impliedFormat":1},{"version":"f7e5c3960dd9df65d83408b9be446f7119fa1db1dd8266dd343349d90c3bf2ce","impliedFormat":1},{"version":"09c6491ed74af89a4155feafedecaf77780f5751c66d4b65b18d30fc0e053a75","impliedFormat":1},{"version":"188b01044640e5ef65f6edf0dd6e6454f02dd19f4ead66b9e03ebe26cc7298ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"c2be64f223b024c0b70c5096a8c361c9e11c7644f3bd8325d19c2720ee7087cd","impliedFormat":1},{"version":"5bf51107315834a209b08395b141e262b7d143d14f6b4e4d403d8e020cef7e32","impliedFormat":1},{"version":"db0dcbe48d5cb38315083b412c8ab6995b0d42dc73b286833e296827feb0e5b4","impliedFormat":1},{"version":"b3e4a49a3ba19463662e7b821544948b953d2f6708370d42406bda558084000c","impliedFormat":1},{"version":"90bebc017d1c8408719f5a056813cce04e171a53469c263a136c35076121bab0","impliedFormat":1},{"version":"0675f9dddf11b81ec71825d5d97fdd789e445003506255513e0fc829ebfb795a","impliedFormat":1},{"version":"32d1e153cac16ca3a3f5f6b68fae76cddcda509950fa00d038c465776359db0c","impliedFormat":1},{"version":"0d85d0fa55dd433acf924675d7e976c025c8521c91a76079844cd15e52855ccf","impliedFormat":1},{"version":"89da6ea3ee9735e712691227b0e5ee74381779f9ad8b0f4fb7ced0247b16735a","impliedFormat":1},{"version":"37f90d8b4384dae49b873e620b7fff15655c706105104809114ba98df6373124","impliedFormat":1},{"version":"7618f7fdf0abf7f712cefe766ac1ab7fcd1f8e753c513e57d3ada9ada3a57257","impliedFormat":1},{"version":"759df9936f492afeacebec2cea4efafdb647951e0e5edfc4c677ce2441eac9d0","impliedFormat":1},{"version":"8d8848528b40a84ab42200e89d08f3d5cd83efa275de1bb70ae38cb9e6fd5911","impliedFormat":1},{"version":"0e323630cbfda771430e2720f6a2f02f257becd8fb9722aa975ae773fb572210","impliedFormat":1},{"version":"56dbc770513baae28f7cfbadeba5078bb13a37a13132a5292e98a8b103312b98","impliedFormat":1},{"version":"84ff906032fe12e816bfb7441cee6726243e5a7316c4f2d6b0a6c149f1a91a16","impliedFormat":1},{"version":"a8641f25f667160f356c504936576de22899e50ea575d7a4da47fe3b3704dd93","impliedFormat":1},{"version":"dcbbe1fb0f2c0efc12e29db8bbccb5b82513384d01d7a55342065cb0611da272","impliedFormat":1},{"version":"af209189a194cf5ad1f7b22dd680b52843fec2e30f1283be20b2977872fd4424","impliedFormat":1},{"version":"14745f699217e89ff1034f7be978bc28c195472a597b5f36442ef83d954d47b0","impliedFormat":1},{"version":"10c1feac0328f8f90a81f348b7f3c6d3c3b3454e46fc045ba1a706406c58fd8e","impliedFormat":1},{"version":"f64cd565aca17df45f4666473da75e4ce51a2610e2ed1c31198e9f9325747a24","impliedFormat":1},{"version":"e415a17ab6a413d6be640457231e045541405eab1f0f370c7dd1e5567aa25999","impliedFormat":1},{"version":"8c03a41d6dc701b6648db83d71a92dc27147d7677ab5d70f32675e7e37b3795a","impliedFormat":1},{"version":"09c18bc60888c58e8f4568b6ca973af72613a8a01e7b213aab778e910ae18b2f","impliedFormat":1},{"version":"5258d7af58615ea380d959cbcb6d83cb7b9841b8c8267f5a0fcb36c092dadbdb","impliedFormat":1},{"version":"b2d74af681f440a07e714ae9a33e3ea49c79870b9674058114c0404d2aa2f190","impliedFormat":1},{"version":"24f31e43eb3505e5d2946315e7b8ee8b426dfbe92c3031e435a4eb2d9dd8d69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"679f7b45a77210e6dd0d72a4b81fd177868d2eacfd8ee6919ce6babd7512562d","impliedFormat":1},{"version":"c669ee7ba01fa6a60b17c3535f96b65fa82dfd2a475a8760364f2f3952f9bcbd","impliedFormat":1},{"version":"a8b121f6a75d603075e62793ff0c109112e882dd6ca2b70bdccbd8d8f753429b","impliedFormat":1},{"version":"f378d7ed5e3ecbe382ade55127a9c98e826c76f786e06effad6fde91a7023d55","impliedFormat":1},{"version":"4e3e9539df72b3bfcc56fa13140070020dac72f1eff39237b11253482cb99847","impliedFormat":1},{"version":"5a47b3a2bbe2c9b015fe356462afe0abe391c592fffbe277126e2415e0811967","impliedFormat":1},{"version":"a3e797c70a421cda37cdea4349dced37dceb1611669652d9c4c5523467a55cbf","impliedFormat":1},{"version":"9164e652ff4e7cbd993ca20acd0e2ad7e1cb775a7aefc577b506cf588763ec42","impliedFormat":1},{"version":"e52840670587e82e129c9bfc6a2f42d9c2f2e1fd6ce176fea998383a8c941ea5","impliedFormat":1},{"version":"31ca1ee726f5d7c7709913b98be76fc40fdfaaca6ad7fafc222108981e11227c","impliedFormat":1},{"version":"556db73da59f5162cdf5c7ea1bc3b063b6ccb758078ef6517ad6f6e4ae7b199a","impliedFormat":1},{"version":"0a2c8ef08611f5a5f711c7b10ba70d10dc1c6af0c9dba8168cbbf34911b74188","impliedFormat":1},{"version":"1d6ef45145a9939a43062fe18188d4f7bdfdf4547978e1f6b7c9089fe53e81e5","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"509a86836776d5c821901abc16a2d21de674d2c8943ceb8d018049bf324bc56c","impliedFormat":99},"bbe47f7ebb177015803b69bad47ecf0e5987449cae5dd498664a9e4885d7cdff","4f260a074507a0065f3cd71d1adc1b361f5337b3db9e8d01589d5872e9387a4a","7674dcae15d29bcba5a7e8c26defdb06bf75297bfaa3025037bcc1e4df7b0ae1","97ff954e351fb81e182a8bc0d7c6e3625054e2c37ea5df0ad0ea12952bd5d9c0","c65ecf314f579465ceba2eb45ec7529f977a7809480ff6119c7c129022472cca","d533d1fe3018752aa47ee74ae5dbdca34377441b891176ad99bd33366a64372f","44b82e4f46178400732ea809a906f7ffb9dd38efab331ca23e7ca4586bf903ef","d3dcff003bac57338c3e60be409d0ff167ec1ff513539a5534c7679332dbc992","16d64c89cec74fa23e8cee7c72acc7549f117dcf7845051870c40366c7522d09","11f9f682c02d51de68eed569f8de1e91c56df296a78f3a6c520b93d52aac2308","28b43630d8d29a300e1e5b0f5efb04c8f994d372fff1b653ce8bb70d4e011e1a","b06c48902c3d127098839c1a6500f41d3e21b2f07f277ba7de23ec730df7275d","94659c94bb0ae17efde21aaf59f2beb05d286bea13f2d3b2b288a6df4faeac18","a7a0e658ca429cfb5268d4bf2e2e6e9fe871ffd06b6588d65424ba4eba35338f","ab4c80cb9cf211a7cd100429cb4a823c5bd9f3618bf981e6504c6606abf08656","e60dd3f69310681e28813b910da7d57f5cf0078feccfd683d22a29b45bb7a035","ccd708c3fff99b4ec315e14315dce6b9e85f4c96d10131e9fd219edb6efbdb26","abc924fce33b86b9f8588de3a5be04c609fafa6cb1dc42629b3e9e3e18f7d018","f919e3a8b2d274b631ee4fee0c50eba1d3f39ceaccba04dff915e9f61e9f153c","3ae17ae844491c7326d070c3e70a94a9239394e7a1e84eb203eb1d57470e752e","d1b2970d348eb9f89ef0f0c6730d27e9331067a28f21c8bd667ba1138d5d3e93","b2c4833e6308888c3947953770b3343deaf4276c803bb36148991a3fb90b4f6a","41b7c8204ea79a93e380a228f5c744e9c9a80183133ac62633a4c76e3fdbd7db","d0a441df587b0632c16a813117f110574d903ddd0bc4d28599cc82ff8af7c094","b24ac81f4fcff56ed9827736abcf2f92ea5f86e16d66eb2ee3ccfa0bb8143bc9","068309ff581d08c276c4a772ddf3ab9c8090e591fc9917fdc6cdffc12c95a5bf","5c1d368a451520260ebb6c06121201f18abf86d80540290df6e424d372c5d0ed","bb3ccaacf5c19a7170939b7f735c6a94537fd95ad16b4247a6ad572b23183e74","2c8b86d9d29c4ea62762c3815ffe4fdb0c5dbc0dd096b9703236010f4a17c255","9528dc401d1a2502393af70423c895c3df61ef62240c0dca429a7cd1bd535b82","eebf270ff516980678bf039e03e18a9461f196aee2825d4d65f7d8a1fa362bff","ee4e73f46ce2f6517e82434bd9fc63c8b6b2179d37d74525899f124a76d06669","b04de3a3cd10559130d898b36da5612fda5db2c31c95b502077cad9fe538ed6c","bc4c3476708a74ae09c06bcdbb9765baaa135592e1cf6e25f2ee9a942c6cd5ec","29e6e980f179ac2981d68954462dfd4a4545f73c021f6a4c8a5f442c0e16e56c","faa64d270fa523f80fd31bc7340ee7f6a21632c2ea0cea6535bf5a34bcc6adf7","cbd4ce7ee090549d836cbffac2e76a192ac5b1c5f15bcbe29c06d32dc7006f34","ea5a5d5873c239b97d846fb8c78437e08ffd731924764f746c0ebcb7731d7648","fb6b5b4592e0eca5b8dc2507432e621a18c16d488ae8a610e4d1ddba1edff667","df85ab12f80aced067959d43bd7744017fccb1eb95adcfa343f16cba7c9ef670","613df14d2c8c0ba78286705c4ed01ec701ed03189ca3803dd69bc7086b9c02ff","298f8d2584216932ea238927177ef343d0b8da735eb40a5ba96b1f92e3675e33","c8082c78975419ed5a9f7daa655643425cdd98fee91bb82fd92d25f908c78465","3d1717d66cd1094139f0c1f0ed07ec56d91e4f5cd27e2b6309b6f195491e7f4a","6f1302be2fa00d8a64e3bd48b4ccdf5d77a402441d7728d48c2ecee706c79127","efb30c7f5b1e7e2c8941c95355161907fdd6f3f28941cceacf81edc11db89bad","37700ef2907cfee5d680c1ceb83ba8355223f375c8093f523b9ee2ce108c1044","a244408662b901d15567a5bcff4b29cd13a2a6c9bb2c27329eec616c48c8f144","cf4c01af6890db612fcb2eda144fa7a947a0fd005052f41485459d195cd7396d","770c7abd7f2b17ff392e7179ad9b14518bc284f18834ec6efc00b4c62b8a4846","f29c840652a2d49e5b24debe0c06f9dd6ca15f96421cbac112ba982258b16a94","44a3d19d7e208acb0261a1f718c047854d0794683a0d5c2193522d310e36bdec","090ce3b05198a4c287542354fcedbfd570d87b2f32d0363cab0eb48989aecd2e","ad4b4e5abb5f01f966304dfa08c347137a3fe77329c7ae6c17c824c3d4babf33","b78cb18aa49943470bbab837676a7c35d1dfbfae7241c144f1d7fbd183989022","024aeda8ac048f7b98839a2b806e2034fe2fa1db797418cf8923a06fb32358c8","54f9c37e150e434622cff5d71fb87237c48497141cb379fc1ab4d019a4a43e2e","0d912ede0e33119759d7a3eee223fcbb83f1ca4c229719c62d54aa071487ceca","6f5878e8666a8abbb560dcc15b19c95ac5b0f4f85aabab2e804abb6a145030e4","ac683a7d8aa2506a3d5a3243ed94348867c85307ba54e46e6dd4a440b6a3012d","cf08b5dd44744b109ed2ddb8968bc8cbd4c6192b74180e5fb0fb1671f38d5dbc","efa3706b88ec75d05bfa7fa44d39af58305b7affda1b3789cf6d3688bb83070b","0a589d620f1d4719925c345e3c6e17dde3137765ea8db58c5a790f52ccdc58a6","8a3a12f093b91e0e3ca5f9909fb0cbaed59e2d864f04f103487f8f87095dfbfb","07d6a4c577cad80d9c1a2cf5d0e0ddae1aafadb264f5e41396999edd5963c94d","ba23c12c72c1523b39716c37b20fddaaab05f3f82139c8cdc33d552c3de70684",{"version":"4643eefbe63f810c9a62806874ee74b9f845e3ac41d271302dcbc8b41aa565c0","signature":"ef010a3efd3a152c93ad02fee09ae186c4325672de691cf20c2d5b634d560117"},{"version":"b196a892a7087bc69d5e14a1647aaf5acfcdf995c1935a55afe405253c153b4c","signature":"f63a428eadbfdbc8c9137c4bdaa77a23988f7e82d1b01b5ef7d13e2f37d3d044"},{"version":"bb4df5f784c131c8fc70cfb1868ab99b883347d48c7260450d3c56958a996d60","signature":"b2b0e3e6fd8b425abfb54a11133c8b9abfc186d61ac86adc8deaba0b8c2f4e8f"},{"version":"faf3b4d50980988d8870ec5a63705d314d100f0338e3c9978362acea7a50e825","signature":"bd3f683b47db8bdf2c50f5c3becea6fd0610f1e70ae35e0a2d0605c7200b6719"},{"version":"0763d2dcc3c222b35e5692a428540b531055e3344853e6ec9519cd914f36a1ad","signature":"1b4441c0bc7e477dcec93ac03d68c33a05edd9369a6f1c205f797c325c9f4bf5"},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":99},{"version":"8a2ef120c4da7aab664148ed8d283aa0b98df4d5f15c570d830c8998ef05718b","impliedFormat":1},{"version":"4433d18f82991634feae5150a68f9b30f5b05b55416af8ff9f7251fb29431ed5","impliedFormat":1},{"version":"cc5d0b221824b7d8597e8a2bbdad2383af877eb564eaca392992049839e88c9e","impliedFormat":1},{"version":"21898d939444825cee1232af435330610b09171bea22a2f892cf2058d764b63d","impliedFormat":1},{"version":"6ec5f3b496e6f10c4f0a079e3b1102acef9c0bf5e3464909fa6e88b16a26480f","impliedFormat":99},{"version":"d9d320cf31f6d63659484f6c9ca4db4ae673daefa65118dd8589838925ff1397","impliedFormat":99},{"version":"027cf2216d065a97bf5a8ea126b3ea2734fab6cfe32adaff81ab4e94a1b51bbe","impliedFormat":99},{"version":"f6e6313fad233c5141220f7d25eae120cdd6e5079fbe0aba56821a1e99d05df8","impliedFormat":1},{"version":"9534c35b4577c193e499178deb47419fdadddd5e53af5ec8cb88218848013f65","impliedFormat":1},{"version":"804dca323c25404588a6e71d76e52eb09806f05e6013f0be1fcea1fb7eed5fa3","impliedFormat":99},{"version":"aeba529dfa69caa0efcdee1f1455540250d026522e5551b20b8a7ba9eebc707a","impliedFormat":99},{"version":"dfe6945467765f8e7843442a9dfbcf6b5526b6465b07b4c75a54a750329b5f17","impliedFormat":99},{"version":"7f9f6c9fe0e48c401d855d849e28112ffe2425569eca01b08b8c6112b8200695","impliedFormat":99},{"version":"68fcdc663627d12d336b420b19b3e54258844d0cbca0879f711c22aafd853352","impliedFormat":99},{"version":"6e97a7762ca61b836f275a14bf22a1696559bfa01bd6176df9498e717b5ff298","impliedFormat":99},{"version":"86535783bd695ee43e1a403e8cc50b1d643d3741df8074d30fbfae3b0438f996","impliedFormat":99},{"version":"7c94c072f4eef88b15710e2a6dd17036bfd943b390976aecc94af63df2f8a287","impliedFormat":99},{"version":"7e8a2efc54958a4ea7d678671d8703b00ae48a519d0f795a8f44f605abdba3d5","impliedFormat":99},{"version":"1409a9680115403cac91934df0062646e0a77f1b220b60faec5fe26cd775d9ca","impliedFormat":99},{"version":"335226d599a9382c9bea07d37e23bf998c1022c0f67e4d6d2b69633de6ac118f","impliedFormat":99},{"version":"ae430fd9bac320e71c3fe9299d90dcf67555d9a4f97ecaa35947b430ba8648ea","impliedFormat":99},{"version":"9061ff14146280f47d740b344ddd641c16df526ecaa868c348852277a9fb8686","impliedFormat":99},{"version":"7fa70acc5eed701b456f21e33f8f289e9e0e77fdd1f952385c33d6b9ecfb2021","impliedFormat":99},{"version":"16c6bbe197b6bf88db162c620e37218fab4c1c32892132d4aa33e461ae2b990a","impliedFormat":99},{"version":"9778598e1d86d1e544ab77fbc0bb5199d2fbb08ed386b3520732246b90005545","impliedFormat":99},{"version":"feed66ae8815d1981ad575482766fb9a82385e75cce35ae2f13be58e50c4349f","impliedFormat":99},{"version":"7e500d1f51b14c04c6dce8dcbadc5c48f4bec6fca0f321397c165868834916a2","affectsGlobalScope":true,"impliedFormat":99},{"version":"20c1041fbd4f1537686af4b707872b87c90a22201f8979e5def4554d28b46a5b","impliedFormat":99},{"version":"57ff3023920f09ea08ee1fb662518ff60312e81781e03c4e3b50cef3322143be","signature":"495d5d4a044fa18020972e7146c7416e467a364a9b23de05b096335d212ac9bb"}],"root":[[164,168],198],"options":{"composite":true,"declaration":true,"declarationDir":"./","declarationMap":true,"emitDeclarationOnly":true,"exactOptionalPropertyTypes":true,"jsx":4,"jsxImportSource":"@lynx-js/react","module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":6,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[97,1],[185,2],[174,3],[186,4],[193,5],[195,6],[194,7],[176,8],[179,9],[180,10],[182,11],[183,12],[190,13],[189,14],[191,15],[192,14],[197,16],[196,17],[88,18],[90,19],[94,20],[91,21],[92,22],[87,23],[89,24],[44,25],[82,26],[73,27],[59,28],[56,27],[80,29],[57,27],[78,30],[58,31],[83,32],[66,31],[61,27],[60,33],[75,31],[81,34],[79,31],[62,27],[70,31],[71,31],[63,33],[69,31],[64,31],[67,31],[68,27],[76,31],[65,27],[72,31],[74,31],[47,35],[54,36],[85,37],[55,38],[95,39],[45,35],[46,40],[51,41],[52,42],[50,43],[41,44],[96,45],[178,46],[177,12],[173,12],[171,12],[172,47],[170,12],[106,48],[105,49],[107,50],[112,51],[109,49],[111,52],[110,48],[121,53],[117,54],[120,55],[119,56],[125,57],[126,57],[124,58],[128,59],[127,58],[142,60],[130,61],[131,62],[132,63],[135,64],[137,65],[134,66],[136,67],[140,68],[141,69],[166,70],[168,71],[198,72],[164,73],[167,74],[165,75],[102,76],[144,77],[143,78],[145,79],[163,80],[151,81],[150,82],[147,83],[152,84],[161,85],[146,86],[149,87],[148,88],[153,89],[159,90],[158,91],[155,92],[162,93],[160,94],[157,95],[101,96]],"latestChangedDtsFile":"./media.d.ts","version":"5.9.3"}
|
|
1
|
+
{"fileNames":["../../../node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../node_modules/@types/react/global.d.ts","../../../node_modules/@types/react/node_modules/csstype/index.d.ts","../../../node_modules/@types/prop-types/index.d.ts","../../../node_modules/@types/react/index.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/animation.d.ts","../../../node_modules/csstype/index.d.ts","../../../node_modules/@lynx-js/types/types/common/csstype.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/animation.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/element.d.ts","../../../node_modules/@lynx-js/types/types/common/events.d.ts","../../../node_modules/@lynx-js/types/types/common/system-info.d.ts","../../../node_modules/@lynx-js/types/types/common/performance.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/lynx.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/events.d.ts","../../../node_modules/@lynx-js/types/types/main-thread/index.d.ts","../../../node_modules/@lynx-js/types/types/common/lynx.d.ts","../../../node_modules/@lynx-js/types/types/common/global.d.ts","../../../node_modules/@lynx-js/types/types/common/props.d.ts","../../../node_modules/@lynx-js/types/types/common/element/component.d.ts","../../../node_modules/@lynx-js/types/types/common/element/filter-image.d.ts","../../../node_modules/@lynx-js/types/types/common/element/image.d.ts","../../../node_modules/@lynx-js/types/types/common/element/common.d.ts","../../../node_modules/@lynx-js/types/types/common/element/list.d.ts","../../../node_modules/@lynx-js/types/types/common/element/list-item.d.ts","../../../node_modules/@lynx-js/types/types/common/element/page.d.ts","../../../node_modules/@lynx-js/types/types/common/element/scroll-view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/text.d.ts","../../../node_modules/@lynx-js/types/types/common/element/view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/input.d.ts","../../../node_modules/@lynx-js/types/types/common/element/textarea.d.ts","../../../node_modules/@lynx-js/types/types/common/element/title-bar-view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/svg.d.ts","../../../node_modules/@lynx-js/types/types/common/element/refresh.d.ts","../../../node_modules/@lynx-js/types/types/common/element/scroll-coordinator.d.ts","../../../node_modules/@lynx-js/types/types/common/element/viewpager.d.ts","../../../node_modules/@lynx-js/types/types/common/element/blur-view.d.ts","../../../node_modules/@lynx-js/types/types/common/element/webview.d.ts","../../../node_modules/@lynx-js/types/types/common/element/markdown.d.ts","../../../node_modules/@lynx-js/types/types/common/element/video.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/lynx-performance-entry.d.ts","../../../node_modules/@lynx-js/types/types/common/element/frame.d.ts","../../../node_modules/@lynx-js/types/types/common/element/overlay.d.ts","../../../node_modules/@lynx-js/types/types/common/element/element.d.ts","../../../node_modules/@lynx-js/types/types/common/element/methods.d.ts","../../../node_modules/@lynx-js/types/types/common/element/attributes.d.ts","../../../node_modules/@lynx-js/types/types/common/element/index.d.ts","../../../node_modules/@lynx-js/types/types/common/console.d.ts","../../../node_modules/@lynx-js/types/types/common/index.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/event.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/nodes-ref.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/app.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/performance.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/fetch.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/lynx.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/native-modules.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/text-encoder-decoder.d.ts","../../../node_modules/@lynx-js/types/types/background-thread/index.d.ts","../../../node_modules/@lynx-js/types/types/index.d.ts","../../../node_modules/@types/react/jsx-runtime.d.ts","../../../node_modules/@lynx-js/react/runtime/jsx-runtime/index.d.ts","../../sqlite/dist/values/ids.d.ts","../../sqlite/dist/values/int64.d.ts","../../sqlite/dist/values/local-date-time.d.ts","../../sqlite/dist/values/sql-value.d.ts","../../sqlite/dist/codecs/codecs.d.ts","../../foundation/dist/collections.d.ts","../../foundation/dist/culture/digits.d.ts","../../foundation/dist/culture/culture.d.ts","../../foundation/dist/culture/calendar.d.ts","../../foundation/dist/culture/date-format.d.ts","../../foundation/dist/culture/duration.d.ts","../../foundation/dist/culture/numbers.d.ts","../../foundation/dist/culture/strings.d.ts","../../foundation/dist/culture/relative-time.d.ts","../../foundation/dist/culture/index.d.ts","../../foundation/dist/enums/index.d.ts","../../foundation/dist/errors.d.ts","../../foundation/dist/exec/diagnostics.d.ts","../../foundation/dist/services/abort.d.ts","../../foundation/dist/exec/options.d.ts","../../foundation/dist/services/clock.d.ts","../../foundation/dist/exec/trace.d.ts","../../foundation/dist/exec/safe-executor.d.ts","../../foundation/dist/exec/index.d.ts","../../foundation/dist/icons/generated/glyph-svg.d.ts","../../foundation/dist/icons/glyph.d.ts","../../foundation/dist/icons/icon.d.ts","../../foundation/dist/icons/glyph-slots.d.ts","../../foundation/dist/icons/icon-fonts.d.ts","../../foundation/dist/icons/svg.d.ts","../../foundation/dist/icons/index.d.ts","../../foundation/dist/services/preferences.d.ts","../../foundation/dist/services/contracts.d.ts","../../foundation/dist/services/index.d.ts","../../foundation/dist/theme/color.d.ts","../../foundation/dist/tokens/generated/palettes.d.ts","../../foundation/dist/theme/theme.d.ts","../../foundation/dist/theme/control-colors.d.ts","../../foundation/dist/theme/variants.d.ts","../../foundation/dist/theme/index.d.ts","../../foundation/dist/tokens/generated/metrics.d.ts","../../foundation/dist/tokens/layout-metrics.d.ts","../../foundation/dist/tokens/css-vars.d.ts","../../foundation/dist/tokens/index.d.ts","../../foundation/dist/index.d.ts","../../sqlite/dist/driver/types.d.ts","../../sqlite/dist/contract/run-contract.d.ts","../../sqlite/dist/errors.d.ts","../../sqlite/dist/schema/columns.d.ts","../../sqlite/dist/query/expr.d.ts","../../sqlite/dist/schema/policies.d.ts","../../sqlite/dist/schema/entity.d.ts","../../sqlite/dist/query/compile.d.ts","../../sqlite/dist/query/builders.d.ts","../../sqlite/dist/repo/audit.d.ts","../../sqlite/dist/session/ambient.d.ts","../../sqlite/dist/session/locator.d.ts","../../sqlite/dist/session/migrations.d.ts","../../sqlite/dist/session/mutex.d.ts","../../sqlite/dist/session/write-hooks.d.ts","../../sqlite/dist/session/database.d.ts","../../sqlite/dist/session/cache.d.ts","../../sqlite/dist/session/scope.d.ts","../../sqlite/dist/repo/repository.d.ts","../../sqlite/dist/session/schema-setup.d.ts","../../sqlite/dist/index.d.ts","../src/protocol.ts","../src/transport.ts","../src/driver.ts","../src/services.ts","../src/speech.ts","../src/index.ts","../../../node_modules/@lynx-js/react/runtime/lib/runtime-marker.d.ts","../../../node_modules/preact/src/jsx.d.ts","../../../node_modules/preact/src/dom.d.ts","../../../node_modules/preact/src/index.d.ts","../../../node_modules/preact/hooks/src/index.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/hooks/react.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/runwithforce.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/lynx.d.ts","../../../node_modules/preact/compat/src/suspense.d.ts","../../../node_modules/preact/compat/src/index.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/children.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/element.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/portalspending.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/portals.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/lynx/suspense.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/hooks/uselynxglobaleventlistener.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/globalprops.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/initdata.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/background-function/run-on-background.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/snapshot/worklet/call/runonmainthread.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/api/animation/effect.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/api/animation/animation.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/api/element.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/worklet-runtime/bindings/types.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/core/main-thread-ref.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/lynx-api.d.ts","../../../node_modules/@lynx-js/react/runtime/lib/index.d.ts","../../../node_modules/@lynx-js/react/types/react.docs.d.ts","../../../node_modules/@lynx-js/react/types/react.d.ts","../src/media.tsx"],"fileIdsList":[[41,95,96,198,199],[173,174,179,185],[41,174],[41,173,174,179,185],[41,193],[170,173,175,177,179,180,181,183,184,195],[41,185,186,187,188,189,194],[175,176],[173,179],[41,95,198,199],[41,95,173,182,198,199],[173],[190],[192],[191],[41,95,97,197,198,199],[41,175,195,196],[42,85,86,87],[53],[42,77,86,87,88,89,91,92,93],[42,85,86,87,89,90],[85,87],[42,85],[49,77],[43],[44],[51,55],[47],[41,51,55,56,57,58,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79],[47,51,55,77],[47,51,55],[56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,79,80,81,82],[47,51,55,59],[47,60,63],[46],[48,52,53,94],[44,47,48,49,51,53,54,55,83,84],[44,47],[52,85,94],[45,85],[46,47,55],[45,46,50,51],[49,85],[38,39,40],[41],[171,173,174,178],[171,172],[105],[104],[104,105,106],[104,105,106,107,108,109,110,111],[110],[115,117,119,120],[116],[110,115,116,117,118,119],[115,118],[124],[123],[122,123,124,125,126,127],[103,112,113,114,121,128,131,137,141],[114,116,118,129],[116,118,129,130],[114],[132,134],[132,134,135,136],[132,133],[113,132,133],[133,138,139],[133,138,139,140],[97,163,164,165],[97,164,165,166,167,168],[95,97,142,164,198],[97],[97,142,164],[97,163,164],[98,99,100,101],[101,143],[101,142],[142],[98,99,100,101,102,143,144,145,146,147,148,149,150,151,152,153,154,155,157,158,159,160,161,162],[101,102,147,149,150],[101,102,147],[101,102,146],[98,100,149],[100,101,142,143,147,148,149,151,157,158,159,160,163],[99,100,102],[146,147,148],[147],[98,100,142],[148,149,158],[98,100,102,142,143,149,151,153,154,155,156,157,159],[142,149],[102,143,149,158],[143,148,149,151,157,158,159,161],[142,145,147,149],[99]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"035312d4945d13efa134ae482f6dc56a1a9346f7ac3be7ccbad5741058ce87f3","affectsGlobalScope":true,"impliedFormat":1},{"version":"07b03f752ae52a7130e06c5a8399d3a0dde07a1a634f8430b80cd6236c56b5c8","impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"acbac4ca6cd4b2b459debc4a274535775cb6278a8315be383fafa623ab78f18e","impliedFormat":1},{"version":"e421d0b097c78304a2597c1f33da586630e1dc665ae381c0c36e5ebc4aaf4566","impliedFormat":1},{"version":"adf624c89a0d509a789f3c0bf522969d2c47033dbeb50920b37cd89be475a65e","impliedFormat":1},{"version":"8ff8dade82d215fba372ec8ca795cb433997a41287e049acf294dd50cba08cc4","impliedFormat":1},{"version":"b32b532dcbe0a91d71fd94cb780e94bdfdce10be21608d914c29fb4b8939b24a","impliedFormat":1},{"version":"eb2b64881998b562a4fe9330e55aa2466cd3a41a1a57e93feac6555218cec06f","impliedFormat":1},{"version":"6db1694d205177322d792d924335b046b80607445a45c0d2de1fcffd190b48c0","impliedFormat":1},{"version":"2b47193137d251e8a5d4cea2d67fe85a68199795ba019e41d635f7cf5f8a35c5","impliedFormat":1},{"version":"f7e5c3960dd9df65d83408b9be446f7119fa1db1dd8266dd343349d90c3bf2ce","impliedFormat":1},{"version":"09c6491ed74af89a4155feafedecaf77780f5751c66d4b65b18d30fc0e053a75","impliedFormat":1},{"version":"188b01044640e5ef65f6edf0dd6e6454f02dd19f4ead66b9e03ebe26cc7298ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"c2be64f223b024c0b70c5096a8c361c9e11c7644f3bd8325d19c2720ee7087cd","impliedFormat":1},{"version":"5bf51107315834a209b08395b141e262b7d143d14f6b4e4d403d8e020cef7e32","impliedFormat":1},{"version":"db0dcbe48d5cb38315083b412c8ab6995b0d42dc73b286833e296827feb0e5b4","impliedFormat":1},{"version":"b3e4a49a3ba19463662e7b821544948b953d2f6708370d42406bda558084000c","impliedFormat":1},{"version":"90bebc017d1c8408719f5a056813cce04e171a53469c263a136c35076121bab0","impliedFormat":1},{"version":"0675f9dddf11b81ec71825d5d97fdd789e445003506255513e0fc829ebfb795a","impliedFormat":1},{"version":"32d1e153cac16ca3a3f5f6b68fae76cddcda509950fa00d038c465776359db0c","impliedFormat":1},{"version":"0d85d0fa55dd433acf924675d7e976c025c8521c91a76079844cd15e52855ccf","impliedFormat":1},{"version":"89da6ea3ee9735e712691227b0e5ee74381779f9ad8b0f4fb7ced0247b16735a","impliedFormat":1},{"version":"37f90d8b4384dae49b873e620b7fff15655c706105104809114ba98df6373124","impliedFormat":1},{"version":"7618f7fdf0abf7f712cefe766ac1ab7fcd1f8e753c513e57d3ada9ada3a57257","impliedFormat":1},{"version":"759df9936f492afeacebec2cea4efafdb647951e0e5edfc4c677ce2441eac9d0","impliedFormat":1},{"version":"8d8848528b40a84ab42200e89d08f3d5cd83efa275de1bb70ae38cb9e6fd5911","impliedFormat":1},{"version":"0e323630cbfda771430e2720f6a2f02f257becd8fb9722aa975ae773fb572210","impliedFormat":1},{"version":"56dbc770513baae28f7cfbadeba5078bb13a37a13132a5292e98a8b103312b98","impliedFormat":1},{"version":"84ff906032fe12e816bfb7441cee6726243e5a7316c4f2d6b0a6c149f1a91a16","impliedFormat":1},{"version":"a8641f25f667160f356c504936576de22899e50ea575d7a4da47fe3b3704dd93","impliedFormat":1},{"version":"dcbbe1fb0f2c0efc12e29db8bbccb5b82513384d01d7a55342065cb0611da272","impliedFormat":1},{"version":"af209189a194cf5ad1f7b22dd680b52843fec2e30f1283be20b2977872fd4424","impliedFormat":1},{"version":"14745f699217e89ff1034f7be978bc28c195472a597b5f36442ef83d954d47b0","impliedFormat":1},{"version":"10c1feac0328f8f90a81f348b7f3c6d3c3b3454e46fc045ba1a706406c58fd8e","impliedFormat":1},{"version":"f64cd565aca17df45f4666473da75e4ce51a2610e2ed1c31198e9f9325747a24","impliedFormat":1},{"version":"e415a17ab6a413d6be640457231e045541405eab1f0f370c7dd1e5567aa25999","impliedFormat":1},{"version":"8c03a41d6dc701b6648db83d71a92dc27147d7677ab5d70f32675e7e37b3795a","impliedFormat":1},{"version":"09c18bc60888c58e8f4568b6ca973af72613a8a01e7b213aab778e910ae18b2f","impliedFormat":1},{"version":"5258d7af58615ea380d959cbcb6d83cb7b9841b8c8267f5a0fcb36c092dadbdb","impliedFormat":1},{"version":"b2d74af681f440a07e714ae9a33e3ea49c79870b9674058114c0404d2aa2f190","impliedFormat":1},{"version":"24f31e43eb3505e5d2946315e7b8ee8b426dfbe92c3031e435a4eb2d9dd8d69f","affectsGlobalScope":true,"impliedFormat":1},{"version":"679f7b45a77210e6dd0d72a4b81fd177868d2eacfd8ee6919ce6babd7512562d","impliedFormat":1},{"version":"c669ee7ba01fa6a60b17c3535f96b65fa82dfd2a475a8760364f2f3952f9bcbd","impliedFormat":1},{"version":"a8b121f6a75d603075e62793ff0c109112e882dd6ca2b70bdccbd8d8f753429b","impliedFormat":1},{"version":"f378d7ed5e3ecbe382ade55127a9c98e826c76f786e06effad6fde91a7023d55","impliedFormat":1},{"version":"4e3e9539df72b3bfcc56fa13140070020dac72f1eff39237b11253482cb99847","impliedFormat":1},{"version":"5a47b3a2bbe2c9b015fe356462afe0abe391c592fffbe277126e2415e0811967","impliedFormat":1},{"version":"a3e797c70a421cda37cdea4349dced37dceb1611669652d9c4c5523467a55cbf","impliedFormat":1},{"version":"9164e652ff4e7cbd993ca20acd0e2ad7e1cb775a7aefc577b506cf588763ec42","impliedFormat":1},{"version":"e52840670587e82e129c9bfc6a2f42d9c2f2e1fd6ce176fea998383a8c941ea5","impliedFormat":1},{"version":"31ca1ee726f5d7c7709913b98be76fc40fdfaaca6ad7fafc222108981e11227c","impliedFormat":1},{"version":"556db73da59f5162cdf5c7ea1bc3b063b6ccb758078ef6517ad6f6e4ae7b199a","impliedFormat":1},{"version":"0a2c8ef08611f5a5f711c7b10ba70d10dc1c6af0c9dba8168cbbf34911b74188","impliedFormat":1},{"version":"1d6ef45145a9939a43062fe18188d4f7bdfdf4547978e1f6b7c9089fe53e81e5","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"509a86836776d5c821901abc16a2d21de674d2c8943ceb8d018049bf324bc56c","impliedFormat":99},"bbe47f7ebb177015803b69bad47ecf0e5987449cae5dd498664a9e4885d7cdff","4f260a074507a0065f3cd71d1adc1b361f5337b3db9e8d01589d5872e9387a4a","7674dcae15d29bcba5a7e8c26defdb06bf75297bfaa3025037bcc1e4df7b0ae1","97ff954e351fb81e182a8bc0d7c6e3625054e2c37ea5df0ad0ea12952bd5d9c0","c65ecf314f579465ceba2eb45ec7529f977a7809480ff6119c7c129022472cca","d533d1fe3018752aa47ee74ae5dbdca34377441b891176ad99bd33366a64372f","44b82e4f46178400732ea809a906f7ffb9dd38efab331ca23e7ca4586bf903ef","d3dcff003bac57338c3e60be409d0ff167ec1ff513539a5534c7679332dbc992","16d64c89cec74fa23e8cee7c72acc7549f117dcf7845051870c40366c7522d09","11f9f682c02d51de68eed569f8de1e91c56df296a78f3a6c520b93d52aac2308","28b43630d8d29a300e1e5b0f5efb04c8f994d372fff1b653ce8bb70d4e011e1a","b06c48902c3d127098839c1a6500f41d3e21b2f07f277ba7de23ec730df7275d","94659c94bb0ae17efde21aaf59f2beb05d286bea13f2d3b2b288a6df4faeac18","a7a0e658ca429cfb5268d4bf2e2e6e9fe871ffd06b6588d65424ba4eba35338f","ab4c80cb9cf211a7cd100429cb4a823c5bd9f3618bf981e6504c6606abf08656","e60dd3f69310681e28813b910da7d57f5cf0078feccfd683d22a29b45bb7a035","ccd708c3fff99b4ec315e14315dce6b9e85f4c96d10131e9fd219edb6efbdb26","abc924fce33b86b9f8588de3a5be04c609fafa6cb1dc42629b3e9e3e18f7d018","f919e3a8b2d274b631ee4fee0c50eba1d3f39ceaccba04dff915e9f61e9f153c","3ae17ae844491c7326d070c3e70a94a9239394e7a1e84eb203eb1d57470e752e","d1b2970d348eb9f89ef0f0c6730d27e9331067a28f21c8bd667ba1138d5d3e93","b2c4833e6308888c3947953770b3343deaf4276c803bb36148991a3fb90b4f6a","41b7c8204ea79a93e380a228f5c744e9c9a80183133ac62633a4c76e3fdbd7db","d0a441df587b0632c16a813117f110574d903ddd0bc4d28599cc82ff8af7c094","b24ac81f4fcff56ed9827736abcf2f92ea5f86e16d66eb2ee3ccfa0bb8143bc9","068309ff581d08c276c4a772ddf3ab9c8090e591fc9917fdc6cdffc12c95a5bf","5c1d368a451520260ebb6c06121201f18abf86d80540290df6e424d372c5d0ed","bb3ccaacf5c19a7170939b7f735c6a94537fd95ad16b4247a6ad572b23183e74","2c8b86d9d29c4ea62762c3815ffe4fdb0c5dbc0dd096b9703236010f4a17c255","9528dc401d1a2502393af70423c895c3df61ef62240c0dca429a7cd1bd535b82","eebf270ff516980678bf039e03e18a9461f196aee2825d4d65f7d8a1fa362bff","ee4e73f46ce2f6517e82434bd9fc63c8b6b2179d37d74525899f124a76d06669","b04de3a3cd10559130d898b36da5612fda5db2c31c95b502077cad9fe538ed6c","bc4c3476708a74ae09c06bcdbb9765baaa135592e1cf6e25f2ee9a942c6cd5ec","29e6e980f179ac2981d68954462dfd4a4545f73c021f6a4c8a5f442c0e16e56c","faa64d270fa523f80fd31bc7340ee7f6a21632c2ea0cea6535bf5a34bcc6adf7","cbd4ce7ee090549d836cbffac2e76a192ac5b1c5f15bcbe29c06d32dc7006f34","ea5a5d5873c239b97d846fb8c78437e08ffd731924764f746c0ebcb7731d7648","fb6b5b4592e0eca5b8dc2507432e621a18c16d488ae8a610e4d1ddba1edff667","df85ab12f80aced067959d43bd7744017fccb1eb95adcfa343f16cba7c9ef670","613df14d2c8c0ba78286705c4ed01ec701ed03189ca3803dd69bc7086b9c02ff","298f8d2584216932ea238927177ef343d0b8da735eb40a5ba96b1f92e3675e33","c8082c78975419ed5a9f7daa655643425cdd98fee91bb82fd92d25f908c78465","3d1717d66cd1094139f0c1f0ed07ec56d91e4f5cd27e2b6309b6f195491e7f4a","6f1302be2fa00d8a64e3bd48b4ccdf5d77a402441d7728d48c2ecee706c79127","efb30c7f5b1e7e2c8941c95355161907fdd6f3f28941cceacf81edc11db89bad","37700ef2907cfee5d680c1ceb83ba8355223f375c8093f523b9ee2ce108c1044","a244408662b901d15567a5bcff4b29cd13a2a6c9bb2c27329eec616c48c8f144","cf4c01af6890db612fcb2eda144fa7a947a0fd005052f41485459d195cd7396d","770c7abd7f2b17ff392e7179ad9b14518bc284f18834ec6efc00b4c62b8a4846","f29c840652a2d49e5b24debe0c06f9dd6ca15f96421cbac112ba982258b16a94","44a3d19d7e208acb0261a1f718c047854d0794683a0d5c2193522d310e36bdec","090ce3b05198a4c287542354fcedbfd570d87b2f32d0363cab0eb48989aecd2e","ad4b4e5abb5f01f966304dfa08c347137a3fe77329c7ae6c17c824c3d4babf33","b78cb18aa49943470bbab837676a7c35d1dfbfae7241c144f1d7fbd183989022","024aeda8ac048f7b98839a2b806e2034fe2fa1db797418cf8923a06fb32358c8","54f9c37e150e434622cff5d71fb87237c48497141cb379fc1ab4d019a4a43e2e","0d912ede0e33119759d7a3eee223fcbb83f1ca4c229719c62d54aa071487ceca","6f5878e8666a8abbb560dcc15b19c95ac5b0f4f85aabab2e804abb6a145030e4","ac683a7d8aa2506a3d5a3243ed94348867c85307ba54e46e6dd4a440b6a3012d","cf08b5dd44744b109ed2ddb8968bc8cbd4c6192b74180e5fb0fb1671f38d5dbc","efa3706b88ec75d05bfa7fa44d39af58305b7affda1b3789cf6d3688bb83070b","0a589d620f1d4719925c345e3c6e17dde3137765ea8db58c5a790f52ccdc58a6","8a3a12f093b91e0e3ca5f9909fb0cbaed59e2d864f04f103487f8f87095dfbfb","07d6a4c577cad80d9c1a2cf5d0e0ddae1aafadb264f5e41396999edd5963c94d","ba23c12c72c1523b39716c37b20fddaaab05f3f82139c8cdc33d552c3de70684",{"version":"7b7770361f404e9b167bce0ee92a608d8d14cb0b2f747ca9b300998db438a0fb","signature":"81d5aa9d15ee1ca18b073ecd13aa979f24d9100c2842f9e254d27992e014dd8a"},{"version":"b196a892a7087bc69d5e14a1647aaf5acfcdf995c1935a55afe405253c153b4c","signature":"f63a428eadbfdbc8c9137c4bdaa77a23988f7e82d1b01b5ef7d13e2f37d3d044"},{"version":"bb4df5f784c131c8fc70cfb1868ab99b883347d48c7260450d3c56958a996d60","signature":"b2b0e3e6fd8b425abfb54a11133c8b9abfc186d61ac86adc8deaba0b8c2f4e8f"},{"version":"faf3b4d50980988d8870ec5a63705d314d100f0338e3c9978362acea7a50e825","signature":"bd3f683b47db8bdf2c50f5c3becea6fd0610f1e70ae35e0a2d0605c7200b6719"},{"version":"a6ed2271e6d0d4530f902777df5c4123b86c872f50ef6796ec63b77f56ac11b9","signature":"46ec089d57ddc32a6869f7cdfb6a81e37a8b93eb3d4c15798ea7c2de2ff947d4"},{"version":"a2199b85e9360ee3c5f384b56666662168daecca269293ab815da773e1e6391d","signature":"f7e148507097b2e8e1703df7b0b9acb7b65afed60aa3addd303f0cc97dab640c"},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":99},{"version":"8a2ef120c4da7aab664148ed8d283aa0b98df4d5f15c570d830c8998ef05718b","impliedFormat":1},{"version":"4433d18f82991634feae5150a68f9b30f5b05b55416af8ff9f7251fb29431ed5","impliedFormat":1},{"version":"cc5d0b221824b7d8597e8a2bbdad2383af877eb564eaca392992049839e88c9e","impliedFormat":1},{"version":"21898d939444825cee1232af435330610b09171bea22a2f892cf2058d764b63d","impliedFormat":1},{"version":"6ec5f3b496e6f10c4f0a079e3b1102acef9c0bf5e3464909fa6e88b16a26480f","impliedFormat":99},{"version":"d9d320cf31f6d63659484f6c9ca4db4ae673daefa65118dd8589838925ff1397","impliedFormat":99},{"version":"027cf2216d065a97bf5a8ea126b3ea2734fab6cfe32adaff81ab4e94a1b51bbe","impliedFormat":99},{"version":"f6e6313fad233c5141220f7d25eae120cdd6e5079fbe0aba56821a1e99d05df8","impliedFormat":1},{"version":"9534c35b4577c193e499178deb47419fdadddd5e53af5ec8cb88218848013f65","impliedFormat":1},{"version":"804dca323c25404588a6e71d76e52eb09806f05e6013f0be1fcea1fb7eed5fa3","impliedFormat":99},{"version":"aeba529dfa69caa0efcdee1f1455540250d026522e5551b20b8a7ba9eebc707a","impliedFormat":99},{"version":"dfe6945467765f8e7843442a9dfbcf6b5526b6465b07b4c75a54a750329b5f17","impliedFormat":99},{"version":"7f9f6c9fe0e48c401d855d849e28112ffe2425569eca01b08b8c6112b8200695","impliedFormat":99},{"version":"68fcdc663627d12d336b420b19b3e54258844d0cbca0879f711c22aafd853352","impliedFormat":99},{"version":"6e97a7762ca61b836f275a14bf22a1696559bfa01bd6176df9498e717b5ff298","impliedFormat":99},{"version":"86535783bd695ee43e1a403e8cc50b1d643d3741df8074d30fbfae3b0438f996","impliedFormat":99},{"version":"7c94c072f4eef88b15710e2a6dd17036bfd943b390976aecc94af63df2f8a287","impliedFormat":99},{"version":"7e8a2efc54958a4ea7d678671d8703b00ae48a519d0f795a8f44f605abdba3d5","impliedFormat":99},{"version":"1409a9680115403cac91934df0062646e0a77f1b220b60faec5fe26cd775d9ca","impliedFormat":99},{"version":"335226d599a9382c9bea07d37e23bf998c1022c0f67e4d6d2b69633de6ac118f","impliedFormat":99},{"version":"ae430fd9bac320e71c3fe9299d90dcf67555d9a4f97ecaa35947b430ba8648ea","impliedFormat":99},{"version":"9061ff14146280f47d740b344ddd641c16df526ecaa868c348852277a9fb8686","impliedFormat":99},{"version":"7fa70acc5eed701b456f21e33f8f289e9e0e77fdd1f952385c33d6b9ecfb2021","impliedFormat":99},{"version":"16c6bbe197b6bf88db162c620e37218fab4c1c32892132d4aa33e461ae2b990a","impliedFormat":99},{"version":"9778598e1d86d1e544ab77fbc0bb5199d2fbb08ed386b3520732246b90005545","impliedFormat":99},{"version":"feed66ae8815d1981ad575482766fb9a82385e75cce35ae2f13be58e50c4349f","impliedFormat":99},{"version":"7e500d1f51b14c04c6dce8dcbadc5c48f4bec6fca0f321397c165868834916a2","affectsGlobalScope":true,"impliedFormat":99},{"version":"20c1041fbd4f1537686af4b707872b87c90a22201f8979e5def4554d28b46a5b","impliedFormat":99},{"version":"57ff3023920f09ea08ee1fb662518ff60312e81781e03c4e3b50cef3322143be","signature":"495d5d4a044fa18020972e7146c7416e467a364a9b23de05b096335d212ac9bb"}],"root":[[164,169],199],"options":{"composite":true,"declaration":true,"declarationDir":"./","declarationMap":true,"emitDeclarationOnly":true,"exactOptionalPropertyTypes":true,"jsx":4,"jsxImportSource":"@lynx-js/react","module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noUncheckedIndexedAccess":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":6,"tsBuildInfoFile":"./.tsbuildinfo","verbatimModuleSyntax":true},"referencedMap":[[97,1],[186,2],[175,3],[187,4],[194,5],[196,6],[195,7],[177,8],[180,9],[181,10],[183,11],[184,12],[191,13],[190,14],[192,15],[193,14],[198,16],[197,17],[88,18],[90,19],[94,20],[91,21],[92,22],[87,23],[89,24],[44,25],[82,26],[73,27],[59,28],[56,27],[80,29],[57,27],[78,30],[58,31],[83,32],[66,31],[61,27],[60,33],[75,31],[81,34],[79,31],[62,27],[70,31],[71,31],[63,33],[69,31],[64,31],[67,31],[68,27],[76,31],[65,27],[72,31],[74,31],[47,35],[54,36],[85,37],[55,38],[95,39],[45,35],[46,40],[51,41],[52,42],[50,43],[41,44],[96,45],[179,46],[178,12],[174,12],[172,12],[173,47],[171,12],[106,48],[105,49],[107,50],[112,51],[109,49],[111,52],[110,48],[121,53],[117,54],[120,55],[119,56],[125,57],[126,57],[124,58],[128,59],[127,58],[142,60],[130,61],[131,62],[132,63],[135,64],[137,65],[134,66],[136,67],[140,68],[141,69],[166,70],[169,71],[199,72],[164,73],[167,74],[168,74],[165,75],[102,76],[144,77],[143,78],[145,79],[163,80],[151,81],[150,82],[147,83],[152,84],[161,85],[146,86],[149,87],[148,88],[153,89],[159,90],[158,91],[155,92],[162,93],[160,94],[157,95],[101,96]],"latestChangedDtsFile":"./media.d.ts","version":"5.9.3"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { createNativeSqliteDriver, type G9NativeDriverOptions, nativeSqliteModule } from './driver.js';
|
|
2
2
|
export type * from './protocol.js';
|
|
3
3
|
export { createNativeHostServices, type G9InsetsSubscriber, type G9NativeHostOptions, type G9NativeServices, lynxInsetsEvents, nativeHostModule, } from './services.js';
|
|
4
|
+
export { createNativeSpeechToText, type G9NativeSpeechOptions, type G9SpeechEvents, lynxSpeechEvents, nativeSpeechModule, } from './speech.js';
|
|
4
5
|
export { decodeRunValue, toArrayBuffer } from './transport.js';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpG,mBAAmB,YAAY,CAAC;AAChC,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpG,mBAAmB,YAAY,CAAC;AAChC,OAAO,EACL,wBAAwB,EACxB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export { createNativeSqliteDriver, nativeSqliteModule } from "./driver.js";
|
|
2
2
|
export { createNativeHostServices, lynxInsetsEvents, nativeHostModule } from "./services.js";
|
|
3
|
+
export { createNativeSpeechToText, lynxSpeechEvents, nativeSpeechModule } from "./speech.js";
|
|
3
4
|
export { decodeRunValue, toArrayBuffer } from "./transport.js";
|
package/dist/protocol.d.ts
CHANGED
|
@@ -111,5 +111,19 @@ export interface G9HostNativeModule {
|
|
|
111
111
|
appDataDirectory(callback: Reply<string>): void;
|
|
112
112
|
assetUri(path: string, callback: Reply<string>): void;
|
|
113
113
|
}
|
|
114
|
+
/** What `G9SpeechModule.listen` settles with (the `G9SpeechToTextResult` statuses). */
|
|
115
|
+
export type G9NativeSpeechResult = {
|
|
116
|
+
readonly status: 'recognized';
|
|
117
|
+
readonly text: string;
|
|
118
|
+
} | {
|
|
119
|
+
readonly status: 'no-match' | 'cancelled' | 'denied';
|
|
120
|
+
};
|
|
121
|
+
/** `NativeModules.G9SpeechModule` (dictation). Partial results: the global event `g9:speech`, `{"session","text"}`. */
|
|
122
|
+
export interface G9SpeechNativeModule {
|
|
123
|
+
isAvailable(locale: string, callback: Reply<boolean>): void;
|
|
124
|
+
requestPermission(callback: Reply<string>): void;
|
|
125
|
+
listen(session: string, locale: string, callback: Reply<G9NativeSpeechResult>): void;
|
|
126
|
+
cancel(session: string): void;
|
|
127
|
+
}
|
|
114
128
|
export {};
|
|
115
129
|
//# sourceMappingURL=protocol.d.ts.map
|
package/dist/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/speech.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type G9SpeechToText } from '@g9tm/lynxcontrols-foundation';
|
|
2
|
+
import type { G9SpeechNativeModule } from './protocol.js';
|
|
3
|
+
/** `NativeModules.G9SpeechModule`, or `null` where the native library is not linked. */
|
|
4
|
+
export declare function nativeSpeechModule(): G9SpeechNativeModule | null;
|
|
5
|
+
/** Subscribes to the partial results (`{ session, text }`); returns the unsubscribe function. */
|
|
6
|
+
export type G9SpeechEvents = (listener: (event: {
|
|
7
|
+
readonly session: string;
|
|
8
|
+
readonly text: string;
|
|
9
|
+
}) => void) => () => void;
|
|
10
|
+
/** The default partial-result source: the module's `g9:speech` global event (one JSON argument). */
|
|
11
|
+
export declare function lynxSpeechEvents(): G9SpeechEvents;
|
|
12
|
+
/** Options of {@link createNativeSpeechToText}. */
|
|
13
|
+
export interface G9NativeSpeechOptions {
|
|
14
|
+
/** The module (default: `NativeModules.G9SpeechModule`). Tests pass a fake. */
|
|
15
|
+
readonly module?: G9SpeechNativeModule;
|
|
16
|
+
/** Where partial results come from (default: {@link lynxSpeechEvents}). */
|
|
17
|
+
readonly events?: G9SpeechEvents;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The speech capability for `G9Provider` (`capabilities.speech`), or `null` where `G9SpeechModule` is not linked — the
|
|
21
|
+
* fields then hide their microphone.
|
|
22
|
+
*/
|
|
23
|
+
export declare function createNativeSpeechToText(options?: G9NativeSpeechOptions): G9SpeechToText | null;
|
|
24
|
+
//# sourceMappingURL=speech.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech.d.ts","sourceRoot":"","sources":["../src/speech.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAYzE,wFAAwF;AACxF,wBAAgB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI,CAMhE;AAED,iGAAiG;AACjG,MAAM,MAAM,cAAc,GAAG,CAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,KAC3E,MAAM,IAAI,CAAC;AAEhB,oGAAoG;AACpG,wBAAgB,gBAAgB,IAAI,cAAc,CAgBjD;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IACvC,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;CAClC;AAaD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,GAAG,IAAI,CAgEnG"}
|
package/dist/speech.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { G9Error } from "@g9tm/lynxcontrols-foundation";
|
|
2
|
+
function nativeSpeechModule() {
|
|
3
|
+
try {
|
|
4
|
+
var _ref;
|
|
5
|
+
return null != (_ref = "u" < typeof NativeModules ? void 0 : null == NativeModules ? void 0 : NativeModules.G9SpeechModule) ? _ref : null;
|
|
6
|
+
} catch {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function lynxSpeechEvents() {
|
|
11
|
+
return (listener)=>{
|
|
12
|
+
var _lynx_getJSModule;
|
|
13
|
+
const target = "u" < typeof lynx ? void 0 : null == lynx ? void 0 : null == (_lynx_getJSModule = lynx.getJSModule) ? void 0 : _lynx_getJSModule.call(lynx, 'GlobalEventEmitter');
|
|
14
|
+
if (!target) return ()=>void 0;
|
|
15
|
+
const handler = (raw)=>{
|
|
16
|
+
try {
|
|
17
|
+
const event = 'string' == typeof raw ? JSON.parse(raw) : raw;
|
|
18
|
+
if ('string' == typeof (null == event ? void 0 : event.session) && 'string' == typeof event.text) listener({
|
|
19
|
+
session: event.session,
|
|
20
|
+
text: event.text
|
|
21
|
+
});
|
|
22
|
+
} catch {}
|
|
23
|
+
};
|
|
24
|
+
target.addListener('g9:speech', handler);
|
|
25
|
+
return ()=>target.removeListener('g9:speech', handler);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function unwrap(envelope) {
|
|
29
|
+
if (null == envelope ? void 0 : envelope.ok) return envelope.value;
|
|
30
|
+
const e = envelope && !envelope.ok ? envelope.error : {
|
|
31
|
+
code: 'speech-recognition',
|
|
32
|
+
message: 'The native module sent no reply.'
|
|
33
|
+
};
|
|
34
|
+
throw new G9Error(e.code, e.message);
|
|
35
|
+
}
|
|
36
|
+
const PERMISSIONS = new Set([
|
|
37
|
+
'granted',
|
|
38
|
+
'denied',
|
|
39
|
+
'restricted'
|
|
40
|
+
]);
|
|
41
|
+
function createNativeSpeechToText(options = {}) {
|
|
42
|
+
var _options_module, _options_events;
|
|
43
|
+
const native = null != (_options_module = options.module) ? _options_module : nativeSpeechModule();
|
|
44
|
+
if (!native) return null;
|
|
45
|
+
const events = null != (_options_events = options.events) ? _options_events : lynxSpeechEvents();
|
|
46
|
+
let next = 0;
|
|
47
|
+
return {
|
|
48
|
+
isAvailable: (locale)=>new Promise((resolve)=>{
|
|
49
|
+
native.isAvailable(locale, (reply)=>{
|
|
50
|
+
try {
|
|
51
|
+
resolve(true === unwrap(reply));
|
|
52
|
+
} catch {
|
|
53
|
+
resolve(false);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}),
|
|
57
|
+
requestPermission: ()=>new Promise((resolve, reject)=>{
|
|
58
|
+
native.requestPermission((reply)=>{
|
|
59
|
+
try {
|
|
60
|
+
const value = unwrap(reply);
|
|
61
|
+
resolve(PERMISSIONS.has(value) ? value : 'denied');
|
|
62
|
+
} catch (error) {
|
|
63
|
+
reject(error);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}),
|
|
67
|
+
listen: (opts)=>new Promise((resolve, reject)=>{
|
|
68
|
+
var _opts_signal, _opts_signal1;
|
|
69
|
+
const session = `s${++next}`;
|
|
70
|
+
let settled = false;
|
|
71
|
+
const off = events((e)=>{
|
|
72
|
+
var _opts_onPartialResult;
|
|
73
|
+
if (!settled && e.session === session) null == (_opts_onPartialResult = opts.onPartialResult) || _opts_onPartialResult.call(opts, e.text);
|
|
74
|
+
});
|
|
75
|
+
const settle = (result, error)=>{
|
|
76
|
+
var _opts_signal;
|
|
77
|
+
if (settled) return;
|
|
78
|
+
settled = true;
|
|
79
|
+
off();
|
|
80
|
+
null == (_opts_signal = opts.signal) || _opts_signal.removeEventListener('abort', onAbort);
|
|
81
|
+
if (result) resolve(result);
|
|
82
|
+
else reject(error);
|
|
83
|
+
};
|
|
84
|
+
const onAbort = ()=>{
|
|
85
|
+
native.cancel(session);
|
|
86
|
+
settle({
|
|
87
|
+
status: 'cancelled'
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
if (null == (_opts_signal = opts.signal) ? void 0 : _opts_signal.aborted) return settle({
|
|
91
|
+
status: 'cancelled'
|
|
92
|
+
});
|
|
93
|
+
null == (_opts_signal1 = opts.signal) || _opts_signal1.addEventListener('abort', onAbort);
|
|
94
|
+
native.listen(session, opts.locale, (reply)=>{
|
|
95
|
+
try {
|
|
96
|
+
var _value_text;
|
|
97
|
+
const value = unwrap(reply);
|
|
98
|
+
if ((null == value ? void 0 : value.status) === 'recognized') settle({
|
|
99
|
+
status: 'recognized',
|
|
100
|
+
text: String(null != (_value_text = value.text) ? _value_text : '')
|
|
101
|
+
});
|
|
102
|
+
else (null == value ? void 0 : value.status) === 'no-match' || (null == value ? void 0 : value.status) === 'denied' || (null == value ? void 0 : value.status) === 'cancelled' ? settle({
|
|
103
|
+
status: value.status
|
|
104
|
+
}) : settle(null, new G9Error('speech-recognition', `Unknown dictation status "${String(null == value ? void 0 : value.status)}".`));
|
|
105
|
+
} catch (error) {
|
|
106
|
+
settle(null, error);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
})
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export { createNativeSpeechToText, lynxSpeechEvents, nativeSpeechModule };
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=speech.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech.js","sources":["../src/speech.ts"],"sourcesContent":["// `G9SpeechToText` over `NativeModules.G9SpeechModule` (MAUI `IG9SpeechToText`): what the fields' dictation\n// (`controls/fields/dictation.ts`) listens through. One session at a time on the native side; this side numbers the\n// sessions, routes the `g9:speech` partial events to the session that asked, turns an abort into the native cancel, and\n// settles each `listen` exactly once — a reply after an abort, or a second reply, is dropped.\nimport {\n G9Error,\n type G9PermissionStatus,\n type G9SpeechToText,\n type G9SpeechToTextOptions,\n type G9SpeechToTextResult,\n} from '@g9tm/lynxcontrols-foundation';\nimport type { G9NativeEnvelope, G9SpeechNativeModule } from './protocol';\n\ndeclare const NativeModules: { G9SpeechModule?: G9SpeechNativeModule } | undefined;\ndeclare const lynx:\n | {\n getJSModule?(name: string): {\n addListener(name: string, listener: (...args: never[]) => void): void;\n removeListener(name: string, listener: (...args: never[]) => void): void;\n };\n }\n | undefined;\n\n/** `NativeModules.G9SpeechModule`, or `null` where the native library is not linked. */\nexport function nativeSpeechModule(): G9SpeechNativeModule | null {\n try {\n return (typeof NativeModules === 'undefined' ? undefined : NativeModules?.G9SpeechModule) ?? null;\n } catch {\n return null;\n }\n}\n\n/** Subscribes to the partial results (`{ session, text }`); returns the unsubscribe function. */\nexport type G9SpeechEvents = (\n listener: (event: { readonly session: string; readonly text: string }) => void,\n) => () => void;\n\n/** The default partial-result source: the module's `g9:speech` global event (one JSON argument). */\nexport function lynxSpeechEvents(): G9SpeechEvents {\n return (listener) => {\n const target = typeof lynx === 'undefined' ? undefined : lynx?.getJSModule?.('GlobalEventEmitter');\n if (!target) return () => undefined;\n const handler = ((raw: unknown) => {\n try {\n const event = (typeof raw === 'string' ? JSON.parse(raw) : raw) as { session?: unknown; text?: unknown };\n if (typeof event?.session === 'string' && typeof event.text === 'string')\n listener({ session: event.session, text: event.text });\n } catch {\n // not JSON: not ours\n }\n }) as unknown as (...args: never[]) => void;\n target.addListener('g9:speech', handler);\n return () => target.removeListener('g9:speech', handler);\n };\n}\n\n/** Options of {@link createNativeSpeechToText}. */\nexport interface G9NativeSpeechOptions {\n /** The module (default: `NativeModules.G9SpeechModule`). Tests pass a fake. */\n readonly module?: G9SpeechNativeModule;\n /** Where partial results come from (default: {@link lynxSpeechEvents}). */\n readonly events?: G9SpeechEvents;\n}\n\nfunction unwrap<T>(envelope: G9NativeEnvelope<T> | undefined): T {\n if (envelope?.ok) return envelope.value;\n const e =\n envelope && !envelope.ok\n ? envelope.error\n : { code: 'speech-recognition', message: 'The native module sent no reply.' };\n throw new G9Error(e.code, e.message);\n}\n\nconst PERMISSIONS: ReadonlySet<string> = new Set(['granted', 'denied', 'restricted']);\n\n/**\n * The speech capability for `G9Provider` (`capabilities.speech`), or `null` where `G9SpeechModule` is not linked — the\n * fields then hide their microphone.\n */\nexport function createNativeSpeechToText(options: G9NativeSpeechOptions = {}): G9SpeechToText | null {\n const native = options.module ?? nativeSpeechModule();\n if (!native) return null;\n const events = options.events ?? lynxSpeechEvents();\n let next = 0;\n return {\n isAvailable: (locale) =>\n new Promise<boolean>((resolve) => {\n native.isAvailable(locale, (reply) => {\n try {\n resolve(unwrap<boolean>(reply) === true);\n } catch {\n resolve(false);\n }\n });\n }),\n requestPermission: () =>\n new Promise<G9PermissionStatus>((resolve, reject) => {\n native.requestPermission((reply) => {\n try {\n const value = unwrap<string>(reply);\n resolve(PERMISSIONS.has(value) ? (value as G9PermissionStatus) : 'denied');\n } catch (error) {\n reject(error);\n }\n });\n }),\n listen: (opts: G9SpeechToTextOptions) =>\n new Promise<G9SpeechToTextResult>((resolve, reject) => {\n const session = `s${++next}`;\n let settled = false;\n const off = events((e) => {\n if (!settled && e.session === session) opts.onPartialResult?.(e.text);\n });\n const settle = (result: G9SpeechToTextResult | null, error?: unknown) => {\n if (settled) return;\n settled = true;\n off();\n opts.signal?.removeEventListener('abort', onAbort);\n if (result) resolve(result);\n else reject(error);\n };\n const onAbort = () => {\n native.cancel(session);\n settle({ status: 'cancelled' });\n };\n if (opts.signal?.aborted) return settle({ status: 'cancelled' }); // never started: nothing to cancel natively\n opts.signal?.addEventListener('abort', onAbort);\n native.listen(session, opts.locale, (reply) => {\n try {\n const value = unwrap<{ status?: string; text?: string }>(\n reply as G9NativeEnvelope<{ status?: string; text?: string }>,\n );\n if (value?.status === 'recognized') settle({ status: 'recognized', text: String(value.text ?? '') });\n else if (value?.status === 'no-match' || value?.status === 'denied' || value?.status === 'cancelled')\n settle({ status: value.status });\n else\n settle(null, new G9Error('speech-recognition', `Unknown dictation status \"${String(value?.status)}\".`));\n } catch (error) {\n settle(null, error);\n }\n });\n }),\n };\n}\n"],"names":["nativeSpeechModule","_ref","NativeModules","undefined","lynxSpeechEvents","listener","lynx","target","handler","raw","event","JSON","unwrap","envelope","e","G9Error","PERMISSIONS","Set","createNativeSpeechToText","options","_options_module","_options_events","native","events","next","locale","Promise","resolve","reply","reject","value","error","opts","_opts_signal","_opts_signal1","session","settled","off","settle","result","onAbort","_value_text","String"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// Generated by @lynx-js/autolink-codegen. Do not edit.
|
|
2
|
+
|
|
3
|
+
const ADDON_NAME = "G9SpeechModule";
|
|
4
|
+
|
|
5
|
+
export interface G9SpeechModuleSpec {
|
|
6
|
+
isAvailable(locale: string, callback: (reply: Record<string, unknown>) => void): void;
|
|
7
|
+
requestPermission(callback: (reply: Record<string, unknown>) => void): void;
|
|
8
|
+
listen(session: string, locale: string, callback: (reply: Record<string, unknown>) => void): void;
|
|
9
|
+
cancel(session: string): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type AddonExports = Record<string, unknown>;
|
|
13
|
+
|
|
14
|
+
declare let NativeModules: Record<string, unknown>;
|
|
15
|
+
|
|
16
|
+
declare global {
|
|
17
|
+
interface LynxNapiLoader {
|
|
18
|
+
load(moduleName: string): AddonExports | null | undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// eslint-disable-next-line no-var
|
|
22
|
+
var __lynxNapiLoader: LynxNapiLoader | undefined;
|
|
23
|
+
|
|
24
|
+
function getNapiLoader(): LynxNapiLoader | undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare const lynx: {
|
|
28
|
+
getModuleLoader?(): LynxNapiLoader | undefined;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
function getNativeModules(): Record<string, unknown> | undefined {
|
|
32
|
+
const globalObject = globalThis as unknown as {
|
|
33
|
+
NativeModules?: Record<string, unknown>;
|
|
34
|
+
};
|
|
35
|
+
return typeof NativeModules !== 'undefined'
|
|
36
|
+
? NativeModules
|
|
37
|
+
: globalObject.NativeModules;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function installG9SpeechModuleShim(): void {
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function requireG9SpeechModule(): G9SpeechModuleSpec {
|
|
45
|
+
const nativeModules = getNativeModules();
|
|
46
|
+
const existingModule = nativeModules?.[ADDON_NAME];
|
|
47
|
+
if (existingModule !== undefined && existingModule !== null) {
|
|
48
|
+
return existingModule as G9SpeechModuleSpec;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
throw new Error(`Native module "${ADDON_NAME}" is unavailable.`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const G9SpeechModule = new Proxy({}, {
|
|
57
|
+
get(_target, property) {
|
|
58
|
+
return requireG9SpeechModule()[property as keyof G9SpeechModuleSpec];
|
|
59
|
+
},
|
|
60
|
+
}) as G9SpeechModuleSpec;
|
|
61
|
+
|
|
62
|
+
installG9SpeechModuleShim();
|
|
63
|
+
|
|
64
|
+
export default G9SpeechModule;
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
# package version, which always equals the pinned G9MAUIControls version (npm run check:versions).
|
|
5
5
|
Pod::Spec.new do |s|
|
|
6
6
|
s.name = 'g9lynx-native'
|
|
7
|
-
s.version = '1.4.
|
|
8
|
-
s.summary = 'G9 SQLite and
|
|
7
|
+
s.version = '1.4.4'
|
|
8
|
+
s.summary = 'G9 SQLite, host and speech native modules and the <g9-video> element for Lynx (sqlite3, NSUserDefaults, UIKit, AVFoundation, Speech).'
|
|
9
9
|
s.homepage = 'https://github.com/imankari/g9lynxcontrols'
|
|
10
10
|
s.license = { :type => 'MIT' }
|
|
11
11
|
s.author = 'G9LynxControls'
|
|
@@ -16,7 +16,8 @@ Pod::Spec.new do |s|
|
|
|
16
16
|
# flattened Pods/Headers/Public cannot resolve from the host app (found building apps/ios-host, 2026-10-06).
|
|
17
17
|
s.header_mappings_dir = 'src'
|
|
18
18
|
s.libraries = 'sqlite3'
|
|
19
|
-
s.
|
|
19
|
+
# Speech: G9SpeechModule (dictation; the host's Info.plist carries NSSpeechRecognitionUsageDescription).
|
|
20
|
+
s.frameworks = 'UIKit', 'AVFoundation', 'Speech'
|
|
20
21
|
s.requires_arc = true
|
|
21
22
|
s.dependency 'Lynx', '4.0.3'
|
|
22
23
|
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
#import <Lynx/LynxContextModule.h>
|
|
3
|
+
#import "generated/G9SpeechModuleSpec.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
// Lynx 4.0.3 has no @LynxNativeModuleRegister: hosts register the module on their LynxConfig
|
|
8
|
+
// (`[config registerModule:G9SpeechModule.class]`). The host's Info.plist needs NSMicrophoneUsageDescription and
|
|
9
|
+
// NSSpeechRecognitionUsageDescription.
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* `NativeModules.G9SpeechModule` on iOS (`G9SpeechToText`): `SFSpeechRecognizer` over `AVAudioEngine`, one session at a
|
|
13
|
+
* time; partial hypotheses go out as the global event `g9:speech` (`{"session","text"}`). TWIN: G9SpeechModule.kt.
|
|
14
|
+
*/
|
|
15
|
+
@interface G9SpeechModule : NSObject <G9SpeechModuleSpec, LynxContextModule>
|
|
16
|
+
@end
|
|
17
|
+
|
|
18
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#import "G9SpeechModule.h"
|
|
2
|
+
#import <AVFoundation/AVFoundation.h>
|
|
3
|
+
#import <Lynx/LynxContext.h>
|
|
4
|
+
#import <Speech/Speech.h>
|
|
5
|
+
|
|
6
|
+
typedef void (^G9Reply)(id envelope);
|
|
7
|
+
|
|
8
|
+
static NSDictionary *G9Ok(id value) {
|
|
9
|
+
return @{@"ok" : @YES, @"value" : value ?: [NSNull null]};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
static NSDictionary *G9Fail(NSString *code, NSString *message) {
|
|
13
|
+
return @{@"ok" : @NO, @"error" : @{@"code" : code, @"message" : message ?: @""}};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static NSLocale *G9LocaleOf(NSString *locale) {
|
|
17
|
+
return [NSLocale localeWithLocaleIdentifier:locale.length ? locale : @"en-US"];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** `granted` needs both speech recognition and the microphone; `restricted` is the device's policy. */
|
|
21
|
+
static NSString *G9PermissionState(SFSpeechRecognizerAuthorizationStatus speech, BOOL mic) {
|
|
22
|
+
if (speech == SFSpeechRecognizerAuthorizationStatusRestricted) return @"restricted";
|
|
23
|
+
return speech == SFSpeechRecognizerAuthorizationStatusAuthorized && mic ? @"granted" : @"denied";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** One dictation: the recogniser's task, the request the engine tap feeds, the reply that settles once. */
|
|
27
|
+
@interface G9SpeechSession : NSObject
|
|
28
|
+
@property(nonatomic, copy) NSString *identifier;
|
|
29
|
+
@property(nonatomic, copy, nullable) G9Reply reply;
|
|
30
|
+
@property(nonatomic, strong, nullable) SFSpeechRecognitionTask *task;
|
|
31
|
+
@property(nonatomic, strong, nullable) SFSpeechAudioBufferRecognitionRequest *request;
|
|
32
|
+
@property(nonatomic, copy) NSString *best;
|
|
33
|
+
@property(nonatomic) BOOL settled;
|
|
34
|
+
@end
|
|
35
|
+
|
|
36
|
+
@implementation G9SpeechSession
|
|
37
|
+
@end
|
|
38
|
+
|
|
39
|
+
@interface G9SpeechModule ()
|
|
40
|
+
@property(nonatomic, weak, nullable) LynxContext *lynxContext;
|
|
41
|
+
@property(nonatomic, strong) AVAudioEngine *engine;
|
|
42
|
+
@property(nonatomic, strong, nullable) G9SpeechSession *current;
|
|
43
|
+
@end
|
|
44
|
+
|
|
45
|
+
@implementation G9SpeechModule
|
|
46
|
+
|
|
47
|
+
+ (NSString *)name {
|
|
48
|
+
return @"G9SpeechModule";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
+ (NSDictionary<NSString *, NSString *> *)methodLookup {
|
|
52
|
+
return @{
|
|
53
|
+
@"isAvailable" : NSStringFromSelector(@selector(isAvailable:callback:)),
|
|
54
|
+
@"requestPermission" : NSStringFromSelector(@selector(requestPermission:)),
|
|
55
|
+
@"listen" : NSStringFromSelector(@selector(listen:locale:callback:)),
|
|
56
|
+
@"cancel" : NSStringFromSelector(@selector(cancel:)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
- (instancetype)initWithLynxContext:(LynxContext *)context {
|
|
61
|
+
if ((self = [super init])) {
|
|
62
|
+
_lynxContext = context;
|
|
63
|
+
_engine = [[AVAudioEngine alloc] init];
|
|
64
|
+
}
|
|
65
|
+
return self;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
- (instancetype)init {
|
|
69
|
+
if ((self = [super init])) _engine = [[AVAudioEngine alloc] init];
|
|
70
|
+
return self;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
- (void)isAvailable:(NSString *)locale callback:(id)callback {
|
|
74
|
+
SFSpeechRecognizer *r = [[SFSpeechRecognizer alloc] initWithLocale:G9LocaleOf(locale)];
|
|
75
|
+
((G9Reply)callback)(G9Ok(@(r != nil && r.isAvailable)));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
- (void)requestPermission:(id)callback {
|
|
79
|
+
G9Reply reply = [(G9Reply)callback copy];
|
|
80
|
+
[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus speech) {
|
|
81
|
+
[AVAudioSession.sharedInstance requestRecordPermission:^(BOOL granted) {
|
|
82
|
+
reply(G9Ok(G9PermissionState(speech, granted)));
|
|
83
|
+
}];
|
|
84
|
+
}];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
- (void)listen:(NSString *)session locale:(NSString *)locale callback:(id)callback {
|
|
88
|
+
G9Reply reply = [(G9Reply)callback copy];
|
|
89
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
90
|
+
BOOL mic = AVAudioSession.sharedInstance.recordPermission == AVAudioSessionRecordPermissionGranted;
|
|
91
|
+
if (![G9PermissionState(SFSpeechRecognizer.authorizationStatus, mic) isEqualToString:@"granted"]) {
|
|
92
|
+
reply(G9Ok(@{@"status" : @"denied"}));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
SFSpeechRecognizer *recognizer = [[SFSpeechRecognizer alloc] initWithLocale:G9LocaleOf(locale)];
|
|
96
|
+
if (recognizer == nil || !recognizer.isAvailable) {
|
|
97
|
+
reply(G9Fail(@"speech-unavailable", @"No speech recogniser for this language on this device."));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (self.current) [self finish:self.current value:@{@"status" : @"cancelled"}];
|
|
101
|
+
|
|
102
|
+
G9SpeechSession *s = [[G9SpeechSession alloc] init];
|
|
103
|
+
s.identifier = session ?: @"";
|
|
104
|
+
s.reply = reply;
|
|
105
|
+
s.best = @"";
|
|
106
|
+
s.request = [[SFSpeechAudioBufferRecognitionRequest alloc] init];
|
|
107
|
+
s.request.shouldReportPartialResults = YES;
|
|
108
|
+
self.current = s;
|
|
109
|
+
|
|
110
|
+
NSError *error = nil;
|
|
111
|
+
AVAudioSession *audio = AVAudioSession.sharedInstance;
|
|
112
|
+
[audio setCategory:AVAudioSessionCategoryRecord mode:AVAudioSessionModeMeasurement options:AVAudioSessionCategoryOptionDuckOthers error:&error];
|
|
113
|
+
if (!error) [audio setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
|
|
114
|
+
if (error) {
|
|
115
|
+
[self fail:s code:@"speech-recognition" message:error.localizedDescription];
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
AVAudioInputNode *input = self.engine.inputNode;
|
|
119
|
+
SFSpeechAudioBufferRecognitionRequest *request = s.request;
|
|
120
|
+
[input removeTapOnBus:0];
|
|
121
|
+
[input installTapOnBus:0
|
|
122
|
+
bufferSize:1024
|
|
123
|
+
format:[input outputFormatForBus:0]
|
|
124
|
+
block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
|
|
125
|
+
[request appendAudioPCMBuffer:buffer];
|
|
126
|
+
}];
|
|
127
|
+
[self.engine prepare];
|
|
128
|
+
if (![self.engine startAndReturnError:&error]) {
|
|
129
|
+
[self fail:s code:@"speech-recognition" message:error.localizedDescription];
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
__weak G9SpeechModule *weakSelf = self;
|
|
133
|
+
s.task = [recognizer recognitionTaskWithRequest:request
|
|
134
|
+
resultHandler:^(SFSpeechRecognitionResult *result, NSError *taskError) {
|
|
135
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
136
|
+
G9SpeechModule *me = weakSelf;
|
|
137
|
+
if (!me || s.settled) return;
|
|
138
|
+
if (result) {
|
|
139
|
+
s.best = result.bestTranscription.formattedString ?: @"";
|
|
140
|
+
if (!result.isFinal && s.best.length) [me emitPartial:s];
|
|
141
|
+
if (result.isFinal) {
|
|
142
|
+
NSString *text = [s.best stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
|
|
143
|
+
[me finish:s value:text.length ? @{@"status" : @"recognized", @"text" : text} : @{@"status" : @"no-match"}];
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (taskError) {
|
|
148
|
+
// 1110 = no speech detected; a cancelled task reports 216 / 301.
|
|
149
|
+
NSInteger code = taskError.code;
|
|
150
|
+
if (code == 1110) [me finish:s value:@{@"status" : @"no-match"}];
|
|
151
|
+
else if (code == 216 || code == 301) [me finish:s value:@{@"status" : @"cancelled"}];
|
|
152
|
+
else [me fail:s code:@"speech-recognition" message:taskError.localizedDescription];
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
}];
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
- (void)cancel:(NSString *)session {
|
|
160
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
161
|
+
G9SpeechSession *s = self.current;
|
|
162
|
+
if (!s || ![s.identifier isEqualToString:session ?: @""]) return;
|
|
163
|
+
[s.task cancel];
|
|
164
|
+
[self finish:s value:@{@"status" : @"cancelled"}];
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
- (void)emitPartial:(G9SpeechSession *)s {
|
|
169
|
+
NSData *data = [NSJSONSerialization dataWithJSONObject:@{@"session" : s.identifier, @"text" : s.best} options:0 error:nil];
|
|
170
|
+
NSString *json = data ? [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] : @"{}";
|
|
171
|
+
@try {
|
|
172
|
+
[self.lynxContext sendGlobalEvent:@"g9:speech" withParams:@[ json ]];
|
|
173
|
+
} @catch (NSException *ex) {
|
|
174
|
+
// A context being torn down must not take the recogniser down with it.
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
- (void)finish:(G9SpeechSession *)s value:(NSDictionary *)value {
|
|
179
|
+
if (s.settled) return;
|
|
180
|
+
s.settled = YES;
|
|
181
|
+
[self releaseSession:s];
|
|
182
|
+
if (s.reply) s.reply(G9Ok(value));
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
- (void)fail:(G9SpeechSession *)s code:(NSString *)code message:(NSString *)message {
|
|
186
|
+
if (s.settled) return;
|
|
187
|
+
s.settled = YES;
|
|
188
|
+
[self releaseSession:s];
|
|
189
|
+
if (s.reply) s.reply(G9Fail(code, message));
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
- (void)releaseSession:(G9SpeechSession *)s {
|
|
193
|
+
if (self.current == s) self.current = nil;
|
|
194
|
+
if (self.engine.isRunning) [self.engine stop];
|
|
195
|
+
[self.engine.inputNode removeTapOnBus:0];
|
|
196
|
+
[s.request endAudio];
|
|
197
|
+
s.task = nil;
|
|
198
|
+
[AVAudioSession.sharedInstance setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
@end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Generated by @lynx-js/autolink-codegen. Do not edit.
|
|
2
|
+
#import <Foundation/Foundation.h>
|
|
3
|
+
#import <Lynx/LynxModule.h>
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
@protocol G9SpeechModuleSpec <LynxModule>
|
|
8
|
+
|
|
9
|
+
- (void)isAvailable:(NSString *)locale callback:(id)callback;
|
|
10
|
+
- (void)requestPermission:(id)callback;
|
|
11
|
+
- (void)listen:(NSString *)session locale:(NSString *)locale callback:(id)callback;
|
|
12
|
+
- (void)cancel:(NSString *)session;
|
|
13
|
+
|
|
14
|
+
@end
|
|
15
|
+
|
|
16
|
+
NS_ASSUME_NONNULL_END
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@g9tm/lynxcontrols-native",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.4",
|
|
4
4
|
"description": "Android and iOS platform layer: the G9SqliteModule and G9HostModule native modules (Autolink) and their JS adapters.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -38,14 +38,14 @@
|
|
|
38
38
|
"check:android-types": "node scripts/android-bridge-types.mjs"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@g9tm/lynxcontrols-foundation": "1.4.
|
|
42
|
-
"@g9tm/lynxcontrols-sqlite": "1.4.
|
|
41
|
+
"@g9tm/lynxcontrols-foundation": "1.4.4",
|
|
42
|
+
"@g9tm/lynxcontrols-sqlite": "1.4.4"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"@lynx-js/react": ">=0.126.2 <0.127.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@g9tm/lynxcontrols-lynxtron": "1.4.
|
|
48
|
+
"@g9tm/lynxcontrols-lynxtron": "1.4.4",
|
|
49
49
|
"@lynx-js/autolink-codegen": "0.6.0"
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -44,3 +44,24 @@ export declare class G9HostModule {
|
|
|
44
44
|
*/
|
|
45
45
|
assetUri(path: string, callback: (reply: Record<string, unknown>) => void): void;
|
|
46
46
|
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Speech recognition for dictation into fields (`G9SpeechToText`, MAUI `IG9SpeechToText`): Android `SpeechRecognizer`,
|
|
50
|
+
* iOS `SFSpeechRecognizer` over `AVAudioEngine`. One session at a time; interim hypotheses arrive as the global event
|
|
51
|
+
* `g9:speech` with one JSON argument `{"session","text"}` while the user speaks.
|
|
52
|
+
*
|
|
53
|
+
* @lynxmodule
|
|
54
|
+
*/
|
|
55
|
+
export declare class G9SpeechModule {
|
|
56
|
+
/** Whether a recogniser exists for `locale` on this device (no permission prompt): `{ ok, value: boolean }`. */
|
|
57
|
+
isAvailable(locale: string, callback: (reply: Record<string, unknown>) => void): void;
|
|
58
|
+
/** Asks for the microphone (and, on iOS, speech recognition): `{ ok, value: 'granted' | 'denied' | 'restricted' }`. */
|
|
59
|
+
requestPermission(callback: (reply: Record<string, unknown>) => void): void;
|
|
60
|
+
/**
|
|
61
|
+
* Listens once and replies exactly once: `{ ok, value: { status: 'recognized', text } | { status: 'no-match' |
|
|
62
|
+
* 'cancelled' | 'denied' } }`, or `{ ok: false, error }` for a recogniser fault.
|
|
63
|
+
*/
|
|
64
|
+
listen(session: string, locale: string, callback: (reply: Record<string, unknown>) => void): void;
|
|
65
|
+
/** Ends `session` early: its `listen` replies `cancelled`. Unknown or finished sessions are ignored. */
|
|
66
|
+
cancel(session: string): void;
|
|
67
|
+
}
|