@g9tm/lynxcontrols-native 0.0.0-stage → 1.4.2
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 +85 -2
- package/android/build.gradle.kts +45 -0
- package/android/consumer-rules.pro +3 -0
- package/android/src/main/AndroidManifest.xml +5 -0
- package/android/src/main/java/com/g9lynx/g9native/G9Bridge.kt +67 -0
- package/android/src/main/java/com/g9lynx/g9native/G9HostModule.kt +172 -0
- package/android/src/main/java/com/g9lynx/g9native/G9SqliteModule.kt +49 -0
- package/android/src/main/java/com/g9lynx/g9native/generated/G9HostModuleSpec.java +48 -0
- package/android/src/main/java/com/g9lynx/g9native/generated/G9SqliteModuleSpec.java +41 -0
- package/android/src/main/java/com/g9lynx/g9native/host/core/G9PreferencesCore.kt +100 -0
- package/android/src/main/java/com/g9lynx/g9native/sqlite/androidx/AndroidxSqlEngine.kt +88 -0
- package/android/src/main/java/com/g9lynx/g9native/sqlite/core/G9SqlEngine.kt +61 -0
- package/android/src/main/java/com/g9lynx/g9native/sqlite/core/G9SqliteCore.kt +260 -0
- package/android/src/main/java/com/g9lynx/g9native/sqlite/core/G9SqliteService.kt +131 -0
- package/android/src/main/java/com/g9lynx/g9native/sqlite/core/G9SqliteTransport.kt +125 -0
- package/android/src/main/java/com/g9lynx/g9native/sqlite/core/G9SqliteValues.kt +71 -0
- package/android/src/main/java/com/g9lynx/g9native/video/G9VideoUI.kt +220 -0
- package/android/src/main/java/com/g9lynx/g9native/video/core/G9VideoCore.kt +67 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/driver.d.ts +20 -0
- package/dist/driver.d.ts.map +1 -0
- package/dist/driver.js +159 -0
- package/dist/driver.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/media.d.ts +60 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.jsx +119 -0
- package/dist/media.jsx.map +1 -0
- package/dist/protocol.d.ts +115 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +1 -0
- package/dist/services.d.ts +36 -0
- package/dist/services.d.ts.map +1 -0
- package/dist/services.js +111 -0
- package/dist/services.js.map +1 -0
- package/dist/transport.d.ts +10 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +77 -0
- package/dist/transport.js.map +1 -0
- package/generated/G9HostModule.ts +71 -0
- package/generated/G9SqliteModule.ts +68 -0
- package/ios/Tests/G9NativeTestSuite.h +25 -0
- package/ios/Tests/G9NativeTestSuite.m +560 -0
- package/ios/Tests/G9NativeTests.m +52 -0
- package/ios/g9lynx-native.podspec +29 -0
- package/ios/src/G9HostModule.h +14 -0
- package/ios/src/G9HostModule.m +121 -0
- package/ios/src/G9SqliteModule.h +14 -0
- package/ios/src/G9SqliteModule.m +167 -0
- package/ios/src/G9VideoUI.h +21 -0
- package/ios/src/G9VideoUI.m +250 -0
- package/ios/src/core/G9HostPaths.h +20 -0
- package/ios/src/core/G9HostPaths.m +23 -0
- package/ios/src/core/G9PreferencesCore.h +43 -0
- package/ios/src/core/G9PreferencesCore.m +114 -0
- package/ios/src/core/G9SqliteCore.h +62 -0
- package/ios/src/core/G9SqliteCore.m +497 -0
- package/ios/src/core/G9SqliteTransport.h +16 -0
- package/ios/src/core/G9SqliteTransport.m +85 -0
- package/ios/src/core/G9VideoCore.h +26 -0
- package/ios/src/core/G9VideoCore.m +37 -0
- package/ios/src/generated/G9HostModuleSpec.h +23 -0
- package/ios/src/generated/G9HostModuleSpec.m +2 -0
- package/ios/src/generated/G9SqliteModuleSpec.h +20 -0
- package/ios/src/generated/G9SqliteModuleSpec.m +2 -0
- package/lynx.lib.json +12 -0
- package/package.json +49 -4
- package/types/platform-native-module.d.ts +46 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
package com.g9lynx.g9native.sqlite.core
|
|
2
|
+
|
|
3
|
+
/** A 64-bit integer outside ±(2^53−1), carried as its decimal text (`{ int64: "…" }` in JS). */
|
|
4
|
+
data class G9Int64(val decimal: String)
|
|
5
|
+
|
|
6
|
+
/** JS `undefined` inside a parameter list (marshalled as `{ undefined: true }`): rejected with `misuse`, as in Node. */
|
|
7
|
+
object G9Undefined
|
|
8
|
+
|
|
9
|
+
/** A G9 error as data: the fields of `G9SqliteError` (plan/specs/05 §3). */
|
|
10
|
+
class G9SqliteException(
|
|
11
|
+
val code: String,
|
|
12
|
+
message: String,
|
|
13
|
+
val sqliteCode: Int? = null,
|
|
14
|
+
val sql: String? = null,
|
|
15
|
+
val completedStatements: Int? = null,
|
|
16
|
+
) : RuntimeException(message) {
|
|
17
|
+
/** The same error with the statement context added where it is still missing. */
|
|
18
|
+
fun withContext(sql: String?, completed: Int?): G9SqliteException =
|
|
19
|
+
G9SqliteException(code, message ?: code, sqliteCode, this.sql ?: sql, completedStatements ?: completed)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** SQLite primary result code → G9 error code (mirrors `sqliteErrorCodeFor` in @g9tm/lynxcontrols-sqlite). */
|
|
23
|
+
fun g9ErrorCode(resultCode: Int): String =
|
|
24
|
+
when (resultCode and 0xff) {
|
|
25
|
+
5 -> "busy"
|
|
26
|
+
6 -> "locked"
|
|
27
|
+
19 -> "constraint"
|
|
28
|
+
11, 26 -> "corrupt"
|
|
29
|
+
8 -> "readonly"
|
|
30
|
+
13 -> "full"
|
|
31
|
+
9 -> "interrupted"
|
|
32
|
+
21 -> "misuse"
|
|
33
|
+
14 -> "not-found"
|
|
34
|
+
else -> "other"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Any throwable → a [G9SqliteException] (engine errors keep their code; anything else is `misuse`). */
|
|
38
|
+
fun toG9Error(error: Throwable, sql: String? = null, completed: Int? = null): G9SqliteException =
|
|
39
|
+
when (error) {
|
|
40
|
+
is G9SqliteException -> error.withContext(sql, completed)
|
|
41
|
+
is G9SqlEngineException ->
|
|
42
|
+
G9SqliteException(g9ErrorCode(error.resultCode), error.message ?: "SQLite error", error.resultCode, sql, completed)
|
|
43
|
+
else -> G9SqliteException("misuse", error.message ?: error.toString(), null, sql, completed)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
internal fun misuse(message: String, sql: String? = null): Nothing = throw G9SqliteException("misuse", message, sql = sql)
|
|
47
|
+
|
|
48
|
+
/** Largest integer JS represents exactly (2^53 − 1). */
|
|
49
|
+
const val MAX_SAFE_INTEGER = 9007199254740991L
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A value from the JS bridge → a bindable value. The bridge delivers numbers as `Double` (sometimes `Int`/`Long`),
|
|
53
|
+
* strings, `ByteArray` (ArrayBuffer), `Map` (`{ int64 }` / `{ undefined: true }`) and `null`.
|
|
54
|
+
*/
|
|
55
|
+
fun fromBridge(value: Any?): Any? =
|
|
56
|
+
when (value) {
|
|
57
|
+
null, is String, is ByteArray, is Double, is Long -> value
|
|
58
|
+
is Int -> value.toLong()
|
|
59
|
+
is Float -> value.toDouble()
|
|
60
|
+
is Number -> value.toDouble()
|
|
61
|
+
is Map<*, *> ->
|
|
62
|
+
when {
|
|
63
|
+
value["int64"] is String -> G9Int64(value["int64"] as String)
|
|
64
|
+
value["undefined"] == true -> G9Undefined
|
|
65
|
+
else -> value
|
|
66
|
+
}
|
|
67
|
+
else -> value
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** A result value → what the bridge carries: safe integers as `Double`, others as [G9Int64]. */
|
|
71
|
+
fun toBridgeNumber(value: Long): Any = if (value in -MAX_SAFE_INTEGER..MAX_SAFE_INTEGER) value.toDouble() else G9Int64(value.toString())
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
package com.g9lynx.g9native.video
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.graphics.Matrix
|
|
5
|
+
import android.os.Handler
|
|
6
|
+
import android.os.Looper
|
|
7
|
+
import android.view.TextureView
|
|
8
|
+
import android.widget.FrameLayout
|
|
9
|
+
import androidx.media3.common.MediaItem
|
|
10
|
+
import androidx.media3.common.PlaybackException
|
|
11
|
+
import androidx.media3.common.Player
|
|
12
|
+
import androidx.media3.common.VideoSize
|
|
13
|
+
import androidx.media3.exoplayer.ExoPlayer
|
|
14
|
+
import com.g9lynx.g9native.video.core.G9VideoLoopTracker
|
|
15
|
+
import com.g9lynx.g9native.video.core.G9VideoMath
|
|
16
|
+
import com.lynx.tasm.behavior.Behavior
|
|
17
|
+
import com.lynx.tasm.behavior.LynxContext
|
|
18
|
+
import com.lynx.tasm.behavior.LynxProp
|
|
19
|
+
import com.lynx.tasm.behavior.ui.LynxUI
|
|
20
|
+
import com.lynx.tasm.event.LynxDetailEvent
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The `<g9-video>` element on Android (plan/specs/06 §7): one Media3 ExoPlayer drawing into a TextureView (a
|
|
24
|
+
* SurfaceView would ignore the opacity fades the intro carousel animates), muted looping playback with MAUI's
|
|
25
|
+
* `Aspect.AspectFill` look. Props: `src` (`asset:///…`, `file://…`, `http(s)://…`), `paused` (default true), `loop`,
|
|
26
|
+
* `muted` (default true), `start-seconds` (one best-effort seek), `near-end-seconds`, `object-fit` (`cover` | `contain`).
|
|
27
|
+
* Events: `ready` (first frame rendered), `nearend` `{ seconds }`, `looped`, `error` `{ code, message }`. The player is
|
|
28
|
+
* released when the element is destroyed or its `src` changes. Register it with {@link G9VideoBehaviors}.
|
|
29
|
+
*/
|
|
30
|
+
class G9VideoUI(context: LynxContext) : LynxUI<G9VideoView>(context) {
|
|
31
|
+
private val main = Handler(Looper.getMainLooper())
|
|
32
|
+
private var player: ExoPlayer? = null
|
|
33
|
+
private var src: String? = null
|
|
34
|
+
private var preparedSrc: String? = null
|
|
35
|
+
private var paused = true
|
|
36
|
+
private var loop = true
|
|
37
|
+
private var muted = true
|
|
38
|
+
private var startSeconds = 0.0
|
|
39
|
+
private var startApplied = false
|
|
40
|
+
private var cover = true
|
|
41
|
+
private val tracker = G9VideoLoopTracker()
|
|
42
|
+
|
|
43
|
+
private val poll =
|
|
44
|
+
object : Runnable {
|
|
45
|
+
override fun run() {
|
|
46
|
+
val p = player ?: return
|
|
47
|
+
tracker.progress(p.currentPosition, p.duration)?.let { send("nearend", mapOf("seconds" to it)) }
|
|
48
|
+
if (p.isPlaying) main.postDelayed(this, POLL_MS)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private val listener =
|
|
53
|
+
object : Player.Listener {
|
|
54
|
+
override fun onRenderedFirstFrame() = send("ready")
|
|
55
|
+
|
|
56
|
+
override fun onPlayerError(error: PlaybackException) =
|
|
57
|
+
send("error", mapOf("code" to error.errorCodeName, "message" to (error.message ?: error.errorCodeName)))
|
|
58
|
+
|
|
59
|
+
override fun onPositionDiscontinuity(old: Player.PositionInfo, new: Player.PositionInfo, reason: Int) {
|
|
60
|
+
if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
|
|
61
|
+
tracker.looped()
|
|
62
|
+
send("looped")
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun onPlaybackStateChanged(state: Int) {
|
|
67
|
+
val p = player ?: return
|
|
68
|
+
if (state == Player.STATE_READY && !startApplied) {
|
|
69
|
+
startApplied = true
|
|
70
|
+
G9VideoMath.startPositionMs(startSeconds, p.duration)?.let { p.seekTo(it) }
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
override fun onIsPlayingChanged(isPlaying: Boolean) {
|
|
75
|
+
main.removeCallbacks(poll)
|
|
76
|
+
if (isPlaying) main.post(poll)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
override fun onVideoSizeChanged(size: VideoSize) =
|
|
80
|
+
mView.setVideoSize(size.width * size.pixelWidthHeightRatio, size.height.toFloat())
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
override fun createView(context: Context): G9VideoView = G9VideoView(context)
|
|
84
|
+
|
|
85
|
+
@LynxProp(name = "src")
|
|
86
|
+
fun setSrc(value: String?) {
|
|
87
|
+
src = value?.takeIf { it.isNotBlank() }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@LynxProp(name = "paused", defaultBoolean = true)
|
|
91
|
+
fun setPaused(value: Boolean) {
|
|
92
|
+
paused = value
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@LynxProp(name = "loop", defaultBoolean = true)
|
|
96
|
+
fun setLoop(value: Boolean) {
|
|
97
|
+
loop = value
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@LynxProp(name = "muted", defaultBoolean = true)
|
|
101
|
+
fun setMuted(value: Boolean) {
|
|
102
|
+
muted = value
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
@LynxProp(name = "start-seconds")
|
|
106
|
+
fun setStartSeconds(value: Double) {
|
|
107
|
+
startSeconds = value
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@LynxProp(name = "near-end-seconds")
|
|
111
|
+
fun setNearEndSeconds(value: Double) {
|
|
112
|
+
tracker.nearEndSeconds = value
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@LynxProp(name = "object-fit")
|
|
116
|
+
fun setObjectFit(value: String?) {
|
|
117
|
+
cover = value != "contain"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
override fun onPropsUpdated() {
|
|
121
|
+
super.onPropsUpdated()
|
|
122
|
+
mView.cover = cover
|
|
123
|
+
if (src != preparedSrc) prepare()
|
|
124
|
+
player?.let {
|
|
125
|
+
it.repeatMode = if (loop) Player.REPEAT_MODE_ONE else Player.REPEAT_MODE_OFF
|
|
126
|
+
it.volume = if (muted) 0f else 1f
|
|
127
|
+
it.playWhenReady = !paused
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
private fun prepare() {
|
|
132
|
+
release()
|
|
133
|
+
preparedSrc = src
|
|
134
|
+
val uri = src ?: return
|
|
135
|
+
startApplied = false
|
|
136
|
+
tracker.looped()
|
|
137
|
+
val p = ExoPlayer.Builder(lynxContext).build()
|
|
138
|
+
player = p
|
|
139
|
+
p.addListener(listener)
|
|
140
|
+
p.setVideoTextureView(mView.texture)
|
|
141
|
+
p.setMediaItem(MediaItem.fromUri(uri))
|
|
142
|
+
p.prepare()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private fun release() {
|
|
146
|
+
main.removeCallbacks(poll)
|
|
147
|
+
player?.let {
|
|
148
|
+
it.removeListener(listener)
|
|
149
|
+
it.release()
|
|
150
|
+
}
|
|
151
|
+
player = null
|
|
152
|
+
preparedSrc = null
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
override fun destroy() {
|
|
156
|
+
release()
|
|
157
|
+
super.destroy()
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Lynx WRITES into the detail map it is given (LynxCustomEvent.addDetail adds its own keys before dispatch), so it must
|
|
162
|
+
* be a mutable copy: `emptyMap()` / `mapOf(…)` are read-only and threw UnsupportedOperationException on the main thread
|
|
163
|
+
* the moment the intro video rendered its first frame — a crash on every sign-out / fresh install (AgriPad Lynx,
|
|
164
|
+
* emulator, 2026-10-14).
|
|
165
|
+
*/
|
|
166
|
+
private fun send(name: String, detail: Map<String, Any> = emptyMap()) {
|
|
167
|
+
lynxContext.eventEmitter.sendCustomEvent(LynxDetailEvent(sign, name, HashMap<String, Any>(detail)))
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
private companion object {
|
|
171
|
+
const val POLL_MS = 100L
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** The element's view: a TextureView scaled to `cover` (crop) or `contain` (letterbox) the video frame. */
|
|
176
|
+
class G9VideoView(context: Context) : FrameLayout(context) {
|
|
177
|
+
val texture = TextureView(context)
|
|
178
|
+
private var videoW = 0f
|
|
179
|
+
private var videoH = 0f
|
|
180
|
+
|
|
181
|
+
var cover = true
|
|
182
|
+
set(value) {
|
|
183
|
+
field = value
|
|
184
|
+
updateTransform()
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
init {
|
|
188
|
+
clipChildren = true
|
|
189
|
+
addView(texture, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT))
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
fun setVideoSize(width: Float, height: Float) {
|
|
193
|
+
videoW = width
|
|
194
|
+
videoH = height
|
|
195
|
+
updateTransform()
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
|
|
199
|
+
super.onSizeChanged(w, h, oldw, oldh)
|
|
200
|
+
updateTransform()
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private fun updateTransform() {
|
|
204
|
+
val (sx, sy) = G9VideoMath.fitScale(width.toFloat(), height.toFloat(), videoW, videoH, cover)
|
|
205
|
+
texture.setTransform(Matrix().apply { setScale(sx, sy, width / 2f, height / 2f) })
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* The behaviours `@g9tm/lynxcontrols-native` adds to a LynxView: `<g9-video>`. Add them with the host's own XElements:
|
|
211
|
+
* `LynxViewBuilder().addBehaviors(hostBehaviors + G9VideoBehaviors.create())`.
|
|
212
|
+
*/
|
|
213
|
+
object G9VideoBehaviors {
|
|
214
|
+
fun create(): List<Behavior> =
|
|
215
|
+
listOf(
|
|
216
|
+
object : Behavior("g9-video", false, false, false) {
|
|
217
|
+
override fun createUI(context: LynxContext): LynxUI<*> = G9VideoUI(context)
|
|
218
|
+
},
|
|
219
|
+
)
|
|
220
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
package com.g9lynx.g9native.video.core
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The platform-free decisions of `<g9-video>` (plan/specs/06 §7, the intro carousel's media contract): when a looping
|
|
5
|
+
* video reports `nearend` and `looped`, where the one-time start seek lands, and how the frame is scaled to fill or
|
|
6
|
+
* fit the element. Pure Kotlin so the JVM suite runs it; the Media3 element only feeds it positions.
|
|
7
|
+
*/
|
|
8
|
+
class G9VideoLoopTracker(nearEndSeconds: Double = 0.0) {
|
|
9
|
+
/** How early `nearend` fires before the end of each loop; `<= 0` turns it off. */
|
|
10
|
+
var nearEndSeconds: Double = nearEndSeconds
|
|
11
|
+
set(value) {
|
|
12
|
+
field = if (value.isFinite() && value > 0) value else 0.0
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
private var nearEndSent = false
|
|
16
|
+
|
|
17
|
+
init {
|
|
18
|
+
this.nearEndSeconds = nearEndSeconds
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Feeds the playback position; returns the seconds left when `nearend` should fire now (once per loop), else null.
|
|
23
|
+
* Unknown durations (`<= 0`, Media3 `C.TIME_UNSET` is negative) never fire.
|
|
24
|
+
*/
|
|
25
|
+
fun progress(positionMs: Long, durationMs: Long): Double? {
|
|
26
|
+
if (nearEndSent || nearEndSeconds <= 0 || durationMs <= 0 || positionMs < 0) return null
|
|
27
|
+
val left = (durationMs - positionMs) / 1000.0
|
|
28
|
+
if (left < 0 || left > nearEndSeconds) return null
|
|
29
|
+
nearEndSent = true
|
|
30
|
+
return left
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The video restarted from the beginning: the next loop may report `nearend` again. */
|
|
34
|
+
fun looped() {
|
|
35
|
+
nearEndSent = false
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
object G9VideoMath {
|
|
40
|
+
/**
|
|
41
|
+
* The one-time start seek (MAUI `InitialVideoStartSeconds`, best effort): `startSeconds` in ms, or null when there
|
|
42
|
+
* is nothing to seek or it would land at or past the end (the video then starts at 0).
|
|
43
|
+
*/
|
|
44
|
+
fun startPositionMs(startSeconds: Double, durationMs: Long): Long? {
|
|
45
|
+
if (!startSeconds.isFinite() || startSeconds <= 0) return null
|
|
46
|
+
val target = (startSeconds * 1000).toLong()
|
|
47
|
+
if (durationMs > 0 && target >= durationMs) return null
|
|
48
|
+
return target
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* The x/y scale that turns a frame stretched over the whole view (what a TextureView draws) into `cover` (fill and
|
|
53
|
+
* crop, MAUI `Aspect.AspectFill`) or `contain` (letterbox). `(1, 1)` while either size is unknown.
|
|
54
|
+
*/
|
|
55
|
+
fun fitScale(viewW: Float, viewH: Float, videoW: Float, videoH: Float, cover: Boolean): Pair<Float, Float> {
|
|
56
|
+
if (viewW <= 0 || viewH <= 0 || videoW <= 0 || videoH <= 0) return 1f to 1f
|
|
57
|
+
val viewAspect = viewW / viewH
|
|
58
|
+
val videoAspect = videoW / videoH
|
|
59
|
+
val wider = videoAspect > viewAspect
|
|
60
|
+
return when {
|
|
61
|
+
cover && wider -> (videoAspect / viewAspect) to 1f
|
|
62
|
+
cover -> 1f to (viewAspect / videoAspect)
|
|
63
|
+
wider -> 1f to (viewAspect / videoAspect)
|
|
64
|
+
else -> (videoAspect / viewAspect) to 1f
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +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"}
|
package/dist/driver.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type G9SqliteDriver } from '@g9tm/lynxcontrols-sqlite';
|
|
2
|
+
import type { G9NativeTransport, G9SqliteNativeModule } from './protocol.js';
|
|
3
|
+
/** `NativeModules.G9SqliteModule`, or `null` where the native library is not linked. */
|
|
4
|
+
export declare function nativeSqliteModule(): G9SqliteNativeModule | null;
|
|
5
|
+
/** Options of {@link createNativeSqliteDriver}. */
|
|
6
|
+
export interface G9NativeDriverOptions {
|
|
7
|
+
/** The module (default: `NativeModules.G9SqliteModule`). Tests pass a fake. */
|
|
8
|
+
readonly module?: G9SqliteNativeModule;
|
|
9
|
+
/** Result transport (default `'columnar'`, specs/06 §6). */
|
|
10
|
+
readonly transport?: G9NativeTransport;
|
|
11
|
+
readonly name?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The Android/iOS {@link G9SqliteDriver}: androidx.sqlite `BundledSQLiteDriver` on Android, system `sqlite3` on iOS,
|
|
15
|
+
* one native thread/queue per open database. Cancellation: a batch aborted while queued never starts; aborting a running
|
|
16
|
+
* batch interrupts it on iOS (`sqlite3_interrupt`) and lets it finish on Android (`capabilities().interrupt`).
|
|
17
|
+
* Throws `misuse` when the native library is not linked and no module is given.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createNativeSqliteDriver(options?: G9NativeDriverOptions): G9SqliteDriver;
|
|
20
|
+
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAGA,OAAO,EAKL,KAAK,cAAc,EAMpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAKV,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAKpB,wFAAwF;AACxF,wBAAgB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI,CAMhE;AA6BD,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IACvC,4DAA4D;IAC5D,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CA8G5F"}
|
package/dist/driver.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { G9SqliteError, pragmaStatements } from "@g9tm/lynxcontrols-sqlite";
|
|
2
|
+
import { decodeRunValue } from "./transport.js";
|
|
3
|
+
function nativeSqliteModule() {
|
|
4
|
+
try {
|
|
5
|
+
var _ref;
|
|
6
|
+
return null != (_ref = "u" < typeof NativeModules ? void 0 : null == NativeModules ? void 0 : NativeModules.G9SqliteModule) ? _ref : null;
|
|
7
|
+
} catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function toError(e) {
|
|
12
|
+
return new G9SqliteError(e.code, e.message, {
|
|
13
|
+
...void 0 !== e.sqliteCode ? {
|
|
14
|
+
sqliteCode: e.sqliteCode
|
|
15
|
+
} : {},
|
|
16
|
+
...void 0 !== e.sql ? {
|
|
17
|
+
sql: e.sql
|
|
18
|
+
} : {},
|
|
19
|
+
...void 0 !== e.completedStatements ? {
|
|
20
|
+
completedStatements: e.completedStatements
|
|
21
|
+
} : {}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function call(invoke) {
|
|
25
|
+
return new Promise((resolve, reject)=>{
|
|
26
|
+
try {
|
|
27
|
+
invoke((envelope)=>{
|
|
28
|
+
var _ref;
|
|
29
|
+
if (null == envelope ? void 0 : envelope.ok) resolve(envelope.value);
|
|
30
|
+
else reject(toError(null != (_ref = null == envelope ? void 0 : envelope.error) ? _ref : {
|
|
31
|
+
code: 'other',
|
|
32
|
+
message: 'The native module sent no reply.'
|
|
33
|
+
}));
|
|
34
|
+
});
|
|
35
|
+
} catch (error) {
|
|
36
|
+
var _ref;
|
|
37
|
+
reject(new G9SqliteError('other', `The native module call failed: ${null != (_ref = null == error ? void 0 : error.message) ? _ref : error}`));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function param(value) {
|
|
42
|
+
return void 0 === value ? {
|
|
43
|
+
undefined: true
|
|
44
|
+
} : value;
|
|
45
|
+
}
|
|
46
|
+
function createNativeSqliteDriver(options = {}) {
|
|
47
|
+
var _options_module, _options_transport, _options_name;
|
|
48
|
+
const native = null != (_options_module = options.module) ? _options_module : nativeSqliteModule();
|
|
49
|
+
if (!native) throw new G9SqliteError('misuse', 'NativeModules.G9SqliteModule is missing: add @g9tm/lynxcontrols-native to the app so Autolink links it.');
|
|
50
|
+
const transport = null != (_options_transport = options.transport) ? _options_transport : 'columnar';
|
|
51
|
+
const queues = new Map();
|
|
52
|
+
const txSession = new Map();
|
|
53
|
+
function enqueue(session, task) {
|
|
54
|
+
var _queues_get;
|
|
55
|
+
const previous = null != (_queues_get = queues.get(session)) ? _queues_get : Promise.resolve();
|
|
56
|
+
const next = previous.then(task, task);
|
|
57
|
+
queues.set(session, next.then(()=>void 0, ()=>void 0));
|
|
58
|
+
return next;
|
|
59
|
+
}
|
|
60
|
+
const unknownTx = ()=>Promise.reject(new G9SqliteError('misuse', 'The transaction is finished or unknown.'));
|
|
61
|
+
return {
|
|
62
|
+
name: null != (_options_name = options.name) ? _options_name : 'native',
|
|
63
|
+
async capabilities () {
|
|
64
|
+
const value = await call((reply)=>native.capabilities(reply));
|
|
65
|
+
return Object.freeze({
|
|
66
|
+
sqliteVersion: String(value.sqliteVersion),
|
|
67
|
+
maxVariables: Number(value.maxVariables),
|
|
68
|
+
json1: true === value.json1,
|
|
69
|
+
returning: true === value.returning,
|
|
70
|
+
upsert: true === value.upsert,
|
|
71
|
+
interrupt: true === value.interrupt
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
async open (open) {
|
|
75
|
+
const token = await call((reply)=>{
|
|
76
|
+
var _open_pragmas;
|
|
77
|
+
return native.open({
|
|
78
|
+
path: open.path,
|
|
79
|
+
...void 0 !== open.readOnly ? {
|
|
80
|
+
readOnly: open.readOnly
|
|
81
|
+
} : {},
|
|
82
|
+
...void 0 !== open.create ? {
|
|
83
|
+
create: open.create
|
|
84
|
+
} : {},
|
|
85
|
+
pragmas: pragmaStatements(null != (_open_pragmas = open.pragmas) ? _open_pragmas : {}, open.durability)
|
|
86
|
+
}, reply);
|
|
87
|
+
});
|
|
88
|
+
return token;
|
|
89
|
+
},
|
|
90
|
+
run (session, statements, run = {}) {
|
|
91
|
+
var _run_signal;
|
|
92
|
+
const cancelled = ()=>new G9SqliteError('cancelled', 'Cancelled before the batch started.');
|
|
93
|
+
if (null == (_run_signal = run.signal) ? void 0 : _run_signal.aborted) return Promise.reject(cancelled());
|
|
94
|
+
return enqueue(session, async ()=>{
|
|
95
|
+
var _run_signal, _run_signal1;
|
|
96
|
+
if (null == (_run_signal = run.signal) ? void 0 : _run_signal.aborted) throw cancelled();
|
|
97
|
+
const onAbort = ()=>{
|
|
98
|
+
var _native_interrupt;
|
|
99
|
+
return null == (_native_interrupt = native.interrupt) ? void 0 : _native_interrupt.call(native, session);
|
|
100
|
+
};
|
|
101
|
+
null == (_run_signal1 = run.signal) || _run_signal1.addEventListener('abort', onAbort);
|
|
102
|
+
try {
|
|
103
|
+
const value = await call((reply)=>native.run(session, statements.map((s)=>({
|
|
104
|
+
sql: s.sql,
|
|
105
|
+
params: s.params.map(param)
|
|
106
|
+
})), {
|
|
107
|
+
...void 0 !== run.tx ? {
|
|
108
|
+
tx: run.tx
|
|
109
|
+
} : {},
|
|
110
|
+
...void 0 !== run.maxRows ? {
|
|
111
|
+
maxRows: run.maxRows
|
|
112
|
+
} : {},
|
|
113
|
+
...void 0 !== run.atomic ? {
|
|
114
|
+
atomic: run.atomic
|
|
115
|
+
} : {},
|
|
116
|
+
transport
|
|
117
|
+
}, reply));
|
|
118
|
+
return decodeRunValue(value);
|
|
119
|
+
} finally{
|
|
120
|
+
var _run_signal2;
|
|
121
|
+
null == (_run_signal2 = run.signal) || _run_signal2.removeEventListener('abort', onAbort);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
begin (session, mode) {
|
|
126
|
+
return enqueue(session, async ()=>{
|
|
127
|
+
const tx = await call((reply)=>native.begin(session, mode, reply));
|
|
128
|
+
txSession.set(tx, session);
|
|
129
|
+
return tx;
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
commit (tx) {
|
|
133
|
+
var _txSession_get;
|
|
134
|
+
if ('string' != typeof tx) return unknownTx();
|
|
135
|
+
return enqueue(null != (_txSession_get = txSession.get(tx)) ? _txSession_get : `#${tx}`, async ()=>{
|
|
136
|
+
await call((reply)=>native.commit(tx, reply));
|
|
137
|
+
txSession.delete(tx);
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
rollback (tx) {
|
|
141
|
+
var _txSession_get;
|
|
142
|
+
if ('string' != typeof tx) return unknownTx();
|
|
143
|
+
return enqueue(null != (_txSession_get = txSession.get(tx)) ? _txSession_get : `#${tx}`, async ()=>{
|
|
144
|
+
txSession.delete(tx);
|
|
145
|
+
await call((reply)=>native.rollback(tx, reply));
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
close (session) {
|
|
149
|
+
if ('string' != typeof session) return Promise.reject(new G9SqliteError('misuse', 'The database session is closed or unknown.'));
|
|
150
|
+
return enqueue(session, async ()=>{
|
|
151
|
+
await call((reply)=>native.close(session, reply));
|
|
152
|
+
queues.delete(session);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export { createNativeSqliteDriver, nativeSqliteModule };
|
|
158
|
+
|
|
159
|
+
//# sourceMappingURL=driver.js.map
|