@quenty/studio-bridge 0.7.1 → 0.8.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 (689) hide show
  1. package/CHANGELOG.md +12 -44
  2. package/README.md +166 -115
  3. package/dist/src/bridge/bridge-connection-remote.test.d.ts +7 -0
  4. package/dist/src/bridge/bridge-connection-remote.test.d.ts.map +1 -0
  5. package/dist/src/bridge/bridge-connection-remote.test.js +144 -0
  6. package/dist/src/bridge/bridge-connection-remote.test.js.map +1 -0
  7. package/dist/src/bridge/bridge-connection.d.ts +112 -0
  8. package/dist/src/bridge/bridge-connection.d.ts.map +1 -0
  9. package/dist/src/bridge/bridge-connection.js +528 -0
  10. package/dist/src/bridge/bridge-connection.js.map +1 -0
  11. package/dist/src/bridge/bridge-connection.test.d.ts +6 -0
  12. package/dist/src/bridge/bridge-connection.test.d.ts.map +1 -0
  13. package/dist/src/bridge/bridge-connection.test.js +773 -0
  14. package/dist/src/bridge/bridge-connection.test.js.map +1 -0
  15. package/dist/src/bridge/bridge-session.d.ts +38 -0
  16. package/dist/src/bridge/bridge-session.d.ts.map +1 -0
  17. package/dist/src/bridge/bridge-session.js +259 -0
  18. package/dist/src/bridge/bridge-session.js.map +1 -0
  19. package/dist/src/bridge/bridge-session.test.d.ts +6 -0
  20. package/dist/src/bridge/bridge-session.test.d.ts.map +1 -0
  21. package/dist/src/bridge/bridge-session.test.js +264 -0
  22. package/dist/src/bridge/bridge-session.test.js.map +1 -0
  23. package/dist/src/bridge/index.d.ts +13 -0
  24. package/dist/src/bridge/index.d.ts.map +1 -0
  25. package/dist/src/bridge/index.js +13 -0
  26. package/dist/src/bridge/index.js.map +1 -0
  27. package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts +9 -0
  28. package/dist/src/bridge/internal/__tests__/failover-crash.test.d.ts.map +1 -0
  29. package/dist/src/bridge/internal/__tests__/failover-crash.test.js +159 -0
  30. package/dist/src/bridge/internal/__tests__/failover-crash.test.js.map +1 -0
  31. package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts +9 -0
  32. package/dist/src/bridge/internal/__tests__/failover-graceful.test.d.ts.map +1 -0
  33. package/dist/src/bridge/internal/__tests__/failover-graceful.test.js +218 -0
  34. package/dist/src/bridge/internal/__tests__/failover-graceful.test.js.map +1 -0
  35. package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts +9 -0
  36. package/dist/src/bridge/internal/__tests__/failover-inflight.test.d.ts.map +1 -0
  37. package/dist/src/bridge/internal/__tests__/failover-inflight.test.js +246 -0
  38. package/dist/src/bridge/internal/__tests__/failover-inflight.test.js.map +1 -0
  39. package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts +10 -0
  40. package/dist/src/bridge/internal/__tests__/host-client-integration.test.d.ts.map +1 -0
  41. package/dist/src/bridge/internal/__tests__/host-client-integration.test.js +298 -0
  42. package/dist/src/bridge/internal/__tests__/host-client-integration.test.js.map +1 -0
  43. package/dist/src/bridge/internal/bridge-client.d.ts +70 -0
  44. package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -0
  45. package/dist/src/bridge/internal/bridge-client.js +344 -0
  46. package/dist/src/bridge/internal/bridge-client.js.map +1 -0
  47. package/dist/src/bridge/internal/bridge-client.test.d.ts +7 -0
  48. package/dist/src/bridge/internal/bridge-client.test.d.ts.map +1 -0
  49. package/dist/src/bridge/internal/bridge-client.test.js +301 -0
  50. package/dist/src/bridge/internal/bridge-client.test.js.map +1 -0
  51. package/dist/src/bridge/internal/bridge-host.d.ts +78 -0
  52. package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -0
  53. package/dist/src/bridge/internal/bridge-host.js +383 -0
  54. package/dist/src/bridge/internal/bridge-host.js.map +1 -0
  55. package/dist/src/bridge/internal/bridge-host.test.d.ts +7 -0
  56. package/dist/src/bridge/internal/bridge-host.test.d.ts.map +1 -0
  57. package/dist/src/bridge/internal/bridge-host.test.js +377 -0
  58. package/dist/src/bridge/internal/bridge-host.test.js.map +1 -0
  59. package/dist/src/bridge/internal/environment-detection.d.ts +44 -0
  60. package/dist/src/bridge/internal/environment-detection.d.ts.map +1 -0
  61. package/dist/src/bridge/internal/environment-detection.js +91 -0
  62. package/dist/src/bridge/internal/environment-detection.js.map +1 -0
  63. package/dist/src/bridge/internal/environment-detection.test.d.ts +7 -0
  64. package/dist/src/bridge/internal/environment-detection.test.d.ts.map +1 -0
  65. package/dist/src/bridge/internal/environment-detection.test.js +150 -0
  66. package/dist/src/bridge/internal/environment-detection.test.js.map +1 -0
  67. package/dist/src/bridge/internal/hand-off.d.ts +69 -0
  68. package/dist/src/bridge/internal/hand-off.d.ts.map +1 -0
  69. package/dist/src/bridge/internal/hand-off.js +178 -0
  70. package/dist/src/bridge/internal/hand-off.js.map +1 -0
  71. package/dist/src/bridge/internal/hand-off.test.d.ts +7 -0
  72. package/dist/src/bridge/internal/hand-off.test.d.ts.map +1 -0
  73. package/dist/src/bridge/internal/hand-off.test.js +325 -0
  74. package/dist/src/bridge/internal/hand-off.test.js.map +1 -0
  75. package/dist/src/bridge/internal/health-endpoint.d.ts +32 -0
  76. package/dist/src/bridge/internal/health-endpoint.d.ts.map +1 -0
  77. package/dist/src/bridge/internal/health-endpoint.js +73 -0
  78. package/dist/src/bridge/internal/health-endpoint.js.map +1 -0
  79. package/dist/src/bridge/internal/health-endpoint.test.d.ts +6 -0
  80. package/dist/src/bridge/internal/health-endpoint.test.d.ts.map +1 -0
  81. package/dist/src/bridge/internal/health-endpoint.test.js +122 -0
  82. package/dist/src/bridge/internal/health-endpoint.test.js.map +1 -0
  83. package/dist/src/bridge/internal/host-protocol.d.ts +60 -0
  84. package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -0
  85. package/dist/src/bridge/internal/host-protocol.js +184 -0
  86. package/dist/src/bridge/internal/host-protocol.js.map +1 -0
  87. package/dist/src/bridge/internal/host-protocol.test.d.ts +6 -0
  88. package/dist/src/bridge/internal/host-protocol.test.d.ts.map +1 -0
  89. package/dist/src/bridge/internal/host-protocol.test.js +307 -0
  90. package/dist/src/bridge/internal/host-protocol.test.js.map +1 -0
  91. package/dist/src/bridge/internal/session-tracker.d.ts +67 -0
  92. package/dist/src/bridge/internal/session-tracker.d.ts.map +1 -0
  93. package/dist/src/bridge/internal/session-tracker.js +138 -0
  94. package/dist/src/bridge/internal/session-tracker.js.map +1 -0
  95. package/dist/src/bridge/internal/session-tracker.test.d.ts +6 -0
  96. package/dist/src/bridge/internal/session-tracker.test.d.ts.map +1 -0
  97. package/dist/src/bridge/internal/session-tracker.test.js +342 -0
  98. package/dist/src/bridge/internal/session-tracker.test.js.map +1 -0
  99. package/dist/src/bridge/internal/transport-client.d.ts +43 -0
  100. package/dist/src/bridge/internal/transport-client.d.ts.map +1 -0
  101. package/dist/src/bridge/internal/transport-client.js +146 -0
  102. package/dist/src/bridge/internal/transport-client.js.map +1 -0
  103. package/dist/src/bridge/internal/transport-client.test.d.ts +6 -0
  104. package/dist/src/bridge/internal/transport-client.test.d.ts.map +1 -0
  105. package/dist/src/bridge/internal/transport-client.test.js +176 -0
  106. package/dist/src/bridge/internal/transport-client.test.js.map +1 -0
  107. package/dist/src/bridge/internal/transport-server.d.ts +59 -0
  108. package/dist/src/bridge/internal/transport-server.d.ts.map +1 -0
  109. package/dist/src/bridge/internal/transport-server.js +189 -0
  110. package/dist/src/bridge/internal/transport-server.js.map +1 -0
  111. package/dist/src/bridge/internal/transport-server.test.d.ts +6 -0
  112. package/dist/src/bridge/internal/transport-server.test.d.ts.map +1 -0
  113. package/dist/src/bridge/internal/transport-server.test.js +171 -0
  114. package/dist/src/bridge/internal/transport-server.test.js.map +1 -0
  115. package/dist/src/bridge/types.d.ts +117 -0
  116. package/dist/src/bridge/types.d.ts.map +1 -0
  117. package/dist/src/bridge/types.js +68 -0
  118. package/dist/src/bridge/types.js.map +1 -0
  119. package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts +6 -0
  120. package/dist/src/cli/adapters/cli-command-adapter-handler.test.d.ts.map +1 -0
  121. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +260 -0
  122. package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -0
  123. package/dist/src/cli/adapters/cli-command-adapter.d.ts +39 -0
  124. package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -0
  125. package/dist/src/cli/adapters/cli-command-adapter.js +241 -0
  126. package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -0
  127. package/dist/src/cli/adapters/cli-command-adapter.test.d.ts +5 -0
  128. package/dist/src/cli/adapters/cli-command-adapter.test.d.ts.map +1 -0
  129. package/dist/src/cli/adapters/cli-command-adapter.test.js +188 -0
  130. package/dist/src/cli/adapters/cli-command-adapter.test.js.map +1 -0
  131. package/dist/src/cli/adapters/group-builder.d.ts +29 -0
  132. package/dist/src/cli/adapters/group-builder.d.ts.map +1 -0
  133. package/dist/src/cli/adapters/group-builder.js +54 -0
  134. package/dist/src/cli/adapters/group-builder.js.map +1 -0
  135. package/dist/src/cli/adapters/group-builder.test.d.ts +5 -0
  136. package/dist/src/cli/adapters/group-builder.test.d.ts.map +1 -0
  137. package/dist/src/cli/adapters/group-builder.test.js +108 -0
  138. package/dist/src/cli/adapters/group-builder.test.js.map +1 -0
  139. package/dist/src/cli/adapters/help-formatter.d.ts +11 -0
  140. package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -0
  141. package/dist/src/cli/adapters/help-formatter.js +78 -0
  142. package/dist/src/cli/adapters/help-formatter.js.map +1 -0
  143. package/dist/src/cli/adapters/help-formatter.test.d.ts +5 -0
  144. package/dist/src/cli/adapters/help-formatter.test.d.ts.map +1 -0
  145. package/dist/src/cli/adapters/help-formatter.test.js +79 -0
  146. package/dist/src/cli/adapters/help-formatter.test.js.map +1 -0
  147. package/dist/src/cli/adapters/target-resolver.d.ts +54 -0
  148. package/dist/src/cli/adapters/target-resolver.d.ts.map +1 -0
  149. package/dist/src/cli/adapters/target-resolver.js +90 -0
  150. package/dist/src/cli/adapters/target-resolver.js.map +1 -0
  151. package/dist/src/cli/adapters/target-resolver.test.d.ts +5 -0
  152. package/dist/src/cli/adapters/target-resolver.test.d.ts.map +1 -0
  153. package/dist/src/cli/adapters/target-resolver.test.js +169 -0
  154. package/dist/src/cli/adapters/target-resolver.test.js.map +1 -0
  155. package/dist/src/cli/args/global-args.d.ts +2 -0
  156. package/dist/src/cli/args/global-args.d.ts.map +1 -1
  157. package/dist/src/cli/cli.d.ts +6 -3
  158. package/dist/src/cli/cli.d.ts.map +1 -1
  159. package/dist/src/cli/cli.js +82 -20
  160. package/dist/src/cli/cli.js.map +1 -1
  161. package/dist/src/cli/resolve-script-content.d.ts +19 -0
  162. package/dist/src/cli/resolve-script-content.d.ts.map +1 -0
  163. package/dist/src/cli/resolve-script-content.js +22 -0
  164. package/dist/src/cli/resolve-script-content.js.map +1 -0
  165. package/dist/src/cli/resolve-session.d.ts +21 -0
  166. package/dist/src/cli/resolve-session.d.ts.map +1 -0
  167. package/dist/src/cli/resolve-session.js +40 -0
  168. package/dist/src/cli/resolve-session.js.map +1 -0
  169. package/dist/src/cli/resolve-session.test.d.ts +5 -0
  170. package/dist/src/cli/resolve-session.test.d.ts.map +1 -0
  171. package/dist/src/cli/resolve-session.test.js +112 -0
  172. package/dist/src/cli/resolve-session.test.js.map +1 -0
  173. package/dist/src/cli/script-executor.d.ts +1 -0
  174. package/dist/src/cli/script-executor.d.ts.map +1 -1
  175. package/dist/src/cli/script-executor.js +7 -1
  176. package/dist/src/cli/script-executor.js.map +1 -1
  177. package/dist/src/cli/types.d.ts +11 -0
  178. package/dist/src/cli/types.d.ts.map +1 -0
  179. package/dist/src/cli/types.js +5 -0
  180. package/dist/src/cli/types.js.map +1 -0
  181. package/dist/src/commands/connect.d.ts +16 -0
  182. package/dist/src/commands/connect.d.ts.map +1 -0
  183. package/dist/src/commands/connect.js +15 -0
  184. package/dist/src/commands/connect.js.map +1 -0
  185. package/dist/src/commands/connect.test.d.ts +5 -0
  186. package/dist/src/commands/connect.test.d.ts.map +1 -0
  187. package/dist/src/commands/connect.test.js +46 -0
  188. package/dist/src/commands/connect.test.js.map +1 -0
  189. package/dist/src/commands/console/exec/exec.d.ts +43 -0
  190. package/dist/src/commands/console/exec/exec.d.ts.map +1 -0
  191. package/dist/src/commands/console/exec/exec.js +79 -0
  192. package/dist/src/commands/console/exec/exec.js.map +1 -0
  193. package/dist/src/commands/console/exec/exec.test.d.ts +5 -0
  194. package/dist/src/commands/console/exec/exec.test.d.ts.map +1 -0
  195. package/dist/src/commands/console/exec/exec.test.js +191 -0
  196. package/dist/src/commands/console/exec/exec.test.js.map +1 -0
  197. package/dist/src/commands/console/logs/logs.d.ts +23 -0
  198. package/dist/src/commands/console/logs/logs.d.ts.map +1 -0
  199. package/dist/src/commands/console/logs/logs.js +80 -0
  200. package/dist/src/commands/console/logs/logs.js.map +1 -0
  201. package/dist/src/commands/console/logs/logs.test.d.ts +5 -0
  202. package/dist/src/commands/console/logs/logs.test.d.ts.map +1 -0
  203. package/dist/src/commands/console/logs/logs.test.js +111 -0
  204. package/dist/src/commands/console/logs/logs.test.js.map +1 -0
  205. package/dist/src/commands/disconnect.d.ts +9 -0
  206. package/dist/src/commands/disconnect.d.ts.map +1 -0
  207. package/dist/src/commands/disconnect.js +8 -0
  208. package/dist/src/commands/disconnect.js.map +1 -0
  209. package/dist/src/commands/disconnect.test.d.ts +5 -0
  210. package/dist/src/commands/disconnect.test.d.ts.map +1 -0
  211. package/dist/src/commands/disconnect.test.js +17 -0
  212. package/dist/src/commands/disconnect.test.js.map +1 -0
  213. package/dist/src/commands/explorer/query/query.d.ts +31 -0
  214. package/dist/src/commands/explorer/query/query.d.ts.map +1 -0
  215. package/dist/src/commands/explorer/query/query.js +106 -0
  216. package/dist/src/commands/explorer/query/query.js.map +1 -0
  217. package/dist/src/commands/explorer/query/query.test.d.ts +5 -0
  218. package/dist/src/commands/explorer/query/query.test.d.ts.map +1 -0
  219. package/dist/src/commands/explorer/query/query.test.js +228 -0
  220. package/dist/src/commands/explorer/query/query.test.js.map +1 -0
  221. package/dist/src/commands/formatters.test.d.ts +6 -0
  222. package/dist/src/commands/formatters.test.d.ts.map +1 -0
  223. package/dist/src/commands/formatters.test.js +211 -0
  224. package/dist/src/commands/formatters.test.js.map +1 -0
  225. package/dist/src/commands/framework/action-loader.d.ts +25 -0
  226. package/dist/src/commands/framework/action-loader.d.ts.map +1 -0
  227. package/dist/src/commands/framework/action-loader.js +46 -0
  228. package/dist/src/commands/framework/action-loader.js.map +1 -0
  229. package/dist/src/commands/framework/action-loader.test.d.ts +5 -0
  230. package/dist/src/commands/framework/action-loader.test.d.ts.map +1 -0
  231. package/dist/src/commands/framework/action-loader.test.js +89 -0
  232. package/dist/src/commands/framework/action-loader.test.js.map +1 -0
  233. package/dist/src/commands/framework/arg-builder.d.ts +92 -0
  234. package/dist/src/commands/framework/arg-builder.d.ts.map +1 -0
  235. package/dist/src/commands/framework/arg-builder.js +137 -0
  236. package/dist/src/commands/framework/arg-builder.js.map +1 -0
  237. package/dist/src/commands/framework/arg-builder.test.d.ts +5 -0
  238. package/dist/src/commands/framework/arg-builder.test.d.ts.map +1 -0
  239. package/dist/src/commands/framework/arg-builder.test.js +246 -0
  240. package/dist/src/commands/framework/arg-builder.test.js.map +1 -0
  241. package/dist/src/commands/framework/command-registry.d.ts +23 -0
  242. package/dist/src/commands/framework/command-registry.d.ts.map +1 -0
  243. package/dist/src/commands/framework/command-registry.js +42 -0
  244. package/dist/src/commands/framework/command-registry.js.map +1 -0
  245. package/dist/src/commands/framework/command-registry.test.d.ts +5 -0
  246. package/dist/src/commands/framework/command-registry.test.d.ts.map +1 -0
  247. package/dist/src/commands/framework/command-registry.test.js +158 -0
  248. package/dist/src/commands/framework/command-registry.test.js.map +1 -0
  249. package/dist/src/commands/framework/define-command.d.ts +76 -0
  250. package/dist/src/commands/framework/define-command.d.ts.map +1 -0
  251. package/dist/src/commands/framework/define-command.js +28 -0
  252. package/dist/src/commands/framework/define-command.js.map +1 -0
  253. package/dist/src/commands/framework/define-command.test.d.ts +5 -0
  254. package/dist/src/commands/framework/define-command.test.d.ts.map +1 -0
  255. package/dist/src/commands/framework/define-command.test.js +135 -0
  256. package/dist/src/commands/framework/define-command.test.js.map +1 -0
  257. package/dist/src/commands/framework/index.d.ts +8 -0
  258. package/dist/src/commands/framework/index.d.ts.map +1 -0
  259. package/dist/src/commands/framework/index.js +8 -0
  260. package/dist/src/commands/framework/index.js.map +1 -0
  261. package/dist/src/commands/index.d.ts +20 -0
  262. package/dist/src/commands/index.d.ts.map +1 -0
  263. package/dist/src/commands/index.js +20 -0
  264. package/dist/src/commands/index.js.map +1 -0
  265. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts +15 -0
  266. package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -0
  267. package/dist/src/commands/linux/inject-credentials/inject-credentials.js +88 -0
  268. package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -0
  269. package/dist/src/commands/linux/setup/setup.d.ts +19 -0
  270. package/dist/src/commands/linux/setup/setup.d.ts.map +1 -0
  271. package/dist/src/commands/linux/setup/setup.js +107 -0
  272. package/dist/src/commands/linux/setup/setup.js.map +1 -0
  273. package/dist/src/commands/linux/status/status.d.ts +34 -0
  274. package/dist/src/commands/linux/status/status.d.ts.map +1 -0
  275. package/dist/src/commands/linux/status/status.js +134 -0
  276. package/dist/src/commands/linux/status/status.js.map +1 -0
  277. package/dist/src/commands/plugin/install/install.d.ts +10 -0
  278. package/dist/src/commands/plugin/install/install.d.ts.map +1 -0
  279. package/dist/src/commands/plugin/install/install.js +23 -0
  280. package/dist/src/commands/plugin/install/install.js.map +1 -0
  281. package/dist/src/commands/plugin/uninstall/uninstall.d.ts +9 -0
  282. package/dist/src/commands/plugin/uninstall/uninstall.d.ts.map +1 -0
  283. package/dist/src/commands/plugin/uninstall/uninstall.js +41 -0
  284. package/dist/src/commands/plugin/uninstall/uninstall.js.map +1 -0
  285. package/dist/src/commands/process/close/close.d.ts +22 -0
  286. package/dist/src/commands/process/close/close.d.ts.map +1 -0
  287. package/dist/src/commands/process/close/close.js +34 -0
  288. package/dist/src/commands/process/close/close.js.map +1 -0
  289. package/dist/src/commands/process/format-state.d.ts +7 -0
  290. package/dist/src/commands/process/format-state.d.ts.map +1 -0
  291. package/dist/src/commands/process/format-state.js +19 -0
  292. package/dist/src/commands/process/format-state.js.map +1 -0
  293. package/dist/src/commands/process/info/info.d.ts +17 -0
  294. package/dist/src/commands/process/info/info.d.ts.map +1 -0
  295. package/dist/src/commands/process/info/info.js +38 -0
  296. package/dist/src/commands/process/info/info.js.map +1 -0
  297. package/dist/src/commands/process/info/info.test.d.ts +5 -0
  298. package/dist/src/commands/process/info/info.test.d.ts.map +1 -0
  299. package/dist/src/commands/process/info/info.test.js +58 -0
  300. package/dist/src/commands/process/info/info.test.js.map +1 -0
  301. package/dist/src/commands/process/launch/launch.d.ts +17 -0
  302. package/dist/src/commands/process/launch/launch.d.ts.map +1 -0
  303. package/dist/src/commands/process/launch/launch.js +26 -0
  304. package/dist/src/commands/process/launch/launch.js.map +1 -0
  305. package/dist/src/commands/process/launch/launch.test.d.ts +5 -0
  306. package/dist/src/commands/process/launch/launch.test.d.ts.map +1 -0
  307. package/dist/src/commands/process/launch/launch.test.js +49 -0
  308. package/dist/src/commands/process/launch/launch.test.js.map +1 -0
  309. package/dist/src/commands/process/list/list.d.ts +16 -0
  310. package/dist/src/commands/process/list/list.d.ts.map +1 -0
  311. package/dist/src/commands/process/list/list.js +56 -0
  312. package/dist/src/commands/process/list/list.js.map +1 -0
  313. package/dist/src/commands/process/list/list.test.d.ts +5 -0
  314. package/dist/src/commands/process/list/list.test.d.ts.map +1 -0
  315. package/dist/src/commands/process/list/list.test.js +71 -0
  316. package/dist/src/commands/process/list/list.test.js.map +1 -0
  317. package/dist/src/commands/process/run/run.d.ts +31 -0
  318. package/dist/src/commands/process/run/run.d.ts.map +1 -0
  319. package/dist/src/commands/process/run/run.js +63 -0
  320. package/dist/src/commands/process/run/run.js.map +1 -0
  321. package/dist/src/commands/rgba-to-png.d.ts +17 -0
  322. package/dist/src/commands/rgba-to-png.d.ts.map +1 -0
  323. package/dist/src/commands/rgba-to-png.js +85 -0
  324. package/dist/src/commands/rgba-to-png.js.map +1 -0
  325. package/dist/src/commands/serve/serve.d.ts +17 -0
  326. package/dist/src/commands/serve/serve.d.ts.map +1 -0
  327. package/dist/src/commands/serve/serve.js +128 -0
  328. package/dist/src/commands/serve/serve.js.map +1 -0
  329. package/dist/src/commands/serve/serve.test.d.ts +5 -0
  330. package/dist/src/commands/serve/serve.test.d.ts.map +1 -0
  331. package/dist/src/commands/serve/serve.test.js +100 -0
  332. package/dist/src/commands/serve/serve.test.js.map +1 -0
  333. package/dist/src/commands/viewport/screenshot/screenshot.d.ts +17 -0
  334. package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -0
  335. package/dist/src/commands/viewport/screenshot/screenshot.js +45 -0
  336. package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -0
  337. package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts +5 -0
  338. package/dist/src/commands/viewport/screenshot/screenshot.test.d.ts.map +1 -0
  339. package/dist/src/commands/viewport/screenshot/screenshot.test.js +143 -0
  340. package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -0
  341. package/dist/src/docker/docker-delegator.d.ts +30 -0
  342. package/dist/src/docker/docker-delegator.d.ts.map +1 -0
  343. package/dist/src/docker/docker-delegator.js +201 -0
  344. package/dist/src/docker/docker-delegator.js.map +1 -0
  345. package/dist/src/docker/docker-delegator.test.d.ts +2 -0
  346. package/dist/src/docker/docker-delegator.test.d.ts.map +1 -0
  347. package/dist/src/docker/docker-delegator.test.js +132 -0
  348. package/dist/src/docker/docker-delegator.test.js.map +1 -0
  349. package/dist/src/index.d.ts +9 -2
  350. package/dist/src/index.d.ts.map +1 -1
  351. package/dist/src/index.js +6 -1
  352. package/dist/src/index.js.map +1 -1
  353. package/dist/src/index.test.d.ts +2 -0
  354. package/dist/src/index.test.d.ts.map +1 -0
  355. package/dist/src/index.test.js +51 -0
  356. package/dist/src/index.test.js.map +1 -0
  357. package/dist/src/linux/index.d.ts +12 -0
  358. package/dist/src/linux/index.d.ts.map +1 -0
  359. package/dist/src/linux/index.js +11 -0
  360. package/dist/src/linux/index.js.map +1 -0
  361. package/dist/src/linux/linux-config.d.ts +37 -0
  362. package/dist/src/linux/linux-config.d.ts.map +1 -0
  363. package/dist/src/linux/linux-config.js +70 -0
  364. package/dist/src/linux/linux-config.js.map +1 -0
  365. package/dist/src/linux/linux-config.test.d.ts +2 -0
  366. package/dist/src/linux/linux-config.test.d.ts.map +1 -0
  367. package/dist/src/linux/linux-config.test.js +54 -0
  368. package/dist/src/linux/linux-config.test.js.map +1 -0
  369. package/dist/src/linux/linux-credential-writer.d.ts +35 -0
  370. package/dist/src/linux/linux-credential-writer.d.ts.map +1 -0
  371. package/dist/src/linux/linux-credential-writer.js +300 -0
  372. package/dist/src/linux/linux-credential-writer.js.map +1 -0
  373. package/dist/src/linux/linux-display-manager.d.ts +24 -0
  374. package/dist/src/linux/linux-display-manager.d.ts.map +1 -0
  375. package/dist/src/linux/linux-display-manager.js +92 -0
  376. package/dist/src/linux/linux-display-manager.js.map +1 -0
  377. package/dist/src/linux/linux-env-guard.d.ts +13 -0
  378. package/dist/src/linux/linux-env-guard.d.ts.map +1 -0
  379. package/dist/src/linux/linux-env-guard.js +31 -0
  380. package/dist/src/linux/linux-env-guard.js.map +1 -0
  381. package/dist/src/linux/linux-env-guard.test.d.ts +2 -0
  382. package/dist/src/linux/linux-env-guard.test.d.ts.map +1 -0
  383. package/dist/src/linux/linux-env-guard.test.js +48 -0
  384. package/dist/src/linux/linux-env-guard.test.js.map +1 -0
  385. package/dist/src/linux/linux-fflags.d.ts +17 -0
  386. package/dist/src/linux/linux-fflags.d.ts.map +1 -0
  387. package/dist/src/linux/linux-fflags.js +33 -0
  388. package/dist/src/linux/linux-fflags.js.map +1 -0
  389. package/dist/src/linux/linux-fflags.test.d.ts +2 -0
  390. package/dist/src/linux/linux-fflags.test.d.ts.map +1 -0
  391. package/dist/src/linux/linux-fflags.test.js +55 -0
  392. package/dist/src/linux/linux-fflags.test.js.map +1 -0
  393. package/dist/src/linux/linux-prerequisites.d.ts +24 -0
  394. package/dist/src/linux/linux-prerequisites.d.ts.map +1 -0
  395. package/dist/src/linux/linux-prerequisites.js +118 -0
  396. package/dist/src/linux/linux-prerequisites.js.map +1 -0
  397. package/dist/src/linux/linux-shader-patcher.d.ts +17 -0
  398. package/dist/src/linux/linux-shader-patcher.d.ts.map +1 -0
  399. package/dist/src/linux/linux-shader-patcher.js +48 -0
  400. package/dist/src/linux/linux-shader-patcher.js.map +1 -0
  401. package/dist/src/linux/linux-shader-patcher.test.d.ts +2 -0
  402. package/dist/src/linux/linux-shader-patcher.test.d.ts.map +1 -0
  403. package/dist/src/linux/linux-shader-patcher.test.js +55 -0
  404. package/dist/src/linux/linux-shader-patcher.test.js.map +1 -0
  405. package/dist/src/linux/linux-studio-installer.d.ts +10 -0
  406. package/dist/src/linux/linux-studio-installer.d.ts.map +1 -0
  407. package/dist/src/linux/linux-studio-installer.js +79 -0
  408. package/dist/src/linux/linux-studio-installer.js.map +1 -0
  409. package/dist/src/linux/linux-studio-launcher.d.ts +10 -0
  410. package/dist/src/linux/linux-studio-launcher.d.ts.map +1 -0
  411. package/dist/src/linux/linux-studio-launcher.js +73 -0
  412. package/dist/src/linux/linux-studio-launcher.js.map +1 -0
  413. package/dist/src/linux/linux-version-resolver.d.ts +18 -0
  414. package/dist/src/linux/linux-version-resolver.d.ts.map +1 -0
  415. package/dist/src/linux/linux-version-resolver.js +49 -0
  416. package/dist/src/linux/linux-version-resolver.js.map +1 -0
  417. package/dist/src/linux/linux-wine-env.d.ts +11 -0
  418. package/dist/src/linux/linux-wine-env.d.ts.map +1 -0
  419. package/dist/src/linux/linux-wine-env.js +33 -0
  420. package/dist/src/linux/linux-wine-env.js.map +1 -0
  421. package/dist/src/linux/linux-wine-env.test.d.ts +2 -0
  422. package/dist/src/linux/linux-wine-env.test.d.ts.map +1 -0
  423. package/dist/src/linux/linux-wine-env.test.js +47 -0
  424. package/dist/src/linux/linux-wine-env.test.js.map +1 -0
  425. package/dist/src/plugin/persistent-plugin-installer.d.ts +21 -0
  426. package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -0
  427. package/dist/src/plugin/persistent-plugin-installer.js +69 -0
  428. package/dist/src/plugin/persistent-plugin-installer.js.map +1 -0
  429. package/dist/src/plugin/persistent-plugin-installer.test.d.ts +5 -0
  430. package/dist/src/plugin/persistent-plugin-installer.test.d.ts.map +1 -0
  431. package/dist/src/plugin/persistent-plugin-installer.test.js +109 -0
  432. package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -0
  433. package/dist/src/plugin/plugin-discovery.d.ts +7 -0
  434. package/dist/src/plugin/plugin-discovery.d.ts.map +1 -0
  435. package/dist/src/plugin/plugin-discovery.js +18 -0
  436. package/dist/src/plugin/plugin-discovery.js.map +1 -0
  437. package/dist/src/plugin/plugin-discovery.test.d.ts +5 -0
  438. package/dist/src/plugin/plugin-discovery.test.d.ts.map +1 -0
  439. package/dist/src/plugin/plugin-discovery.test.js +55 -0
  440. package/dist/src/plugin/plugin-discovery.test.js.map +1 -0
  441. package/dist/src/plugin/plugin-injector.js +1 -1
  442. package/dist/src/plugin/plugin-injector.js.map +1 -1
  443. package/dist/src/process/studio-process-manager.d.ts +7 -3
  444. package/dist/src/process/studio-process-manager.d.ts.map +1 -1
  445. package/dist/src/process/studio-process-manager.js +38 -11
  446. package/dist/src/process/studio-process-manager.js.map +1 -1
  447. package/dist/src/process/studio-process-manager.test.js +18 -1
  448. package/dist/src/process/studio-process-manager.test.js.map +1 -1
  449. package/dist/src/server/action-dispatcher.d.ts +35 -0
  450. package/dist/src/server/action-dispatcher.d.ts.map +1 -0
  451. package/dist/src/server/action-dispatcher.js +67 -0
  452. package/dist/src/server/action-dispatcher.js.map +1 -0
  453. package/dist/src/server/action-dispatcher.test.d.ts +6 -0
  454. package/dist/src/server/action-dispatcher.test.d.ts.map +1 -0
  455. package/dist/src/server/action-dispatcher.test.js +173 -0
  456. package/dist/src/server/action-dispatcher.test.js.map +1 -0
  457. package/dist/src/server/index.d.ts +1 -1
  458. package/dist/src/server/index.d.ts.map +1 -1
  459. package/dist/src/server/pending-request-map.d.ts +33 -0
  460. package/dist/src/server/pending-request-map.d.ts.map +1 -0
  461. package/dist/src/server/pending-request-map.js +69 -0
  462. package/dist/src/server/pending-request-map.js.map +1 -0
  463. package/dist/src/server/pending-request-map.test.d.ts +2 -0
  464. package/dist/src/server/pending-request-map.test.d.ts.map +1 -0
  465. package/dist/src/server/pending-request-map.test.js +192 -0
  466. package/dist/src/server/pending-request-map.test.js.map +1 -0
  467. package/dist/src/server/plugin-detection.test.d.ts +7 -0
  468. package/dist/src/server/plugin-detection.test.d.ts.map +1 -0
  469. package/dist/src/server/plugin-detection.test.js +154 -0
  470. package/dist/src/server/plugin-detection.test.js.map +1 -0
  471. package/dist/src/server/studio-bridge-server.d.ts +44 -7
  472. package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
  473. package/dist/src/server/studio-bridge-server.js +341 -91
  474. package/dist/src/server/studio-bridge-server.js.map +1 -1
  475. package/dist/src/server/studio-bridge-server.test.js +231 -207
  476. package/dist/src/server/studio-bridge-server.test.js.map +1 -1
  477. package/dist/src/server/web-socket-protocol-basic.test.d.ts +2 -0
  478. package/dist/src/server/web-socket-protocol-basic.test.d.ts.map +1 -0
  479. package/dist/src/server/web-socket-protocol-basic.test.js +98 -0
  480. package/dist/src/server/web-socket-protocol-basic.test.js.map +1 -0
  481. package/dist/src/server/web-socket-protocol.d.ts +218 -20
  482. package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
  483. package/dist/src/server/web-socket-protocol.js +346 -20
  484. package/dist/src/server/web-socket-protocol.js.map +1 -1
  485. package/dist/src/server/web-socket-protocol.test.js +572 -146
  486. package/dist/src/server/web-socket-protocol.test.js.map +1 -1
  487. package/dist/src/test/e2e/hand-off.test.d.ts +9 -0
  488. package/dist/src/test/e2e/hand-off.test.d.ts.map +1 -0
  489. package/dist/src/test/e2e/hand-off.test.js +274 -0
  490. package/dist/src/test/e2e/hand-off.test.js.map +1 -0
  491. package/dist/src/test/e2e/persistent-session.test.d.ts +11 -0
  492. package/dist/src/test/e2e/persistent-session.test.d.ts.map +1 -0
  493. package/dist/src/test/e2e/persistent-session.test.js +367 -0
  494. package/dist/src/test/e2e/persistent-session.test.js.map +1 -0
  495. package/dist/src/test/e2e/split-server.test.d.ts +14 -0
  496. package/dist/src/test/e2e/split-server.test.d.ts.map +1 -0
  497. package/dist/src/test/e2e/split-server.test.js +230 -0
  498. package/dist/src/test/e2e/split-server.test.js.map +1 -0
  499. package/dist/src/test/helpers/mock-plugin-client.d.ts +69 -0
  500. package/dist/src/test/helpers/mock-plugin-client.d.ts.map +1 -0
  501. package/dist/src/test/helpers/mock-plugin-client.js +213 -0
  502. package/dist/src/test/helpers/mock-plugin-client.js.map +1 -0
  503. package/dist/tsconfig.tsbuildinfo +1 -1
  504. package/docker/.dockerignore +2 -0
  505. package/docker/Dockerfile +113 -0
  506. package/docker/docker-compose.yml +20 -0
  507. package/docker/entrypoint.sh +19 -0
  508. package/package.json +8 -6
  509. package/src/bridge/bridge-connection-remote.test.ts +189 -0
  510. package/src/bridge/bridge-connection.test.ts +1076 -0
  511. package/src/bridge/bridge-connection.ts +718 -0
  512. package/src/bridge/bridge-session.test.ts +336 -0
  513. package/src/bridge/bridge-session.ts +365 -0
  514. package/src/bridge/index.ts +42 -0
  515. package/src/bridge/internal/__tests__/failover-crash.test.ts +191 -0
  516. package/src/bridge/internal/__tests__/failover-graceful.test.ts +268 -0
  517. package/src/bridge/internal/__tests__/failover-inflight.test.ts +329 -0
  518. package/src/bridge/internal/__tests__/host-client-integration.test.ts +387 -0
  519. package/src/bridge/internal/bridge-client.test.ts +399 -0
  520. package/src/bridge/internal/bridge-client.ts +434 -0
  521. package/src/bridge/internal/bridge-host.test.ts +501 -0
  522. package/src/bridge/internal/bridge-host.ts +531 -0
  523. package/src/bridge/internal/environment-detection.test.ts +180 -0
  524. package/src/bridge/internal/environment-detection.ts +119 -0
  525. package/src/bridge/internal/hand-off.test.ts +408 -0
  526. package/src/bridge/internal/hand-off.ts +275 -0
  527. package/src/bridge/internal/health-endpoint.test.ts +147 -0
  528. package/src/bridge/internal/health-endpoint.ts +100 -0
  529. package/src/bridge/internal/host-protocol.test.ts +415 -0
  530. package/src/bridge/internal/host-protocol.ts +255 -0
  531. package/src/bridge/internal/session-tracker.test.ts +535 -0
  532. package/src/bridge/internal/session-tracker.ts +198 -0
  533. package/src/bridge/internal/transport-client.test.ts +241 -0
  534. package/src/bridge/internal/transport-client.ts +194 -0
  535. package/src/bridge/internal/transport-server.test.ts +220 -0
  536. package/src/bridge/internal/transport-server.ts +242 -0
  537. package/src/bridge/types.ts +161 -0
  538. package/src/cli/adapters/cli-command-adapter-handler.test.ts +318 -0
  539. package/src/cli/adapters/cli-command-adapter.test.ts +221 -0
  540. package/src/cli/adapters/cli-command-adapter.ts +342 -0
  541. package/src/cli/adapters/group-builder.test.ts +146 -0
  542. package/src/cli/adapters/group-builder.ts +81 -0
  543. package/src/cli/adapters/help-formatter.test.ts +97 -0
  544. package/src/cli/adapters/help-formatter.ts +86 -0
  545. package/src/cli/adapters/target-resolver.test.ts +222 -0
  546. package/src/cli/adapters/target-resolver.ts +144 -0
  547. package/src/cli/args/global-args.ts +2 -0
  548. package/src/cli/cli.ts +100 -21
  549. package/src/cli/resolve-script-content.ts +36 -0
  550. package/src/cli/resolve-session.test.ts +141 -0
  551. package/src/cli/resolve-session.ts +66 -0
  552. package/src/cli/script-executor.ts +22 -4
  553. package/src/cli/types.ts +11 -0
  554. package/src/commands/connect.test.ts +61 -0
  555. package/src/commands/connect.ts +32 -0
  556. package/src/commands/console/exec/exec.test.ts +258 -0
  557. package/src/commands/console/exec/exec.ts +130 -0
  558. package/src/commands/console/exec/execute.luau +202 -0
  559. package/src/commands/console/logs/logs.test.ts +138 -0
  560. package/src/commands/console/logs/logs.ts +115 -0
  561. package/src/commands/console/logs/query-logs.luau +76 -0
  562. package/src/commands/disconnect.test.ts +21 -0
  563. package/src/commands/disconnect.ts +12 -0
  564. package/src/commands/explorer/query/query-data-model.luau +206 -0
  565. package/src/commands/explorer/query/query.test.ts +297 -0
  566. package/src/commands/explorer/query/query.ts +157 -0
  567. package/src/commands/formatters.test.ts +237 -0
  568. package/src/commands/framework/action-loader.test.ts +118 -0
  569. package/src/commands/framework/action-loader.ts +65 -0
  570. package/src/commands/framework/arg-builder.test.ts +298 -0
  571. package/src/commands/framework/arg-builder.ts +203 -0
  572. package/src/commands/framework/command-registry.test.ts +204 -0
  573. package/src/commands/framework/command-registry.ts +51 -0
  574. package/src/commands/framework/define-command.test.ts +161 -0
  575. package/src/commands/framework/define-command.ts +114 -0
  576. package/src/commands/framework/index.ts +33 -0
  577. package/src/commands/index.ts +72 -0
  578. package/src/commands/linux/inject-credentials/inject-credentials.ts +118 -0
  579. package/src/commands/linux/setup/setup.ts +145 -0
  580. package/src/commands/linux/status/status.ts +180 -0
  581. package/src/commands/plugin/install/install.ts +31 -0
  582. package/src/commands/plugin/uninstall/uninstall.ts +54 -0
  583. package/src/commands/process/close/close.ts +52 -0
  584. package/src/commands/process/format-state.ts +21 -0
  585. package/src/commands/process/info/info.test.ts +76 -0
  586. package/src/commands/process/info/info.ts +54 -0
  587. package/src/commands/process/info/query-state.luau +48 -0
  588. package/src/commands/process/launch/launch.test.ts +65 -0
  589. package/src/commands/process/launch/launch.ts +45 -0
  590. package/src/commands/process/list/list.test.ts +82 -0
  591. package/src/commands/process/list/list.ts +75 -0
  592. package/src/commands/process/run/run.ts +98 -0
  593. package/src/commands/rgba-to-png.ts +98 -0
  594. package/src/commands/serve/serve.test.ts +139 -0
  595. package/src/commands/serve/serve.ts +161 -0
  596. package/src/commands/viewport/screenshot/capture-screenshot.luau +247 -0
  597. package/src/commands/viewport/screenshot/screenshot.test.ts +181 -0
  598. package/src/commands/viewport/screenshot/screenshot.ts +71 -0
  599. package/src/docker/docker-delegator.test.ts +159 -0
  600. package/src/docker/docker-delegator.ts +240 -0
  601. package/src/index.test.ts +58 -0
  602. package/src/index.ts +104 -3
  603. package/src/linux/README.md +130 -0
  604. package/src/linux/index.ts +25 -0
  605. package/src/linux/linux-config.test.ts +66 -0
  606. package/src/linux/linux-config.ts +102 -0
  607. package/src/linux/linux-credential-writer.ts +421 -0
  608. package/src/linux/linux-display-manager.ts +106 -0
  609. package/src/linux/linux-env-guard.test.ts +62 -0
  610. package/src/linux/linux-env-guard.ts +38 -0
  611. package/src/linux/linux-fflags.test.ts +78 -0
  612. package/src/linux/linux-fflags.ts +48 -0
  613. package/src/linux/linux-prerequisites.ts +152 -0
  614. package/src/linux/linux-shader-patcher.test.ts +76 -0
  615. package/src/linux/linux-shader-patcher.ts +56 -0
  616. package/src/linux/linux-studio-installer.ts +113 -0
  617. package/src/linux/linux-studio-launcher.ts +90 -0
  618. package/src/linux/linux-version-resolver.ts +74 -0
  619. package/src/linux/linux-wine-env.test.ts +56 -0
  620. package/src/linux/linux-wine-env.ts +38 -0
  621. package/src/linux/write-cred.c +48 -0
  622. package/src/plugin/persistent-plugin-installer.test.ts +168 -0
  623. package/src/plugin/persistent-plugin-installer.ts +90 -0
  624. package/src/plugin/plugin-discovery.test.ts +70 -0
  625. package/src/plugin/plugin-discovery.ts +21 -0
  626. package/src/plugin/plugin-injector.ts +1 -1
  627. package/src/process/studio-process-manager.test.ts +22 -1
  628. package/src/process/studio-process-manager.ts +57 -18
  629. package/src/server/action-dispatcher.test.ts +240 -0
  630. package/src/server/action-dispatcher.ts +89 -0
  631. package/src/server/index.ts +0 -3
  632. package/src/server/pending-request-map.test.ts +261 -0
  633. package/src/server/pending-request-map.ts +87 -0
  634. package/src/server/plugin-detection.test.ts +195 -0
  635. package/src/server/studio-bridge-server.test.ts +321 -283
  636. package/src/server/studio-bridge-server.ts +469 -111
  637. package/src/server/web-socket-protocol-basic.test.ts +131 -0
  638. package/src/server/web-socket-protocol.test.ts +658 -159
  639. package/src/server/web-socket-protocol.ts +668 -58
  640. package/src/test/e2e/hand-off.test.ts +338 -0
  641. package/src/test/e2e/persistent-session.test.ts +442 -0
  642. package/src/test/e2e/split-server.test.ts +290 -0
  643. package/src/test/helpers/mock-plugin-client.ts +276 -0
  644. package/templates/studio-bridge-plugin/src/Shared/ActionRouter.luau +245 -0
  645. package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.luau +203 -0
  646. package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.luau +144 -0
  647. package/templates/studio-bridge-plugin/src/Shared/Protocol.luau +132 -0
  648. package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +364 -133
  649. package/templates/studio-bridge-plugin/src/Vendor/png.luau +1247 -0
  650. package/templates/studio-bridge-plugin-test/test/actions.test.luau +580 -0
  651. package/templates/studio-bridge-plugin-test/test/discovery.test.luau +622 -0
  652. package/templates/studio-bridge-plugin-test/test/execute-handler.test.luau +406 -0
  653. package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.luau +814 -0
  654. package/templates/studio-bridge-plugin-test/test/integration.test.luau +1020 -0
  655. package/templates/studio-bridge-plugin-test/test/new-actions.test.luau +339 -0
  656. package/templates/studio-bridge-plugin-test/test/plugin-entry.test.luau +493 -0
  657. package/templates/studio-bridge-plugin-test/test/protocol.test.luau +506 -0
  658. package/templates/studio-bridge-plugin-test/test/roblox-mocks.luau +108 -0
  659. package/templates/studio-bridge-plugin-test/test/test-runner.luau +112 -0
  660. package/dist/src/cli/commands/exec-command.d.ts +0 -15
  661. package/dist/src/cli/commands/exec-command.d.ts.map +0 -1
  662. package/dist/src/cli/commands/exec-command.js +0 -35
  663. package/dist/src/cli/commands/exec-command.js.map +0 -1
  664. package/dist/src/cli/commands/run-command.d.ts +0 -15
  665. package/dist/src/cli/commands/run-command.d.ts.map +0 -1
  666. package/dist/src/cli/commands/run-command.js +0 -47
  667. package/dist/src/cli/commands/run-command.js.map +0 -1
  668. package/dist/src/cli/commands/terminal/terminal-command.d.ts +0 -17
  669. package/dist/src/cli/commands/terminal/terminal-command.d.ts.map +0 -1
  670. package/dist/src/cli/commands/terminal/terminal-command.js +0 -41
  671. package/dist/src/cli/commands/terminal/terminal-command.js.map +0 -1
  672. package/dist/src/cli/commands/terminal/terminal-editor.d.ts +0 -43
  673. package/dist/src/cli/commands/terminal/terminal-editor.d.ts.map +0 -1
  674. package/dist/src/cli/commands/terminal/terminal-editor.js +0 -430
  675. package/dist/src/cli/commands/terminal/terminal-editor.js.map +0 -1
  676. package/dist/src/cli/commands/terminal/terminal-mode.d.ts +0 -13
  677. package/dist/src/cli/commands/terminal/terminal-mode.d.ts.map +0 -1
  678. package/dist/src/cli/commands/terminal/terminal-mode.js +0 -141
  679. package/dist/src/cli/commands/terminal/terminal-mode.js.map +0 -1
  680. package/dist/src/server/web-socket-protocol.smoke.test.d.ts +0 -6
  681. package/dist/src/server/web-socket-protocol.smoke.test.d.ts.map +0 -1
  682. package/dist/src/server/web-socket-protocol.smoke.test.js +0 -196
  683. package/dist/src/server/web-socket-protocol.smoke.test.js.map +0 -1
  684. package/src/cli/commands/exec-command.ts +0 -48
  685. package/src/cli/commands/run-command.ts +0 -63
  686. package/src/cli/commands/terminal/terminal-command.ts +0 -54
  687. package/src/cli/commands/terminal/terminal-editor.ts +0 -500
  688. package/src/cli/commands/terminal/terminal-mode.ts +0 -184
  689. package/src/server/web-socket-protocol.smoke.test.ts +0 -255
@@ -0,0 +1,1247 @@
1
+ --!strict
2
+ --!native
3
+ --!optimize 2
4
+ type PNG__DARKLUA_TYPE_a = {
5
+ width: number,
6
+ height: number,
7
+ pixels: buffer,
8
+ readPixel: (x: number, y: number) -> (number, number, number, number),
9
+ }
10
+
11
+ type Chunk__DARKLUA_TYPE_b = {
12
+ type: string,
13
+ offset: number,
14
+ length: number,
15
+ }
16
+
17
+ type IHDRChunk__DARKLUA_TYPE_c = {
18
+ width: number,
19
+ height: number,
20
+ bitDepth: number,
21
+ colorType: number,
22
+ interlaced: boolean,
23
+ }
24
+
25
+ type PaletteColor__DARKLUA_TYPE_d = {
26
+ r: number,
27
+ g: number,
28
+ b: number,
29
+ a: number,
30
+ }
31
+
32
+ type PLTEChunk__DARKLUA_TYPE_e = {
33
+ colors: { PaletteColor__DARKLUA_TYPE_d },
34
+ }
35
+
36
+ type tRNSChunk__DARKLUA_TYPE_f = {
37
+ gray: number,
38
+ red: number,
39
+ green: number,
40
+ blue: number,
41
+ }
42
+
43
+ type HuffmanTable__DARKLUA_TYPE_g = { number }
44
+ local __BUNDLE = { cache = {} :: any }
45
+ do
46
+ do
47
+ local function __modImpl()
48
+ return {}
49
+ end
50
+ function __BUNDLE.a(): typeof(__modImpl())
51
+ local v = __BUNDLE.cache.a
52
+ if not v then
53
+ v = { c = __modImpl() }
54
+ __BUNDLE.cache.a = v
55
+ end
56
+ return v.c
57
+ end
58
+ end
59
+ do
60
+ local function __modImpl()
61
+ __BUNDLE.a()
62
+
63
+ local COLOR_TYPE_BIT_DEPTH = {
64
+ [0] = { 1, 2, 4, 8, 16 },
65
+ [2] = { 8, 16 },
66
+ [3] = { 1, 2, 4, 8 },
67
+ [4] = { 8, 16 },
68
+ [6] = { 8, 16 },
69
+ }
70
+
71
+ local function read(buf: buffer, chunk: Chunk__DARKLUA_TYPE_b): IHDRChunk__DARKLUA_TYPE_c
72
+ assert(chunk.length == 13, "IHDR data must be 13 bytes")
73
+
74
+ local offset = chunk.offset
75
+
76
+ local width = bit32.byteswap(buffer.readu32(buf, offset))
77
+ local height = bit32.byteswap(buffer.readu32(buf, offset + 4))
78
+ local bitDepth = buffer.readu8(buf, offset + 8)
79
+ local colorType = buffer.readu8(buf, offset + 9)
80
+ local compression = buffer.readu8(buf, offset + 10)
81
+ local filter = buffer.readu8(buf, offset + 11)
82
+ local interlace = buffer.readu8(buf, offset + 12)
83
+
84
+ assert(width > 0 and width <= 2 ^ 31 and height > 0 and height <= 2 ^ 31, "invalid dimensions")
85
+ assert(compression == 0, "invalid compression method")
86
+ assert(filter == 0, "invalid filter method")
87
+ assert(interlace == 0 or interlace == 1, "invalid interlace method")
88
+
89
+ local allowedBitDepth = COLOR_TYPE_BIT_DEPTH[colorType]
90
+ assert(allowedBitDepth ~= nil, "invalid color type")
91
+ assert(table.find(allowedBitDepth, bitDepth) ~= nil, "invalid bit depth")
92
+
93
+ return {
94
+ width = width,
95
+ height = height,
96
+ bitDepth = bitDepth,
97
+ colorType = colorType,
98
+ interlaced = interlace == 1,
99
+ }
100
+ end
101
+
102
+ return read
103
+ end
104
+ function __BUNDLE.b(): typeof(__modImpl())
105
+ local v = __BUNDLE.cache.b
106
+ if not v then
107
+ v = { c = __modImpl() }
108
+ __BUNDLE.cache.b = v
109
+ end
110
+ return v.c
111
+ end
112
+ end
113
+ do
114
+ local function __modImpl()
115
+ __BUNDLE.a()
116
+
117
+ local function read(
118
+ buf: buffer,
119
+ chunk: Chunk__DARKLUA_TYPE_b,
120
+ header: IHDRChunk__DARKLUA_TYPE_c
121
+ ): PLTEChunk__DARKLUA_TYPE_e
122
+ assert(chunk.length % 3 == 0, "malformed PLTE chunk")
123
+
124
+ local count = chunk.length / 3
125
+ assert(count > 0, "no entries in PLTE")
126
+ assert(count <= 256, "too many entries in PLTE")
127
+ assert(count <= 2 ^ header.bitDepth, "too many entries in PLTE for bit depth")
128
+
129
+ local colors = table.create(count)
130
+ local offset = chunk.offset
131
+
132
+ for i = 1, count do
133
+ colors[i] = {
134
+ r = buffer.readu8(buf, offset),
135
+ g = buffer.readu8(buf, offset + 1),
136
+ b = buffer.readu8(buf, offset + 2),
137
+ a = 255,
138
+ }
139
+ offset += 3
140
+ end
141
+
142
+ return {
143
+ colors = colors,
144
+ }
145
+ end
146
+
147
+ return read
148
+ end
149
+ function __BUNDLE.c(): typeof(__modImpl())
150
+ local v = __BUNDLE.cache.c
151
+ if not v then
152
+ v = { c = __modImpl() }
153
+ __BUNDLE.cache.c = v
154
+ end
155
+ return v.c
156
+ end
157
+ end
158
+ do
159
+ local function __modImpl()
160
+ __BUNDLE.a()
161
+
162
+ local function readU16(buf: buffer, offset: number, depth: number)
163
+ return bit32.extract(
164
+ bit32.bor(bit32.lshift(buffer.readu8(buf, offset), 8), buffer.readu8(buf, offset + 1)),
165
+ 0,
166
+ depth
167
+ )
168
+ end
169
+
170
+ local function read(
171
+ buf: buffer,
172
+ chunk: Chunk__DARKLUA_TYPE_b,
173
+ header: IHDRChunk__DARKLUA_TYPE_c,
174
+ palette: PLTEChunk__DARKLUA_TYPE_e?
175
+ ): tRNSChunk__DARKLUA_TYPE_f
176
+ local gray = -1
177
+ local red = -1
178
+ local green = -1
179
+ local blue = -1
180
+
181
+ if header.colorType == 0 then
182
+ assert(chunk.length == 2, "invalid tRNS length for color type")
183
+ gray = readU16(buf, chunk.offset, header.bitDepth)
184
+ elseif header.colorType == 2 then
185
+ assert(chunk.length == 6, "invalid tRNS length for color type")
186
+ red = readU16(buf, chunk.offset, header.bitDepth)
187
+ green = readU16(buf, chunk.offset + 2, header.bitDepth)
188
+ blue = readU16(buf, chunk.offset + 4, header.bitDepth)
189
+ else
190
+ local count = chunk.length
191
+ assert(palette, "tRNS requires PLTE for color type")
192
+ assert(count <= #palette.colors, "tRNS specified too many PLTE alphas")
193
+ for i = 1, count do
194
+ palette.colors[i].a = buffer.readu8(buf, chunk.offset + i - 1)
195
+ end
196
+ end
197
+
198
+ return {
199
+ gray = gray,
200
+ red = red,
201
+ green = green,
202
+ blue = blue,
203
+ }
204
+ end
205
+
206
+ return read
207
+ end
208
+ function __BUNDLE.d(): typeof(__modImpl())
209
+ local v = __BUNDLE.cache.d
210
+ if not v then
211
+ v = { c = __modImpl() }
212
+ __BUNDLE.cache.d = v
213
+ end
214
+ return v.c
215
+ end
216
+ end
217
+ do
218
+ local function __modImpl()
219
+ return {
220
+ IHDR = __BUNDLE.b(),
221
+ PLTE = __BUNDLE.c(),
222
+ tRNS = __BUNDLE.d(),
223
+ }
224
+ end
225
+ function __BUNDLE.e(): typeof(__modImpl())
226
+ local v = __BUNDLE.cache.e
227
+ if not v then
228
+ v = { c = __modImpl() }
229
+ __BUNDLE.cache.e = v
230
+ end
231
+ return v.c
232
+ end
233
+ end
234
+ do
235
+ local function __modImpl()
236
+
237
+
238
+ -- stylua: ignore
239
+
240
+ local lookup = {
241
+ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
242
+ 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
243
+ 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
244
+ 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
245
+ 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
246
+ 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
247
+ 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
248
+ 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
249
+ 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
250
+ 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
251
+ 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
252
+ 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
253
+ 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
254
+ 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
255
+ 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
256
+ 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
257
+ 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
258
+ 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
259
+ 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
260
+ 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
261
+ 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
262
+ 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
263
+ 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
264
+ 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
265
+ 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
266
+ 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
267
+ 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
268
+ 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
269
+ 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
270
+ 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
271
+ 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
272
+ 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D,
273
+ }
274
+
275
+ local function crc32(buf: buffer, i: number, j: number)
276
+ local code = 0xFFFFFFFF
277
+ for k = i, j do
278
+ code = bit32.bxor(
279
+ bit32.rshift(code, 8),
280
+ lookup[bit32.bxor(bit32.band(code, 0xFF), buffer.readu8(buf, k)) + 1]
281
+ )
282
+ end
283
+ return bit32.bxor(code, 0xFFFFFFFF)
284
+ end
285
+
286
+ return crc32
287
+ end
288
+ function __BUNDLE.f(): typeof(__modImpl())
289
+ local v = __BUNDLE.cache.f
290
+ if not v then
291
+ v = { c = __modImpl() }
292
+ __BUNDLE.cache.f = v
293
+ end
294
+ return v.c
295
+ end
296
+ end
297
+ do
298
+ local function __modImpl()
299
+ local MAX_BITS = 15
300
+
301
+ -- stylua: ignore
302
+ local LIT_LEN = {
303
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131,
304
+ 163, 195, 227, 258
305
+ }
306
+
307
+ -- stylua: ignore
308
+ local LIT_EXTRA = {
309
+ 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0,
310
+ }
311
+
312
+ -- stylua: ignore
313
+ local DIST_OFF = {
314
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049,
315
+ 3073, 4097, 6145, 8193, 12289, 16385, 24577
316
+ }
317
+
318
+ -- stylua: ignore
319
+ local DIST_EXTRA = {
320
+ 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13
321
+ }
322
+
323
+ -- stylua: ignore
324
+ local LEN_ORDER = {
325
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
326
+ }
327
+
328
+ -- stylua: ignore
329
+ local FIXED_LIT = {
330
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
331
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
332
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
333
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
334
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
335
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
336
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
337
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
338
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8
339
+ }
340
+
341
+ local WINDOW_LOOKAHEAD = 258
342
+ local WINDOW_SEARCH = 0x8000 - WINDOW_LOOKAHEAD
343
+
344
+ local MAX_CHAIN_NODES = 50_000
345
+ local MAX_CHAIN_SEARCH = 12
346
+ local MAX_MATCH_LENGTH = 96
347
+ local DEFLATE_BLOCK_SIZE = 0x8000
348
+
349
+ local function createHuffmanTable(
350
+ lengths: { number }
351
+ ): (HuffmanTable__DARKLUA_TYPE_g, { number }, { number })
352
+ local lengthCount = table.create(MAX_BITS, 0)
353
+ lengthCount[0] = 0
354
+ for _, length in lengths do
355
+ if length > 0 then
356
+ lengthCount[length] = (lengthCount[length] or 0) + 1
357
+ end
358
+ end
359
+
360
+ local lastCode = 1
361
+ local nextCode = table.create(MAX_BITS)
362
+ for bits = 1, MAX_BITS do
363
+ lastCode = bit32.lshift(lastCode + lengthCount[bits - 1], 1)
364
+ nextCode[bits] = lastCode
365
+ end
366
+
367
+ local mapping = {}
368
+ local codeValues = {}
369
+ local codeLengths = {}
370
+ for i, length in lengths do
371
+ if length > 0 then
372
+ mapping[nextCode[length]] = i - 1
373
+ codeValues[i - 1] = bit32.extract(nextCode[length], 0, length)
374
+ codeLengths[i - 1] = length
375
+ nextCode[length] += 1
376
+ end
377
+ end
378
+
379
+ return mapping, codeValues, codeLengths
380
+ end
381
+
382
+ local cachedLitValues = {}
383
+ local cachedLitExtraValues = {}
384
+ local cachedLitExtraBits = {}
385
+ for length = 3, 258 do
386
+ local idx
387
+ for i = #LIT_LEN, 1, -1 do
388
+ if length >= LIT_LEN[i] then
389
+ idx = i
390
+ break
391
+ end
392
+ end
393
+ cachedLitValues[length] = 0x100 + idx
394
+ cachedLitExtraValues[length] = length - LIT_LEN[idx]
395
+ cachedLitExtraBits[length] = LIT_EXTRA[idx - 8] or 0
396
+ end
397
+
398
+ local cachedDistIndices = {}
399
+ for distance = 1, 1024 do
400
+ local distIdx
401
+ for i = #DIST_OFF, 1, -1 do
402
+ if distance >= DIST_OFF[i] then
403
+ distIdx = i
404
+ break
405
+ end
406
+ end
407
+ cachedDistIndices[distance] = distIdx
408
+ end
409
+
410
+ local fixedLitTable, fixedLitCodeValues, fixedLitCodeLengths = createHuffmanTable(FIXED_LIT)
411
+ local fixedDistTable, fixedDistCodeValues, fixedDistCodeLengths = createHuffmanTable(table.create(32, 5))
412
+
413
+ local function getStoreSize(blockSize: number)
414
+ return math.ceil(blockSize / DEFLATE_BLOCK_SIZE) * 5 + blockSize
415
+ end
416
+
417
+ local function getDistIdx(distance: number)
418
+ return if distance < 1025
419
+ then cachedDistIndices[distance]
420
+ elseif distance < 1537 then 21
421
+ elseif distance < 2049 then 22
422
+ elseif distance < 3073 then 23
423
+ elseif distance < 4097 then 24
424
+ elseif distance < 6145 then 25
425
+ elseif distance < 8193 then 26
426
+ elseif distance < 12289 then 27
427
+ elseif distance < 16385 then 28
428
+ elseif distance < 24577 then 29
429
+ else 30
430
+ end
431
+
432
+ local function adler32(input: buffer, offset: number, length: number): number
433
+ local s0 = 1
434
+ local s1 = 0
435
+ local count = 0
436
+ for i = offset, offset + length - 1 do
437
+ s0 += buffer.readu8(input, i)
438
+ s1 += s0
439
+ count += 1
440
+ if count == 8_400_000 then
441
+ s0 %= 65521
442
+ s1 %= 65521
443
+ count = 0
444
+ end
445
+ end
446
+ return bit32.bor(bit32.lshift(s1 % 65521, 16), s0 % 65521)
447
+ end
448
+
449
+ local function inflate(input: buffer, output: buffer): number
450
+ local header0 = buffer.readu8(input, 0)
451
+ local header1 = buffer.readu8(input, 1)
452
+ assert(bit32.extract(header0, 0, 4) == 8, "invalid zlib comp method")
453
+ assert(bit32.extract(header0, 4, 4) <= 7, "invalid zlib window size")
454
+ assert(bit32.extract(header1, 5, 1) == 0, "preset dictionary is not allowed")
455
+ assert(bit32.bor(bit32.lshift(header0, 8), header1) % 31 == 0, "zlib header sum mismatch")
456
+
457
+ local readOffset = 2
458
+ local readOffsetBit = 0
459
+
460
+ local function readBit()
461
+ local bit = bit32.extract(buffer.readu8(input, readOffset), readOffsetBit)
462
+ readOffsetBit += 1
463
+ if readOffsetBit == 8 then
464
+ readOffsetBit = 0
465
+ readOffset += 1
466
+ end
467
+ return bit
468
+ end
469
+
470
+ local function readBits(n: number)
471
+ local bits = buffer.readbits(input, readOffset * 8 + readOffsetBit, n)
472
+ readOffsetBit += n
473
+ readOffset += bit32.rshift(readOffsetBit, 3)
474
+ readOffsetBit = bit32.band(readOffsetBit, 0b111)
475
+ return bits
476
+ end
477
+
478
+ local function readHuffmanTable(huffmanTable: HuffmanTable__DARKLUA_TYPE_g): number
479
+ local code = 2 + readBit()
480
+ while not huffmanTable[code] do
481
+ code = 2 * code + readBit()
482
+ end
483
+ return huffmanTable[code]
484
+ end
485
+
486
+ local writeOffset = 0
487
+
488
+ repeat
489
+ local bfinal = readBit()
490
+ local btype = readBits(2)
491
+ assert(btype ~= 0b11, "reserved btype")
492
+
493
+ if btype == 0b00 then
494
+ if readOffsetBit > 0 then
495
+ readOffset += 1
496
+ readOffsetBit = 0
497
+ end
498
+ local len = buffer.readu16(input, readOffset)
499
+ assert(bit32.bxor(len, buffer.readu16(input, readOffset + 2)) == 0xFFFF, "len ~= nlen")
500
+ readOffset += 4
501
+ buffer.copy(output, writeOffset, input, readOffset, len)
502
+ writeOffset += len
503
+ readOffset += len
504
+ else
505
+ local litTable = fixedLitTable
506
+ local distTable = fixedDistTable
507
+
508
+ if btype == 0b10 then
509
+ local litsCount = readBits(5) + 257
510
+ local distsCount = readBits(5) + 1
511
+ local codesCount = readBits(4) + 4
512
+
513
+ local codeLengths = table.create(19, 0)
514
+ for i = 1, codesCount do
515
+ codeLengths[LEN_ORDER[i] + 1] = readBits(3)
516
+ end
517
+ local codeLengthsTable = createHuffmanTable(codeLengths)
518
+
519
+ local litLengths = table.create(litsCount)
520
+ local litLength
521
+ repeat
522
+ local code = readHuffmanTable(codeLengthsTable)
523
+ local repeatCount = 1
524
+ if code <= 15 then
525
+ litLength = code
526
+ elseif code == 16 then
527
+ -- RFC 1951: code 16 means "repeat previous length"
528
+ -- and is invalid as the first symbol. Without this
529
+ -- assert table.insert(nil) is a no-op, the until
530
+ -- loop never reaches litsCount, and decoding spins
531
+ -- forever.
532
+ assert(litLength ~= nil, "deflate: code 16 cannot be the first dynamic Huffman symbol")
533
+ repeatCount = readBits(2) + 3
534
+ elseif code == 17 then
535
+ litLength = 0
536
+ repeatCount = readBits(3) + 3
537
+ elseif code == 18 then
538
+ litLength = 0
539
+ repeatCount = readBits(7) + 11
540
+ end
541
+ for _ = 1, repeatCount do
542
+ table.insert(litLengths, litLength)
543
+ end
544
+ until #litLengths >= litsCount
545
+ litTable = createHuffmanTable(litLengths)
546
+
547
+ local distLengths = table.create(distsCount)
548
+ local distLength
549
+ repeat
550
+ local code = readHuffmanTable(codeLengthsTable)
551
+ local repeatCount = 1
552
+ if code <= 15 then
553
+ distLength = code
554
+ elseif code == 16 then
555
+ assert(distLength ~= nil, "deflate: code 16 cannot be the first dynamic Huffman symbol")
556
+ repeatCount = readBits(2) + 3
557
+ elseif code == 17 then
558
+ distLength = 0
559
+ repeatCount = readBits(3) + 3
560
+ elseif code == 18 then
561
+ distLength = 0
562
+ repeatCount = readBits(7) + 11
563
+ end
564
+ for _ = 1, repeatCount do
565
+ table.insert(distLengths, distLength)
566
+ end
567
+ until #distLengths >= distsCount
568
+ distTable = createHuffmanTable(distLengths)
569
+ end
570
+
571
+ repeat
572
+ local v = readHuffmanTable(litTable)
573
+ if v < 0x100 then
574
+ buffer.writeu8(output, writeOffset, v)
575
+ writeOffset += 1
576
+ elseif v > 0x100 then
577
+ local len = LIT_LEN[v - 0x100]
578
+ if v > 0x10C then
579
+ len += readBits(LIT_EXTRA[v - 0x108])
580
+ elseif v > 0x108 then
581
+ len += readBit()
582
+ end
583
+
584
+ local d = readHuffmanTable(distTable)
585
+ local dist = DIST_OFF[d + 1]
586
+ if d > 5 then
587
+ dist += readBits(DIST_EXTRA[d])
588
+ elseif d > 3 then
589
+ dist += readBit()
590
+ end
591
+
592
+ if len <= dist then
593
+ buffer.copy(output, writeOffset, output, writeOffset - dist, len)
594
+ writeOffset += len
595
+ else
596
+ repeat
597
+ local size = math.min(len, dist)
598
+ buffer.copy(output, writeOffset, output, writeOffset - dist, size)
599
+ writeOffset += size
600
+ len -= size
601
+ dist += size
602
+ until len == 0
603
+ end
604
+ end
605
+ until v == 0x100
606
+ end
607
+ until bfinal == 0b1
608
+
609
+ if readOffsetBit > 0 then
610
+ readOffsetBit = 0
611
+ readOffset += 1
612
+ end
613
+
614
+ assert(
615
+ adler32(output, 0, buffer.len(output)) == bit32.byteswap(buffer.readu32(input, readOffset)),
616
+ "adler-32 checksum mismatch"
617
+ )
618
+
619
+ return writeOffset
620
+ end
621
+
622
+ local function deflate(input: buffer): (buffer, number)
623
+ local inputSize = buffer.len(input)
624
+ local output = buffer.create(getStoreSize(inputSize) + 6)
625
+
626
+ buffer.writeu16(output, 0, 0b01_0_11110_0111_1000)
627
+
628
+ local writeOffset = 2
629
+ local writeOffsetBits = 0
630
+
631
+ local function writeBits(n: number, width: number)
632
+ buffer.writebits(output, writeOffset * 8 + writeOffsetBits, width, n)
633
+ writeOffsetBits += width
634
+ writeOffset += bit32.rshift(writeOffsetBits, 3)
635
+ writeOffsetBits = bit32.band(writeOffsetBits, 0b111)
636
+ end
637
+
638
+ local function writeHuffmanBits(n: number, w: number)
639
+ n = bit32.bor(
640
+ bit32.band(bit32.rshift(n, 1), 0x55555555),
641
+ bit32.band(bit32.lshift(n, 1), 0xAAAAAAAA)
642
+ )
643
+ n = bit32.bor(
644
+ bit32.band(bit32.rshift(n, 2), 0x33333333),
645
+ bit32.band(bit32.lshift(n, 2), 0xCCCCCCCC)
646
+ )
647
+ n = bit32.bor(
648
+ bit32.band(bit32.rshift(n, 4), 0x0F0F0F0F),
649
+ bit32.band(bit32.lshift(n, 4), 0xF0F0F0F0)
650
+ )
651
+ n = bit32.bor(
652
+ bit32.band(bit32.rshift(n, 8), 0x00FF00FF),
653
+ bit32.band(bit32.lshift(n, 8), 0xFF00FF00)
654
+ )
655
+ n = bit32.bor(bit32.rshift(n, 16), bit32.lshift(n, 16))
656
+ n = bit32.band(bit32.rshift(n, 32 - w), bit32.lshift(1, w) - 1)
657
+ writeBits(n, w)
658
+ end
659
+
660
+ local function writeLitOrLen(value: number)
661
+ writeHuffmanBits(fixedLitCodeValues[value], fixedLitCodeLengths[value])
662
+ end
663
+
664
+ local function writeBackRef(distance: number, length: number)
665
+ writeLitOrLen(cachedLitValues[length])
666
+ if length > 10 then
667
+ writeBits(cachedLitExtraValues[length], cachedLitExtraBits[length])
668
+ end
669
+ local distIdx = getDistIdx(distance)
670
+ writeHuffmanBits(fixedDistCodeValues[distIdx - 1], fixedDistCodeLengths[distIdx - 1])
671
+ if distIdx > 3 then
672
+ writeBits(distance - DIST_OFF[distIdx], DIST_EXTRA[distIdx - 1])
673
+ end
674
+ end
675
+
676
+ local function getLitOrLenSize(value: number)
677
+ return fixedLitCodeLengths[value]
678
+ end
679
+
680
+ local function getBackRefSize(distance: number, length: number)
681
+ local distIdx = getDistIdx(distance)
682
+ return getLitOrLenSize(cachedLitValues[length])
683
+ + cachedLitExtraBits[length]
684
+ + fixedDistCodeLengths[distIdx - 1]
685
+ + (DIST_EXTRA[distIdx - 1] or 0)
686
+ end
687
+
688
+ local offsets = {}
689
+ local nexts = {}
690
+ local heads = {}
691
+ local nodeCount = 0
692
+
693
+ local function insertNode(offset: number, nextIndex: number)
694
+ nodeCount += 1
695
+ offsets[nodeCount] = offset
696
+ nexts[nodeCount] = nextIndex
697
+ return nodeCount
698
+ end
699
+
700
+ local function clearTables()
701
+ table.clear(offsets)
702
+ table.clear(nexts)
703
+ table.clear(heads)
704
+ nodeCount = 0
705
+ end
706
+
707
+ for startReadOffset = 0, inputSize - 1, DEFLATE_BLOCK_SIZE do
708
+ local huffmanSizeBits = 0
709
+
710
+ local nextBlockReadOffset = math.min(inputSize, startReadOffset + DEFLATE_BLOCK_SIZE)
711
+ local readOffset = startReadOffset
712
+
713
+ local tokens: { vector } = {}
714
+ while readOffset < nextBlockReadOffset - 3 do
715
+ local hash = bit32.band(buffer.readu32(input, readOffset), 0xFFFFFF)
716
+ local newNodeIndex = insertNode(readOffset, heads[hash] or 0)
717
+ heads[hash] = newNodeIndex
718
+
719
+ local bestLength = 0
720
+ local bestOffset = -1
721
+
722
+ local chainCount = 0
723
+ local nodeIndex = nexts[newNodeIndex]
724
+ while
725
+ nodeIndex
726
+ and (offsets[nodeIndex] or -math.huge) >= readOffset - WINDOW_SEARCH
727
+ and chainCount < MAX_CHAIN_SEARCH
728
+ and bestLength < MAX_MATCH_LENGTH
729
+ do
730
+ local searchLength = 3
731
+ local searchOffset = offsets[nodeIndex]
732
+
733
+ local exit = false
734
+ local limit = math.min(nextBlockReadOffset, readOffset + WINDOW_LOOKAHEAD)
735
+ if
736
+ readOffset + bestLength < limit
737
+ and buffer.readu8(input, searchOffset + bestLength)
738
+ ~= buffer.readu8(input, readOffset + bestLength)
739
+ then
740
+ exit = true
741
+ end
742
+
743
+ while
744
+ not exit
745
+ and searchLength < WINDOW_LOOKAHEAD
746
+ and readOffset + searchLength < nextBlockReadOffset
747
+ and buffer.readu8(input, searchOffset + searchLength)
748
+ == buffer.readu8(input, readOffset + searchLength)
749
+ do
750
+ searchLength += 1
751
+ end
752
+ if searchLength > bestLength then
753
+ bestLength = searchLength
754
+ bestOffset = searchOffset
755
+ if bestLength >= WINDOW_LOOKAHEAD then
756
+ break
757
+ end
758
+ end
759
+ nodeIndex = nexts[nodeIndex]
760
+ chainCount += 1
761
+ end
762
+
763
+ if bestLength == 0 then
764
+ local b = buffer.readu8(input, readOffset)
765
+ huffmanSizeBits += getLitOrLenSize(b)
766
+ table.insert(tokens, vector.create(0, b))
767
+ readOffset += 1
768
+ else
769
+ huffmanSizeBits += getBackRefSize(readOffset - bestOffset, bestLength)
770
+ table.insert(tokens, vector.create(1, readOffset - bestOffset, bestLength))
771
+ for newOffset = readOffset + 1, math.min(readOffset + bestLength - 1, nextBlockReadOffset - 4) do
772
+ local newHash = bit32.band(buffer.readu32(input, newOffset), 0xFFFFFF)
773
+ heads[newHash] = insertNode(newOffset, heads[newHash] or 0)
774
+ end
775
+ readOffset += bestLength
776
+ end
777
+ end
778
+
779
+ while readOffset < nextBlockReadOffset do
780
+ local b = buffer.readu8(input, readOffset)
781
+ huffmanSizeBits += getLitOrLenSize(b)
782
+ table.insert(tokens, vector.create(0, b))
783
+ readOffset += 1
784
+ end
785
+
786
+ huffmanSizeBits += getLitOrLenSize(0x100)
787
+ table.insert(tokens, vector.create(0, 0x100))
788
+
789
+ if nextBlockReadOffset == inputSize then
790
+ writeBits(0b1, 1)
791
+ else
792
+ writeBits(0b0, 1)
793
+ end
794
+
795
+ local blockLength = nextBlockReadOffset - startReadOffset
796
+ local fixedHuffmanSize = math.ceil(huffmanSizeBits / 8) + 1
797
+ if fixedHuffmanSize < getStoreSize(blockLength) then
798
+ writeBits(0b01, 2)
799
+ for _, token in tokens do
800
+ if token.x == 0 then
801
+ writeLitOrLen(token.y)
802
+ else
803
+ writeBackRef(token.y, token.z)
804
+ end
805
+ end
806
+ else
807
+ writeBits(0b00, 2)
808
+ if writeOffsetBits > 0 then
809
+ writeOffset += 1
810
+ writeOffsetBits = 0
811
+ end
812
+ buffer.writeu16(output, writeOffset, blockLength)
813
+ buffer.writeu16(output, writeOffset + 2, bit32.bxor(0xFFFF, blockLength))
814
+ buffer.copy(output, writeOffset + 4, input, startReadOffset, blockLength)
815
+ writeOffset += 4 + blockLength
816
+ end
817
+
818
+ if nodeCount > MAX_CHAIN_NODES then
819
+ clearTables()
820
+ end
821
+ end
822
+
823
+ if writeOffsetBits > 0 then
824
+ writeOffset += 1
825
+ end
826
+
827
+ local checksum = adler32(input, 0, buffer.len(input))
828
+ buffer.writeu32(output, writeOffset, bit32.byteswap(checksum))
829
+
830
+ return output, writeOffset + 4
831
+ end
832
+
833
+ return {
834
+ inflate = inflate,
835
+ deflate = deflate,
836
+ }
837
+ end
838
+ function __BUNDLE.g(): typeof(__modImpl())
839
+ local v = __BUNDLE.cache.g
840
+ if not v then
841
+ v = { c = __modImpl() }
842
+ __BUNDLE.cache.g = v
843
+ end
844
+ return v.c
845
+ end
846
+ end
847
+ end
848
+ __BUNDLE.a()
849
+
850
+ local chunkReaders = __BUNDLE.e()
851
+ local crc32 = __BUNDLE.f()
852
+ local zlib = __BUNDLE.g()
853
+
854
+ local COLOR_TYPE_CHANNELS = {
855
+ [0] = 1,
856
+ [2] = 3,
857
+ [3] = 1,
858
+ [4] = 2,
859
+ [6] = 4,
860
+ }
861
+
862
+ local INTERLACE_ROW_START = { 0, 0, 4, 0, 2, 0, 1 }
863
+ local INTERLACE_COL_START = { 0, 4, 0, 2, 0, 1, 0 }
864
+ local INTERLACE_ROW_INCR = { 8, 8, 8, 4, 4, 2, 2 }
865
+ local INTERLACE_COL_INCR = { 8, 8, 4, 4, 2, 2, 1 }
866
+
867
+ -- selene: allow(bad_string_escape)
868
+ local SIGNATURE = "\x89PNG\x0D\x0A\x1A\x0A"
869
+
870
+ export type PNG = PNG__DARKLUA_TYPE_a
871
+
872
+ export type DecodeOptions = {
873
+ allowIncorrectCRC: boolean?,
874
+ }
875
+
876
+ export type EncodeOptions = {
877
+ width: number,
878
+ height: number,
879
+ }
880
+
881
+ local function decode(buf: buffer, options: DecodeOptions?): PNG
882
+ local bufLen = buffer.len(buf)
883
+ assert(bufLen >= 8, "not a PNG")
884
+ assert(buffer.readstring(buf, 0, 8) == SIGNATURE, "not a PNG")
885
+
886
+ local chunks: { Chunk__DARKLUA_TYPE_b } = table.create(3)
887
+ local offset = 8
888
+
889
+ local skipCRC = options ~= nil and options.allowIncorrectCRC == true
890
+ repeat
891
+ local dataLength = bit32.byteswap(buffer.readu32(buf, offset))
892
+ local chunkType = buffer.readstring(buf, offset + 4, 4)
893
+ assert(string.match(chunkType, "%a%a%a%a"), `invalid chunk type {chunkType}`)
894
+
895
+ local dataOffset = offset + 8
896
+ local nextOffset = dataOffset + dataLength + 4
897
+ assert(nextOffset <= bufLen, `EOF while reading {chunkType} chunk`)
898
+
899
+ local chunkCode = bit32.byteswap(buffer.readu32(buf, nextOffset - 4))
900
+ local expectCode = crc32(buf, offset + 4, nextOffset - 5)
901
+ assert(skipCRC or chunkCode == expectCode, `incorrect checksum in {chunkType}`)
902
+
903
+ table.insert(chunks, {
904
+ type = chunkType,
905
+ offset = dataOffset,
906
+ length = dataLength,
907
+ })
908
+ offset = nextOffset
909
+ until offset >= bufLen
910
+ assert(offset == bufLen, "trailing data in file")
911
+
912
+ for _, chunk in chunks do
913
+ local t = chunk.type
914
+ if bit32.extract(string.byte(t, 1, 1), 5) == 0 then
915
+ if t ~= "IHDR" and t ~= "IDAT" and t ~= "PLTE" and t ~= "IEND" then
916
+ error(`unhandled critical chunk {t}`)
917
+ end
918
+ end
919
+ end
920
+
921
+ local header: IHDRChunk__DARKLUA_TYPE_c
922
+ local headerChunk = chunks[1]
923
+ assert(headerChunk.type == "IHDR", "first chunk must be IHDR")
924
+ for i = 2, #chunks do
925
+ assert(chunks[i].type ~= "IHDR", "multiple IHDR chunks are not allowed")
926
+ end
927
+ header = chunkReaders.IHDR(buf, headerChunk)
928
+
929
+ local dataChunkIndex0 = -1
930
+ local dataChunkIndex1 = -1
931
+ local compressedDataLength = 0
932
+ for i, chunk in chunks do
933
+ if chunk.type == "IDAT" then
934
+ if dataChunkIndex0 < 0 then
935
+ dataChunkIndex0 = i
936
+ else
937
+ assert(i == dataChunkIndex1 + 1, "multiple IDAT chunks must be consecutive")
938
+ end
939
+ dataChunkIndex1 = i
940
+ compressedDataLength += chunk.length
941
+ end
942
+ end
943
+ assert(dataChunkIndex0 > 0, "no IDAT chunks")
944
+ assert(compressedDataLength > 0, "no image data in IDAT chunks")
945
+
946
+ local palette: PLTEChunk__DARKLUA_TYPE_e?
947
+ local paletteChunkIndex = -1
948
+ for i, chunk in chunks do
949
+ if chunk.type == "PLTE" then
950
+ assert(not palette, "multiple PLTE chunks are not allowed")
951
+ assert(i < dataChunkIndex0, "PLTE not allowed after IDAT chunks")
952
+ assert(header.colorType ~= 0 and header.colorType ~= 4, "PLTE not allowed for color type")
953
+ palette = chunkReaders.PLTE(buf, chunk, header)
954
+ paletteChunkIndex = i
955
+ end
956
+ end
957
+ if header.colorType == 3 then
958
+ assert(palette ~= nil, "color type requires a PLTE chunk")
959
+ end
960
+
961
+ local transparencyData: tRNSChunk__DARKLUA_TYPE_f?
962
+ for i, chunk in chunks do
963
+ if chunk.type == "tRNS" then
964
+ assert(transparencyData == nil, "multiple tRNS chunks are not allowed")
965
+ assert(i < dataChunkIndex0, "tRNS not allowed after IDAT chunks")
966
+ assert(not palette or i > paletteChunkIndex, "tRNS must be after PLTE")
967
+ assert(header.colorType ~= 4 and header.colorType ~= 6, "tRNS not allowed for color type")
968
+ transparencyData = chunkReaders.tRNS(buf, chunk, header, palette)
969
+ end
970
+ end
971
+
972
+ local finalChunk = chunks[#chunks]
973
+ assert(finalChunk.type == "IEND", "final chunk must be IEND")
974
+ assert(finalChunk.length == 0, "IEND chunk must be empty")
975
+ for i = 2, #chunks - 1 do
976
+ assert(chunks[i].type ~= "IEND", "multiple IEND chunks are not allowed")
977
+ end
978
+
979
+ local compressedData = buffer.create(compressedDataLength)
980
+ local compressedOffset = 0
981
+ for _, chunk in chunks do
982
+ if chunk.type == "IDAT" then
983
+ buffer.copy(compressedData, compressedOffset, buf, chunk.offset, chunk.length)
984
+ compressedOffset += chunk.length
985
+ end
986
+ end
987
+
988
+ local width = header.width
989
+ local height = header.height
990
+ local bitDepth = header.bitDepth
991
+ local colorType = header.colorType
992
+ local channels = COLOR_TYPE_CHANNELS[colorType]
993
+
994
+ local rawSize = 0
995
+ if not header.interlaced then
996
+ rawSize = height * (math.ceil(width * channels * bitDepth / 8) + 1)
997
+ else
998
+ for i = 1, 7 do
999
+ local w = math.ceil((width - INTERLACE_COL_START[i]) / INTERLACE_COL_INCR[i])
1000
+ local h = math.ceil((height - INTERLACE_ROW_START[i]) / INTERLACE_ROW_INCR[i])
1001
+ if w > 0 and h > 0 then
1002
+ local scanlineSize = math.ceil(w * channels * bitDepth / 8) + 1
1003
+ rawSize += h * scanlineSize
1004
+ end
1005
+ end
1006
+ end
1007
+
1008
+ local paletteColors
1009
+ if palette then
1010
+ paletteColors = palette.colors
1011
+ end
1012
+
1013
+ local rescale
1014
+ if colorType ~= 3 and bitDepth < 8 then
1015
+ rescale = 0xFF / (2 ^ bitDepth - 1)
1016
+ end
1017
+
1018
+ local bpp = math.ceil(channels * bitDepth / 8)
1019
+ local defaultAlpha = 2 ^ bitDepth - 1
1020
+
1021
+ local idx = 0
1022
+ local working = buffer.create(rawSize)
1023
+ local inflatedSize = zlib.inflate(compressedData, working)
1024
+ assert(inflatedSize == rawSize, "decompressed data size mismatch")
1025
+
1026
+ local rgba8 = buffer.create(width * height * 4)
1027
+
1028
+ local alphaGray = if transparencyData then transparencyData.gray else -1
1029
+ local alphaRed = if transparencyData then transparencyData.red else -1
1030
+ local alphaGreen = if transparencyData then transparencyData.green else -1
1031
+ local alphaBlue = if transparencyData then transparencyData.blue else -1
1032
+
1033
+ local function pass(sx: number, sy: number, dx: number, dy: number)
1034
+ local w = math.ceil((width - sx) / dx)
1035
+ local h = math.ceil((height - sy) / dy)
1036
+ if w < 1 or h < 1 then
1037
+ return
1038
+ end
1039
+
1040
+ local scanlineSize = math.ceil(w * channels * bitDepth / 8)
1041
+ local newIdx = idx
1042
+
1043
+ for y = 1, h do
1044
+ local rowFilter = buffer.readu8(working, idx)
1045
+ idx += 1
1046
+
1047
+ if rowFilter == 0 or (rowFilter == 2 and y == 1) then
1048
+ idx += scanlineSize
1049
+ elseif rowFilter == 1 then
1050
+ for x = 1, scanlineSize do
1051
+ local sub = if x <= bpp then 0 else buffer.readu8(working, idx - bpp)
1052
+ local value = bit32.band(buffer.readu8(working, idx) + sub, 0xFF)
1053
+ buffer.writeu8(working, idx, value)
1054
+ idx += 1
1055
+ end
1056
+ elseif rowFilter == 2 then
1057
+ for _ = 1, scanlineSize do
1058
+ local up = buffer.readu8(working, idx - scanlineSize - 1)
1059
+ local value = bit32.band(buffer.readu8(working, idx) + up, 0xFF)
1060
+ buffer.writeu8(working, idx, value)
1061
+ idx += 1
1062
+ end
1063
+ elseif rowFilter == 3 then
1064
+ for x = 1, scanlineSize do
1065
+ local sub = if x <= bpp then 0 else buffer.readu8(working, idx - bpp)
1066
+ local up = if y == 1 then 0 else buffer.readu8(working, idx - scanlineSize - 1)
1067
+ local value = bit32.band(buffer.readu8(working, idx) + bit32.rshift(sub + up, 1), 0xFF)
1068
+ buffer.writeu8(working, idx, value)
1069
+ idx += 1
1070
+ end
1071
+ elseif rowFilter == 4 then
1072
+ for x = 1, scanlineSize do
1073
+ local sub = if x <= bpp then 0 else buffer.readu8(working, idx - bpp)
1074
+ local up = if y == 1 then 0 else buffer.readu8(working, idx - scanlineSize - 1)
1075
+ local corner = if x <= bpp or y == 1
1076
+ then 0
1077
+ else buffer.readu8(working, idx - scanlineSize - bpp - 1)
1078
+ local p0 = math.abs(up - corner)
1079
+ local p1 = math.abs(sub - corner)
1080
+ local p2 = math.abs(sub + up - 2 * corner)
1081
+ local paeth = if p0 <= p1 and p0 <= p2 then sub elseif p1 <= p2 then up else corner
1082
+ local value = bit32.band(buffer.readu8(working, idx) + paeth, 0xFF)
1083
+ buffer.writeu8(working, idx, value)
1084
+ idx += 1
1085
+ end
1086
+ else
1087
+ error("invalid row filter")
1088
+ end
1089
+ end
1090
+
1091
+ local bit = 8
1092
+ local function readValue()
1093
+ local b = buffer.readu8(working, newIdx)
1094
+ if bitDepth < 8 then
1095
+ b = bit32.extract(b, bit - bitDepth, bitDepth)
1096
+ bit -= bitDepth
1097
+ if bit == 0 then
1098
+ bit = 8
1099
+ newIdx += 1
1100
+ end
1101
+ elseif bitDepth == 8 then
1102
+ newIdx += 1
1103
+ else
1104
+ b = bit32.bor(bit32.lshift(b, 8), buffer.readu8(working, newIdx + 1))
1105
+ newIdx += 2
1106
+ end
1107
+ return b
1108
+ end
1109
+
1110
+ for y = 1, h do
1111
+ newIdx += 1
1112
+ if bit < 8 then
1113
+ bit = 8
1114
+ newIdx += 1
1115
+ end
1116
+
1117
+ for x = 1, w do
1118
+ local r, g, b, a
1119
+
1120
+ if colorType == 0 then
1121
+ local gray = readValue()
1122
+ r = gray
1123
+ g = gray
1124
+ b = gray
1125
+ a = if gray == alphaGray then 0 else defaultAlpha
1126
+ elseif colorType == 2 then
1127
+ r = readValue()
1128
+ g = readValue()
1129
+ b = readValue()
1130
+ a = if r == alphaRed and g == alphaGreen and b == alphaBlue then 0 else defaultAlpha
1131
+ elseif colorType == 3 then
1132
+ local color = paletteColors[readValue() + 1]
1133
+ r = color.r
1134
+ g = color.g
1135
+ b = color.b
1136
+ a = color.a
1137
+ elseif colorType == 4 then
1138
+ local gray = readValue()
1139
+ r = gray
1140
+ g = gray
1141
+ b = gray
1142
+ a = readValue()
1143
+ elseif colorType == 6 then
1144
+ r = readValue()
1145
+ g = readValue()
1146
+ b = readValue()
1147
+ a = readValue()
1148
+ end
1149
+
1150
+ local py = sy + (y - 1) * dy
1151
+ local px = sx + (x - 1) * dx
1152
+ local i = (py * width + px) * 4
1153
+
1154
+ if rescale then
1155
+ r = math.round(r * rescale)
1156
+ g = math.round(g * rescale)
1157
+ b = math.round(b * rescale)
1158
+ a = math.round(a * rescale)
1159
+ elseif bitDepth == 16 then
1160
+ r = bit32.rshift(r, 8)
1161
+ g = bit32.rshift(g, 8)
1162
+ b = bit32.rshift(b, 8)
1163
+ a = bit32.rshift(a, 8)
1164
+ end
1165
+
1166
+ buffer.writeu32(rgba8, i, bit32.bor(bit32.lshift(a, 24), bit32.lshift(b, 16), bit32.lshift(g, 8), r))
1167
+ end
1168
+ end
1169
+ end
1170
+
1171
+ if not header.interlaced then
1172
+ pass(0, 0, 1, 1)
1173
+ else
1174
+ for i = 1, 7 do
1175
+ pass(INTERLACE_COL_START[i], INTERLACE_ROW_START[i], INTERLACE_COL_INCR[i], INTERLACE_ROW_INCR[i])
1176
+ end
1177
+ end
1178
+
1179
+ local function readPixel(x: number, y: number)
1180
+ assert(x >= 1 and x <= width and y >= 1 and y <= height, "pixel out of range")
1181
+
1182
+ local i = ((y - 1) * width + x - 1) * 4
1183
+ return buffer.readu8(rgba8, i),
1184
+ buffer.readu8(rgba8, i + 1),
1185
+ buffer.readu8(rgba8, i + 2),
1186
+ buffer.readu8(rgba8, i + 3)
1187
+ end
1188
+
1189
+ return {
1190
+ width = width,
1191
+ height = height,
1192
+ pixels = rgba8,
1193
+ readPixel = readPixel,
1194
+ }
1195
+ end
1196
+
1197
+ local function encode(pixels: buffer, options: EncodeOptions): buffer
1198
+ local width = options.width
1199
+ local height = options.height
1200
+
1201
+ local dataSize = buffer.len(pixels)
1202
+ local expectSize = width * height * 4
1203
+ assert(dataSize == expectSize, `expected {expectSize} bytes, got {dataSize} bytes`)
1204
+
1205
+ local imageDataRowSize = width * 4 + 1
1206
+ local imageData = buffer.create(height * imageDataRowSize)
1207
+ for row = 0, height - 1 do
1208
+ local sourceOffset = row * width * 4
1209
+ local targetOffset = row * imageDataRowSize
1210
+ buffer.writeu8(imageData, targetOffset, 0)
1211
+ buffer.copy(imageData, targetOffset + 1, pixels, sourceOffset, 4 * width)
1212
+ end
1213
+
1214
+ local imageDataDeflated, imageDataDeflatedLength = zlib.deflate(imageData)
1215
+ local outputLength = 8 + 25 + (8 + imageDataDeflatedLength + 4) + 12
1216
+
1217
+ local output = buffer.create(outputLength)
1218
+ buffer.writestring(output, 0, SIGNATURE)
1219
+
1220
+ buffer.writeu32(output, 8, bit32.byteswap(13))
1221
+ buffer.writestring(output, 12, "IHDR")
1222
+ buffer.writeu32(output, 16, bit32.byteswap(width))
1223
+ buffer.writeu32(output, 20, bit32.byteswap(height))
1224
+ buffer.writeu8(output, 24, 8)
1225
+ buffer.writeu8(output, 25, 6)
1226
+ buffer.writeu8(output, 26, 0)
1227
+ buffer.writeu8(output, 27, 0)
1228
+ buffer.writeu8(output, 28, 0)
1229
+ buffer.writeu32(output, 29, bit32.byteswap(crc32(output, 12, 28)))
1230
+
1231
+ buffer.writeu32(output, 33, bit32.byteswap(imageDataDeflatedLength))
1232
+ buffer.writestring(output, 37, "IDAT")
1233
+ buffer.copy(output, 41, imageDataDeflated, 0, imageDataDeflatedLength)
1234
+ local x = 41 + imageDataDeflatedLength
1235
+ buffer.writeu32(output, x, bit32.byteswap(crc32(output, 37, x - 1)))
1236
+
1237
+ buffer.writeu32(output, x + 4, 0)
1238
+ buffer.writestring(output, x + 8, "IEND")
1239
+ buffer.writeu32(output, x + 12, 0x826042AE)
1240
+
1241
+ return output
1242
+ end
1243
+
1244
+ return {
1245
+ decode = decode,
1246
+ encode = encode,
1247
+ }