@voltkit-rtc/react-native 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1606 -2
  4. package/android/build.gradle +70 -0
  5. package/android/consumer-rules.pro +21 -0
  6. package/android/src/main/AndroidManifest.xml +25 -0
  7. package/android/src/main/java/com/voltkit/rtc/reactnative/AppVisibility.kt +67 -0
  8. package/android/src/main/java/com/voltkit/rtc/reactnative/AudioDevices.kt +67 -0
  9. package/android/src/main/java/com/voltkit/rtc/reactnative/AudioRouter.kt +487 -0
  10. package/android/src/main/java/com/voltkit/rtc/reactnative/CallServiceTypes.kt +120 -0
  11. package/android/src/main/java/com/voltkit/rtc/reactnative/NativeTimers.kt +106 -0
  12. package/android/src/main/java/com/voltkit/rtc/reactnative/NetworkWatch.kt +120 -0
  13. package/android/src/main/java/com/voltkit/rtc/reactnative/OutputChoice.kt +65 -0
  14. package/android/src/main/java/com/voltkit/rtc/reactnative/RtcConfig.kt +83 -0
  15. package/android/src/main/java/com/voltkit/rtc/reactnative/ScoLink.kt +61 -0
  16. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitCallService.kt +287 -0
  17. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcInitProvider.kt +215 -0
  18. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcModule.kt +313 -0
  19. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcPackage.kt +30 -0
  20. package/android/src/main/res/drawable/voltkit_rtc_default_call_icon.xml +15 -0
  21. package/android/src/main/res/raw/voltkit_rtc_keep.xml +7 -0
  22. package/app.plugin.js +17 -0
  23. package/lib/commonjs/audio.js +215 -0
  24. package/lib/commonjs/audio.js.map +1 -0
  25. package/lib/commonjs/components.js +207 -0
  26. package/lib/commonjs/components.js.map +1 -0
  27. package/lib/commonjs/create-client.js +47 -0
  28. package/lib/commonjs/create-client.js.map +1 -0
  29. package/lib/commonjs/errors.js +99 -0
  30. package/lib/commonjs/errors.js.map +1 -0
  31. package/lib/commonjs/globals.js +61 -0
  32. package/lib/commonjs/globals.js.map +1 -0
  33. package/lib/commonjs/index.js +234 -0
  34. package/lib/commonjs/index.js.map +1 -0
  35. package/lib/commonjs/local-media.js +392 -0
  36. package/lib/commonjs/local-media.js.map +1 -0
  37. package/lib/commonjs/native-session.js +314 -0
  38. package/lib/commonjs/native-session.js.map +1 -0
  39. package/lib/commonjs/native.js +99 -0
  40. package/lib/commonjs/native.js.map +1 -0
  41. package/lib/commonjs/package.json +1 -0
  42. package/lib/commonjs/permissions.js +166 -0
  43. package/lib/commonjs/permissions.js.map +1 -0
  44. package/lib/commonjs/platform/android.js +126 -0
  45. package/lib/commonjs/platform/android.js.map +1 -0
  46. package/lib/commonjs/platform/common.js +138 -0
  47. package/lib/commonjs/platform/common.js.map +1 -0
  48. package/lib/commonjs/platform/devices.js +151 -0
  49. package/lib/commonjs/platform/devices.js.map +1 -0
  50. package/lib/commonjs/platform/index.js +35 -0
  51. package/lib/commonjs/platform/index.js.map +1 -0
  52. package/lib/commonjs/platform/ios.js +54 -0
  53. package/lib/commonjs/platform/ios.js.map +1 -0
  54. package/lib/commonjs/platform/streams.js +273 -0
  55. package/lib/commonjs/platform/streams.js.map +1 -0
  56. package/lib/commonjs/platform/timers.js +71 -0
  57. package/lib/commonjs/platform/timers.js.map +1 -0
  58. package/lib/commonjs/platform/visibility.js +60 -0
  59. package/lib/commonjs/platform/visibility.js.map +1 -0
  60. package/lib/commonjs/preflight.js +77 -0
  61. package/lib/commonjs/preflight.js.map +1 -0
  62. package/lib/commonjs/provider.js +73 -0
  63. package/lib/commonjs/provider.js.map +1 -0
  64. package/lib/commonjs/specs/NativeVoltkitRtc.js +29 -0
  65. package/lib/commonjs/specs/NativeVoltkitRtc.js.map +1 -0
  66. package/lib/module/audio.js +207 -0
  67. package/lib/module/audio.js.map +1 -0
  68. package/lib/module/components.js +200 -0
  69. package/lib/module/components.js.map +1 -0
  70. package/lib/module/create-client.js +42 -0
  71. package/lib/module/create-client.js.map +1 -0
  72. package/lib/module/errors.js +87 -0
  73. package/lib/module/errors.js.map +1 -0
  74. package/lib/module/globals.js +53 -0
  75. package/lib/module/globals.js.map +1 -0
  76. package/lib/module/index.js +33 -0
  77. package/lib/module/index.js.map +1 -0
  78. package/lib/module/local-media.js +387 -0
  79. package/lib/module/local-media.js.map +1 -0
  80. package/lib/module/native-session.js +309 -0
  81. package/lib/module/native-session.js.map +1 -0
  82. package/lib/module/native.js +87 -0
  83. package/lib/module/native.js.map +1 -0
  84. package/lib/module/package.json +1 -0
  85. package/lib/module/permissions.js +160 -0
  86. package/lib/module/permissions.js.map +1 -0
  87. package/lib/module/platform/android.js +122 -0
  88. package/lib/module/platform/android.js.map +1 -0
  89. package/lib/module/platform/common.js +128 -0
  90. package/lib/module/platform/common.js.map +1 -0
  91. package/lib/module/platform/devices.js +142 -0
  92. package/lib/module/platform/devices.js.map +1 -0
  93. package/lib/module/platform/index.js +24 -0
  94. package/lib/module/platform/index.js.map +1 -0
  95. package/lib/module/platform/ios.js +49 -0
  96. package/lib/module/platform/ios.js.map +1 -0
  97. package/lib/module/platform/streams.js +268 -0
  98. package/lib/module/platform/streams.js.map +1 -0
  99. package/lib/module/platform/timers.js +67 -0
  100. package/lib/module/platform/timers.js.map +1 -0
  101. package/lib/module/platform/visibility.js +54 -0
  102. package/lib/module/platform/visibility.js.map +1 -0
  103. package/lib/module/preflight.js +72 -0
  104. package/lib/module/preflight.js.map +1 -0
  105. package/lib/module/provider.js +68 -0
  106. package/lib/module/provider.js.map +1 -0
  107. package/lib/module/specs/NativeVoltkitRtc.js +37 -0
  108. package/lib/module/specs/NativeVoltkitRtc.js.map +1 -0
  109. package/lib/typescript/commonjs/audio.d.ts +58 -0
  110. package/lib/typescript/commonjs/audio.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/components.d.ts +58 -0
  112. package/lib/typescript/commonjs/components.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/create-client.d.ts +35 -0
  114. package/lib/typescript/commonjs/create-client.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/errors.d.ts +34 -0
  116. package/lib/typescript/commonjs/errors.d.ts.map +1 -0
  117. package/lib/typescript/commonjs/globals.d.ts +16 -0
  118. package/lib/typescript/commonjs/globals.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/index.d.ts +24 -0
  120. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  121. package/lib/typescript/commonjs/local-media.d.ts +86 -0
  122. package/lib/typescript/commonjs/local-media.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/native-session.d.ts +38 -0
  124. package/lib/typescript/commonjs/native-session.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/native.d.ts +18 -0
  126. package/lib/typescript/commonjs/native.d.ts.map +1 -0
  127. package/lib/typescript/commonjs/package.json +1 -0
  128. package/lib/typescript/commonjs/permissions.d.ts +30 -0
  129. package/lib/typescript/commonjs/permissions.d.ts.map +1 -0
  130. package/lib/typescript/commonjs/platform/android.d.ts +4 -0
  131. package/lib/typescript/commonjs/platform/android.d.ts.map +1 -0
  132. package/lib/typescript/commonjs/platform/common.d.ts +101 -0
  133. package/lib/typescript/commonjs/platform/common.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/platform/devices.d.ts +42 -0
  135. package/lib/typescript/commonjs/platform/devices.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/platform/index.d.ts +6 -0
  137. package/lib/typescript/commonjs/platform/index.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/platform/ios.d.ts +4 -0
  139. package/lib/typescript/commonjs/platform/ios.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/platform/streams.d.ts +82 -0
  141. package/lib/typescript/commonjs/platform/streams.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/platform/timers.d.ts +19 -0
  143. package/lib/typescript/commonjs/platform/timers.d.ts.map +1 -0
  144. package/lib/typescript/commonjs/platform/visibility.d.ts +11 -0
  145. package/lib/typescript/commonjs/platform/visibility.d.ts.map +1 -0
  146. package/lib/typescript/commonjs/preflight.d.ts +19 -0
  147. package/lib/typescript/commonjs/preflight.d.ts.map +1 -0
  148. package/lib/typescript/commonjs/provider.d.ts +35 -0
  149. package/lib/typescript/commonjs/provider.d.ts.map +1 -0
  150. package/lib/typescript/commonjs/specs/NativeVoltkitRtc.d.ts +157 -0
  151. package/lib/typescript/commonjs/specs/NativeVoltkitRtc.d.ts.map +1 -0
  152. package/lib/typescript/module/audio.d.ts +58 -0
  153. package/lib/typescript/module/audio.d.ts.map +1 -0
  154. package/lib/typescript/module/components.d.ts +58 -0
  155. package/lib/typescript/module/components.d.ts.map +1 -0
  156. package/lib/typescript/module/create-client.d.ts +35 -0
  157. package/lib/typescript/module/create-client.d.ts.map +1 -0
  158. package/lib/typescript/module/errors.d.ts +34 -0
  159. package/lib/typescript/module/errors.d.ts.map +1 -0
  160. package/lib/typescript/module/globals.d.ts +16 -0
  161. package/lib/typescript/module/globals.d.ts.map +1 -0
  162. package/lib/typescript/module/index.d.ts +24 -0
  163. package/lib/typescript/module/index.d.ts.map +1 -0
  164. package/lib/typescript/module/local-media.d.ts +86 -0
  165. package/lib/typescript/module/local-media.d.ts.map +1 -0
  166. package/lib/typescript/module/native-session.d.ts +38 -0
  167. package/lib/typescript/module/native-session.d.ts.map +1 -0
  168. package/lib/typescript/module/native.d.ts +18 -0
  169. package/lib/typescript/module/native.d.ts.map +1 -0
  170. package/lib/typescript/module/package.json +1 -0
  171. package/lib/typescript/module/permissions.d.ts +30 -0
  172. package/lib/typescript/module/permissions.d.ts.map +1 -0
  173. package/lib/typescript/module/platform/android.d.ts +4 -0
  174. package/lib/typescript/module/platform/android.d.ts.map +1 -0
  175. package/lib/typescript/module/platform/common.d.ts +101 -0
  176. package/lib/typescript/module/platform/common.d.ts.map +1 -0
  177. package/lib/typescript/module/platform/devices.d.ts +42 -0
  178. package/lib/typescript/module/platform/devices.d.ts.map +1 -0
  179. package/lib/typescript/module/platform/index.d.ts +6 -0
  180. package/lib/typescript/module/platform/index.d.ts.map +1 -0
  181. package/lib/typescript/module/platform/ios.d.ts +4 -0
  182. package/lib/typescript/module/platform/ios.d.ts.map +1 -0
  183. package/lib/typescript/module/platform/streams.d.ts +82 -0
  184. package/lib/typescript/module/platform/streams.d.ts.map +1 -0
  185. package/lib/typescript/module/platform/timers.d.ts +19 -0
  186. package/lib/typescript/module/platform/timers.d.ts.map +1 -0
  187. package/lib/typescript/module/platform/visibility.d.ts +11 -0
  188. package/lib/typescript/module/platform/visibility.d.ts.map +1 -0
  189. package/lib/typescript/module/preflight.d.ts +19 -0
  190. package/lib/typescript/module/preflight.d.ts.map +1 -0
  191. package/lib/typescript/module/provider.d.ts +35 -0
  192. package/lib/typescript/module/provider.d.ts.map +1 -0
  193. package/lib/typescript/module/specs/NativeVoltkitRtc.d.ts +157 -0
  194. package/lib/typescript/module/specs/NativeVoltkitRtc.d.ts.map +1 -0
  195. package/package.json +140 -4
  196. package/plugin/build/android.d.ts +36 -0
  197. package/plugin/build/android.js +265 -0
  198. package/plugin/build/index.d.ts +9 -0
  199. package/plugin/build/index.js +54 -0
  200. package/plugin/build/ios.d.ts +4 -0
  201. package/plugin/build/ios.js +43 -0
  202. package/plugin/build/options.d.ts +93 -0
  203. package/plugin/build/options.js +140 -0
  204. package/react-native.config.js +11 -0
  205. package/src/audio.ts +221 -0
  206. package/src/components.tsx +233 -0
  207. package/src/create-client.ts +53 -0
  208. package/src/errors.ts +81 -0
  209. package/src/globals.ts +54 -0
  210. package/src/index.ts +95 -0
  211. package/src/local-media.ts +420 -0
  212. package/src/native-session.tsx +338 -0
  213. package/src/native.ts +84 -0
  214. package/src/permissions.ts +173 -0
  215. package/src/platform/android.ts +128 -0
  216. package/src/platform/common.ts +157 -0
  217. package/src/platform/devices.ts +148 -0
  218. package/src/platform/index.ts +22 -0
  219. package/src/platform/ios.ts +48 -0
  220. package/src/platform/streams.ts +285 -0
  221. package/src/platform/timers.ts +72 -0
  222. package/src/platform/visibility.ts +59 -0
  223. package/src/preflight.ts +60 -0
  224. package/src/provider.tsx +86 -0
  225. package/src/specs/NativeVoltkitRtc.ts +180 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,96 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ 2026-10-27. The first release: VoltKit RTC calls, audio rooms and live video in React Native, on Android, with iOS in
6
+ preview. Peer dependencies: `@voltkit-rtc/client` `>=0.9.12 <0.10.0`, `@voltkit-rtc/react` `^0.1.1`,
7
+ `react-native-webrtc` `^155.0.1`, `react` `>=19.1.0` and `react-native` `>=0.82.0` (the New Architecture); `expo`
8
+ `>=58` is optional, for the config plugin. Tested on Android (emulator, API 37.1); iOS in preview; earpiece and
9
+ Bluetooth routing tested in unit tests, not on hardware.
10
+
11
+ ### What ships
12
+
13
+ - **The React SDK's hooks, unchanged**, re-exported from `@voltkit-rtc/react` 0.1.1: `useVoltkitClient`, `useRoom`,
14
+ `useConnectionState`, `useParticipants`, `useRemoteTracks`, `useNetworkQuality`, `useWalletLow`, `useVoltkitEvent`,
15
+ `useActiveSpeakers`, `useAudioLevels`, `useCpuConstrained`, `useDevices`, `useIsSpeaking`, `useMediaWarnings`,
16
+ `usePublishFallback` and `useStreamFallback`, with the same type re-exports, so a React call screen ports by changing
17
+ the import and its markup. They run on `@voltkit-rtc/client` 0.9.12's injected platform layer
18
+ (`ClientOptions.platform`, this package's `reactNativePlatform()`) with mediasoup-client's `ReactNative106` handler:
19
+ capture, devices and audio routing, streams and their release order, the app's visibility from the process
20
+ lifecycle, the network coming back, and native timers for the client's own timers (the reconnect backoff, socket
21
+ liveness, sampling), which React Native's JavaScript timers cannot run in the background or with the screen off.
22
+ - **`VoltkitProvider`**: the React provider's props (the token hand-over, `client`, `connect`, the callbacks and the
23
+ StrictMode behaviour included), plus `audio` (the call audio: `speakerphone`, `manage`), `background`
24
+ (`pauseCamera`, default true; `pauseMic`, default false) and `callService` (`true`, `false`, or the notification's
25
+ `title`, `text` and `leaveLabel`). It makes its client with `reactNativeClientOptions`. Where react-native-webrtc's
26
+ native module is missing (Expo Go, an app not built again) it makes no client and reports `media-unavailable`
27
+ `{ reason: 'webrtc-missing' }` through `onError`; on Android without this package's native module, `native-missing`.
28
+ Nothing throws.
29
+ - **`useLocalMedia`**: the React SDK's, plus `switchCamera()` (front and back on the same track and producer, so
30
+ viewers see no gap; resolves to whether the front camera is in use) and `facingMode`. `publish()` asks for the
31
+ camera and microphone permissions before any device opens (a refusal rejects with `media-unavailable`
32
+ `{ permission, status }`, and the camera light never comes on), then captures through react-native-webrtc at the
33
+ frame and frame rate it will send, never more than the project allows. `startScreenShare()` goes through
34
+ react-native-webrtc's screen-capture consent on Android.
35
+ - **`VideoTrack`** on react-native-webrtc's `RTCView`: one native stream per track, shared by its views and released
36
+ before the connection it came on closes (react-native-webrtc 155 kills the app when a stream is released after its
37
+ track's connection has gone); `producerId` drives adaptive stream from the view's size and `visible`; `mirror`,
38
+ `objectFit`, `zOrder` and `onDimensionsChange`; a view with no frame after 3 s mounts its native view again
39
+ (react-native-webrtc issue 1611). **`AudioTrack`** sets one remote track's `volume` or `muted` and renders nothing:
40
+ React Native plays remote audio by itself.
41
+ - **Audio routing on Android**: `useAudioOutput()`, `setSpeakerphoneOn(on)` and `selectAudioOutput(deviceId)`, on a
42
+ port of the Android SDK's audio router: the loudspeaker, the earpiece, wired and USB headsets and Bluetooth
43
+ (`setCommunicationDevice` on Android 12 and later, SCO before); the call audio (mode, focus, routing) held from the
44
+ join to the close and shared by two clients, and put back as it was found; the `media` audio mode for listen-only
45
+ apps; the phone's own echo canceller and noise suppressor by default.
46
+ - **Calls in the background on Android**: the foreground service `VoltkitCallService`, declared by the app (the Expo
47
+ plugin's `android.callService`, default on, or a manifest block), started by the provider when the call connects
48
+ while the app is visible, with the types `microphone` or `mediaPlayback`, and `camera` and `mediaProjection` when the
49
+ app declares them; one notification for every call, with a Leave action; the call ends when the app is swiped away.
50
+ The camera pauses in the background and comes back with the app (`background.pauseCamera`); the microphone keeps
51
+ going unless `pauseMic`. `useCallService()` says whether it is declared, running, and with which types.
52
+ - **The network coming back, on Android**: the SDK watches the system's default network, so a reconnect waiting out
53
+ its backoff tries again as soon as a network is back, with the screen off too while the call service runs. It
54
+ reports the network 500 ms after Android's callback, and only if that network is still the default then: Android
55
+ hands the callback out before it has switched the app's routes to the new network (40 to 80 ms later on the API 37
56
+ emulator), and a connect made at once failed.
57
+ - **Permissions**: `requestMediaPermissions`, `checkMediaPermissions` and `usePermissions` for `camera`, `microphone`
58
+ and `notifications` (Android 13 and later), with `granted`, `denied` and `blocked` (Android's "never ask again"; on
59
+ iOS every refusal). The SDK's own captures afterwards (a reconnect, a switch) only check and never ask.
60
+ - **`preflight(wsUrl, token, options?)`** with this platform: it publishes the microphone after the join when its
61
+ permission is already granted, never asks for one, and never rejects.
62
+ - **`createClient`, `reactNativeClientOptions`, `reactNativePlatform`, `registerVoltkitGlobals`** (run on import; safe
63
+ without the native module) and **`SDK_VERSION`** (what `getDiagnostics()` reports; a warning in the log when the
64
+ app's native code was built from another version of the package).
65
+ - **The Expo config plugin** (`app.plugin.js`): `cameraPermission`, `microphonePermission`, `android.camera`,
66
+ `android.callService`, `android.callServiceCamera`, `android.screenShare`, `android.audioMode`,
67
+ `android.hardwareEchoCancellation`, `ios.backgroundAudio` and `ios.voip`. It writes the permissions, the call
68
+ service, the `in.voltkit.rtc.*` meta-data and `uses-feature android:required="false"` for the camera and microphone
69
+ features into the Android manifest, and the usage strings and background modes into Info.plist; the app's
70
+ `blockedPermissions` win, with a prebuild warning for a service that could not run; an unknown option stops prebuild
71
+ by name.
72
+ - **R8 consumer rules**: `-dontwarn org.webrtc.Dav1dDecoder$Natives`, which every release build with
73
+ react-native-webrtc 155.0.1 needs, so apps add no rule of their own.
74
+ - **Every frame reaches viewers**: react-native-webrtc's libwebrtc encodes a camera's simulcast layers with three
75
+ temporal layers whatever it is asked, so the platform tells the client to signal them (client 0.9.12's
76
+ `simulcastTemporalLayers`); signalled as one layer, the media server forwarded a quarter of the frames.
77
+ - **Errors**: every error this package raises is an `RpcError` with a code from the shared registry, with what is
78
+ missing in `data`: `{ permission, status }`, `{ reason: 'webrtc-missing' | 'native-missing' | <a capture error> }`,
79
+ `{ feature: 'callService' }`, `{ platform: 'ios', feature }`.
80
+
81
+ ### Known gaps in 0.1.0 (the conformance list)
82
+
83
+ - **iOS is a preview**: JavaScript only, with no native module of this package. The code is written for
84
+ react-native-webrtc's iOS side, but VoltKit has not compiled or run it on an iPhone or a simulator. Audio routing
85
+ (`setSpeakerphoneOn`, `selectAudioOutput`, `switchDevice('audiooutput', ...)`) rejects with `media-unavailable`
86
+ `{ platform: 'ios' }`, there is no call service (`useCallService().declared` is false), and `startScreenShare()`
87
+ rejects with `screen-share-unsupported`.
88
+ - **Screen sharing is Android only**, and goes out without the screen's sound.
89
+ - **No in-app music**: `publishMusic()` rejects with `music-unavailable`.
90
+ - **No device recording**: `startRecording()` rejects with `media-unavailable`.
91
+ - **No noise-suppression or video-effects processors**: they are browser-only in `@voltkit-rtc/client`.
92
+ - **`play(element)` and `autoplayFailed` do not apply** (remote audio plays by itself), and
93
+ **`StreamClient.prepareConnection`** does nothing here.
94
+ - **Earpiece and Bluetooth routing are tested in unit tests, not on hardware**: the emulator has only the
95
+ loudspeaker, and its microphone records silence, so publishing sound was checked by the bytes sent, not by level.
96
+ - **Xiaomi, Redmi and POCO battery savers** were not tested: the docs give general advice only.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 VoltKit
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.