piclaw 0.0.19 → 0.0.21

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 (270) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/defult-D5RLDUrI.js +1 -0
  3. package/.output/public/assets/{dist-CMBqBOCp.js → dist-BH_oa-kv.js} +1 -1
  4. package/.output/public/assets/index-7JvURuHy.js +204 -0
  5. package/.output/public/assets/index-K43slwjJ.css +1 -0
  6. package/.output/public/index.html +11 -2
  7. package/.output/server/_...path_.get.mjs +16 -0
  8. package/.output/server/_chunks/app.mjs +261 -181
  9. package/.output/server/_chunks/browser.mjs +4 -1
  10. package/.output/server/_chunks/config.mjs +4 -0
  11. package/.output/server/_chunks/db.mjs +32 -28
  12. package/.output/server/_chunks/device-bus.mjs +123 -0
  13. package/.output/server/_chunks/dummy.mjs +1 -1
  14. package/.output/server/_chunks/logger.mjs +23 -0
  15. package/.output/server/_chunks/login.mjs +1 -1
  16. package/.output/server/_chunks/notes.mjs +1 -3
  17. package/.output/server/_chunks/renderer-template.mjs +1 -1
  18. package/.output/server/_chunks/sandbox.mjs +217 -0
  19. package/.output/server/_chunks/server.mjs +2302 -122
  20. package/.output/server/_chunks/terminal.mjs +63 -8
  21. package/.output/server/_chunks/uploads.mjs +60 -0
  22. package/.output/server/_chunks/virtual.mjs +192 -54
  23. package/.output/server/_id_.delete.mjs +5 -2
  24. package/.output/server/_id_.patch.mjs +2 -0
  25. package/.output/server/_id_2.delete.mjs +8 -0
  26. package/.output/server/_jid_.delete.mjs +5 -2
  27. package/.output/server/_jid_.patch.mjs +37 -4
  28. package/.output/server/_jid_2.delete.mjs +5 -2
  29. package/.output/server/_libs/@acemir/cssom+[...].mjs +2269 -1137
  30. package/.output/server/_libs/@google/genai.mjs +337 -273
  31. package/.output/server/_libs/@mariozechner/pi-agent-core+[...].mjs +381 -2073
  32. package/.output/server/_libs/@mariozechner/pi-coding-agent+[...].mjs +231 -131
  33. package/.output/server/_libs/_.mjs +3 -2
  34. package/.output/server/_libs/_10.mjs +2 -4
  35. package/.output/server/_libs/_11.mjs +2 -4
  36. package/.output/server/_libs/_12.mjs +2 -3
  37. package/.output/server/_libs/_13.mjs +2 -3
  38. package/.output/server/_libs/_14.mjs +2 -4
  39. package/.output/server/_libs/_15.mjs +2 -4
  40. package/.output/server/_libs/_16.mjs +2 -3
  41. package/.output/server/_libs/_17.mjs +2 -4
  42. package/.output/server/_libs/_18.mjs +2 -2
  43. package/.output/server/_libs/_19.mjs +2 -2
  44. package/.output/server/_libs/_2.mjs +3 -3
  45. package/.output/server/_libs/_20.mjs +2 -2
  46. package/.output/server/_libs/_21.mjs +2 -2
  47. package/.output/server/_libs/_22.mjs +2 -2
  48. package/.output/server/_libs/_23.mjs +2 -2
  49. package/.output/server/_libs/_24.mjs +2 -2
  50. package/.output/server/_libs/_25.mjs +2 -2
  51. package/.output/server/_libs/_26.mjs +2 -2
  52. package/.output/server/_libs/_27.mjs +2 -2
  53. package/.output/server/_libs/_28.mjs +2 -2
  54. package/.output/server/_libs/_29.mjs +2 -2
  55. package/.output/server/_libs/_3.mjs +3 -3
  56. package/.output/server/_libs/_30.mjs +2 -2
  57. package/.output/server/_libs/_31.mjs +2 -2
  58. package/.output/server/_libs/_32.mjs +2 -2
  59. package/.output/server/_libs/_33.mjs +2 -2
  60. package/.output/server/_libs/_34.mjs +2 -2
  61. package/.output/server/_libs/_35.mjs +2 -2
  62. package/.output/server/_libs/_36.mjs +2 -2
  63. package/.output/server/_libs/_37.mjs +2 -2
  64. package/.output/server/_libs/_38.mjs +2 -2
  65. package/.output/server/_libs/_39.mjs +2 -2
  66. package/.output/server/_libs/_4.mjs +4 -3
  67. package/.output/server/_libs/_40.mjs +2 -2
  68. package/.output/server/_libs/_41.mjs +2 -2
  69. package/.output/server/_libs/_42.mjs +2 -2
  70. package/.output/server/_libs/_43.mjs +2 -2
  71. package/.output/server/_libs/_44.mjs +2 -2
  72. package/.output/server/_libs/_45.mjs +2 -2
  73. package/.output/server/_libs/_46.mjs +2 -2
  74. package/.output/server/_libs/_47.mjs +2 -2
  75. package/.output/server/_libs/_48.mjs +2 -2
  76. package/.output/server/_libs/_49.mjs +2 -2
  77. package/.output/server/_libs/_5.mjs +2 -3
  78. package/.output/server/_libs/_50.mjs +2 -2
  79. package/.output/server/_libs/_51.mjs +2 -2
  80. package/.output/server/_libs/_52.mjs +2 -2
  81. package/.output/server/_libs/_53.mjs +2 -2
  82. package/.output/server/_libs/_54.mjs +2 -2
  83. package/.output/server/_libs/_55.mjs +2 -2
  84. package/.output/server/_libs/_56.mjs +2 -2
  85. package/.output/server/_libs/_57.mjs +2 -2
  86. package/.output/server/_libs/_58.mjs +2 -2
  87. package/.output/server/_libs/_59.mjs +2 -2
  88. package/.output/server/_libs/_6.mjs +2 -3
  89. package/.output/server/_libs/_60.mjs +2 -2
  90. package/.output/server/_libs/_61.mjs +2 -2
  91. package/.output/server/_libs/_62.mjs +2 -2
  92. package/.output/server/_libs/_63.mjs +2 -2
  93. package/.output/server/_libs/_64.mjs +2 -2
  94. package/.output/server/_libs/_65.mjs +2 -2
  95. package/.output/server/_libs/_66.mjs +2 -2
  96. package/.output/server/_libs/_67.mjs +2 -2
  97. package/.output/server/_libs/_68.mjs +2 -2
  98. package/.output/server/_libs/_69.mjs +2 -2
  99. package/.output/server/_libs/_7.mjs +2 -5
  100. package/.output/server/_libs/_70.mjs +2 -2
  101. package/.output/server/_libs/_71.mjs +2 -2
  102. package/.output/server/_libs/_72.mjs +2 -2
  103. package/.output/server/_libs/_73.mjs +2 -2
  104. package/.output/server/_libs/_74.mjs +2 -2
  105. package/.output/server/_libs/_75.mjs +2 -2
  106. package/.output/server/_libs/_76.mjs +2 -2
  107. package/.output/server/_libs/_77.mjs +2 -2
  108. package/.output/server/_libs/_78.mjs +2 -2
  109. package/.output/server/_libs/_79.mjs +2 -2
  110. package/.output/server/_libs/_8.mjs +2 -3
  111. package/.output/server/_libs/_80.mjs +2 -2
  112. package/.output/server/_libs/_81.mjs +2 -2
  113. package/.output/server/_libs/_82.mjs +2 -2
  114. package/.output/server/_libs/_83.mjs +2 -2
  115. package/.output/server/_libs/_84.mjs +2 -2
  116. package/.output/server/_libs/_85.mjs +2 -2
  117. package/.output/server/_libs/_86.mjs +2 -2
  118. package/.output/server/_libs/_87.mjs +2 -2
  119. package/.output/server/_libs/_88.mjs +2 -2
  120. package/.output/server/_libs/_89.mjs +2 -2
  121. package/.output/server/_libs/_9.mjs +2 -4
  122. package/.output/server/_libs/_90.mjs +5 -2
  123. package/.output/server/_libs/_91.mjs +3 -2
  124. package/.output/server/_libs/_92.mjs +2 -2
  125. package/.output/server/_libs/_93.mjs +2 -2
  126. package/.output/server/_libs/_94.mjs +2 -2
  127. package/.output/server/_libs/agent-base.mjs +1 -1
  128. package/.output/server/_libs/cheerio+[...].mjs +1 -1
  129. package/.output/server/_libs/data-uri-to-buffer.mjs +2 -67
  130. package/.output/server/_libs/data-urls+[...].mjs +1 -1
  131. package/.output/server/_libs/diff.mjs +1 -1
  132. package/.output/server/_libs/exodus__bytes.mjs +99 -81
  133. package/.output/server/_libs/fetch-blob+node-domexception.mjs +1 -1
  134. package/.output/server/_libs/h3+rou3+srvx.mjs +34 -4
  135. package/.output/server/_libs/html-encoding-sniffer.mjs +1 -1
  136. package/.output/server/_libs/https-proxy-agent.mjs +2 -2
  137. package/.output/server/_libs/jsdom.mjs +1 -1
  138. package/.output/server/_libs/just-bash+[...].mjs +4676 -3916
  139. package/.output/server/_libs/mariozechner__jiti.mjs +1 -1
  140. package/.output/server/_libs/mariozechner__pi-ai.mjs +1472 -0
  141. package/.output/server/_libs/md4x.mjs +1 -1
  142. package/.output/server/_libs/mime.mjs +838 -1
  143. package/.output/server/_libs/node-fetch.mjs +4 -4
  144. package/.output/server/_libs/node-liblzma.mjs +1 -1
  145. package/.output/server/_libs/silvia-odwyer__photon-node.mjs +1 -1
  146. package/.output/server/_routes/api/auth/approve.mjs +2 -0
  147. package/.output/server/_routes/api/auth/revoke.mjs +2 -0
  148. package/.output/server/_routes/api/auth/status.mjs +25 -6
  149. package/.output/server/_routes/api/browser2.mjs +1 -1
  150. package/.output/server/_routes/api/config2.mjs +2 -0
  151. package/.output/server/_routes/api/device_events.mjs +36 -0
  152. package/.output/server/_routes/api/files/groups.mjs +1 -2
  153. package/.output/server/_routes/api/files/raw.mjs +1 -1
  154. package/.output/server/_routes/api/groups.mjs +5 -3
  155. package/.output/server/_routes/api/groups2.mjs +18 -6
  156. package/.output/server/_routes/api/health.mjs +1 -2
  157. package/.output/server/_routes/api/messages.mjs +7 -1
  158. package/.output/server/_routes/api/notes/delete.mjs +4 -1
  159. package/.output/server/_routes/api/notes/write.mjs +2 -0
  160. package/.output/server/_routes/api/ntfy/setup.mjs +8 -0
  161. package/.output/server/_routes/api/pi/apikey.mjs +3 -2
  162. package/.output/server/_routes/api/pi/apikey_providers.mjs +1 -2
  163. package/.output/server/_routes/api/pi/commands.mjs +13 -3
  164. package/.output/server/_routes/api/pi/login/events.mjs +0 -1
  165. package/.output/server/_routes/api/pi/login/respond.mjs +2 -1
  166. package/.output/server/_routes/api/pi/login.mjs +1 -2
  167. package/.output/server/_routes/api/pi/logout.mjs +2 -1
  168. package/.output/server/_routes/api/pi/models.mjs +1 -2
  169. package/.output/server/_routes/api/pi/models_config2.mjs +2 -0
  170. package/.output/server/_routes/api/pi/settings2.mjs +2 -0
  171. package/.output/server/_routes/api/pi/status.mjs +1 -2
  172. package/.output/server/_routes/api/proxy.mjs +19 -1
  173. package/.output/server/_routes/api/sandbox.mjs +26 -0
  174. package/.output/server/_routes/api/sandbox2.mjs +17 -0
  175. package/.output/server/_routes/api/send.mjs +26 -18
  176. package/.output/server/_routes/api/status.mjs +1 -3
  177. package/.output/server/_routes/api/stop.mjs +11 -0
  178. package/.output/server/_routes/api/store/plugins.mjs +75 -0
  179. package/.output/server/_routes/api/store/skills.mjs +11 -0
  180. package/.output/server/_routes/api/tasks2.mjs +3 -2
  181. package/.output/server/_routes/api/telegram/setup.mjs +5 -2
  182. package/.output/server/_routes/api/telegram/status.mjs +1 -2
  183. package/.output/server/_routes/api/terminal2.mjs +2 -1
  184. package/.output/server/_routes/api/tunnel/setup.mjs +4 -2
  185. package/.output/server/_runtime.mjs +1 -2
  186. package/.output/server/_utils.mjs +10 -2
  187. package/.output/server/index.mjs +1 -1
  188. package/.output/server/node_modules/amdefine/amdefine.js +301 -0
  189. package/.output/server/node_modules/amdefine/package.json +16 -0
  190. package/.output/server/node_modules/compressjs/lib/BWT.js +420 -0
  191. package/.output/server/node_modules/compressjs/lib/BWTC.js +234 -0
  192. package/.output/server/node_modules/compressjs/lib/BitStream.js +108 -0
  193. package/.output/server/node_modules/compressjs/lib/Bzip2.js +936 -0
  194. package/.output/server/node_modules/compressjs/lib/CRC32.js +105 -0
  195. package/.output/server/node_modules/compressjs/lib/Context1Model.js +56 -0
  196. package/.output/server/node_modules/compressjs/lib/DefSumModel.js +152 -0
  197. package/.output/server/node_modules/compressjs/lib/DeflateDistanceModel.js +55 -0
  198. package/.output/server/node_modules/compressjs/lib/Dmc.js +197 -0
  199. package/.output/server/node_modules/compressjs/lib/DummyRangeCoder.js +81 -0
  200. package/.output/server/node_modules/compressjs/lib/FenwickModel.js +194 -0
  201. package/.output/server/node_modules/compressjs/lib/Huffman.js +514 -0
  202. package/.output/server/node_modules/compressjs/lib/HuffmanAllocator.js +227 -0
  203. package/.output/server/node_modules/compressjs/lib/LogDistanceModel.js +46 -0
  204. package/.output/server/node_modules/compressjs/lib/Lzjb.js +300 -0
  205. package/.output/server/node_modules/compressjs/lib/LzjbR.js +241 -0
  206. package/.output/server/node_modules/compressjs/lib/Lzp3.js +273 -0
  207. package/.output/server/node_modules/compressjs/lib/MTFModel.js +208 -0
  208. package/.output/server/node_modules/compressjs/lib/NoModel.js +46 -0
  209. package/.output/server/node_modules/compressjs/lib/PPM.js +343 -0
  210. package/.output/server/node_modules/compressjs/lib/RangeCoder.js +238 -0
  211. package/.output/server/node_modules/compressjs/lib/Simple.js +111 -0
  212. package/.output/server/node_modules/compressjs/lib/Stream.js +53 -0
  213. package/.output/server/node_modules/compressjs/lib/Util.js +324 -0
  214. package/.output/server/node_modules/compressjs/lib/freeze.js +14 -0
  215. package/.output/server/node_modules/compressjs/main.js +29 -0
  216. package/.output/server/node_modules/compressjs/package.json +35 -0
  217. package/.output/server/package.json +2 -1
  218. package/README.md +10 -1
  219. package/lib/index.d.mts +1 -0
  220. package/lib/index.mjs +1 -0
  221. package/lib/piclaw.mjs +100 -0
  222. package/lib/utils.mjs +96 -0
  223. package/package.json +16 -11
  224. package/.output/public/assets/defult-CMO6TZ5a.js +0 -1
  225. package/.output/public/assets/index-jdnbJw-M.js +0 -204
  226. package/.output/public/assets/index-ooXrRwgl.css +0 -1
  227. package/.output/server/_chunks/commands.mjs +0 -282
  228. package/.output/server/_chunks/pi.mjs +0 -202
  229. package/.output/server/_chunks/session.mjs +0 -1114
  230. package/.output/server/_libs/@aws-crypto/crc32+[...].mjs +0 -299
  231. package/.output/server/_libs/@aws-sdk/client-bedrock-runtime+[...].mjs +0 -17828
  232. package/.output/server/_libs/@aws-sdk/credential-provider-http+[...].mjs +0 -122
  233. package/.output/server/_libs/@aws-sdk/credential-provider-ini+[...].mjs +0 -417
  234. package/.output/server/_libs/@aws-sdk/credential-provider-process+[...].mjs +0 -54
  235. package/.output/server/_libs/@aws-sdk/credential-provider-sso+[...].mjs +0 -1151
  236. package/.output/server/_libs/@aws-sdk/credential-provider-web-identity+[...].mjs +0 -50
  237. package/.output/server/_libs/@smithy/credential-provider-imds+[...].mjs +0 -369
  238. package/.output/server/_libs/@tootallnate/quickjs-emscripten+[...].mjs +0 -3011
  239. package/.output/server/_libs/_100.mjs +0 -2
  240. package/.output/server/_libs/_101.mjs +0 -2
  241. package/.output/server/_libs/_102.mjs +0 -5
  242. package/.output/server/_libs/_103.mjs +0 -3
  243. package/.output/server/_libs/_104.mjs +0 -2
  244. package/.output/server/_libs/_105.mjs +0 -3
  245. package/.output/server/_libs/_106.mjs +0 -2
  246. package/.output/server/_libs/_107.mjs +0 -2
  247. package/.output/server/_libs/_95.mjs +0 -2
  248. package/.output/server/_libs/_96.mjs +0 -2
  249. package/.output/server/_libs/_97.mjs +0 -2
  250. package/.output/server/_libs/_98.mjs +0 -2
  251. package/.output/server/_libs/_99.mjs +0 -2
  252. package/.output/server/_libs/amdefine.mjs +0 -188
  253. package/.output/server/_libs/ast-types.mjs +0 -2270
  254. package/.output/server/_libs/aws-sdk__nested-clients.mjs +0 -3141
  255. package/.output/server/_libs/basic-ftp.mjs +0 -1906
  256. package/.output/server/_libs/compressjs.mjs +0 -50
  257. package/.output/server/_libs/degenerator+[...].mjs +0 -9964
  258. package/.output/server/_libs/get-uri.mjs +0 -413
  259. package/.output/server/_libs/http-proxy-agent.mjs +0 -123
  260. package/.output/server/_libs/ip-address.mjs +0 -1423
  261. package/.output/server/_libs/lru-cache.mjs +0 -732
  262. package/.output/server/_libs/netmask.mjs +0 -139
  263. package/.output/server/_libs/pac-proxy-agent+[...].mjs +0 -3104
  264. package/.output/server/_libs/proxy-agent+proxy-from-env.mjs +0 -204
  265. package/.output/server/_libs/smithy__core.mjs +0 -192
  266. package/.output/server/node_modules/tslib/modules/index.js +0 -70
  267. package/.output/server/node_modules/tslib/modules/package.json +0 -3
  268. package/.output/server/node_modules/tslib/package.json +0 -47
  269. package/.output/server/node_modules/tslib/tslib.js +0 -484
  270. package/bin/piclaw.mjs +0 -195
@@ -0,0 +1,238 @@
1
+ /* Range Coder. Inspired by rangecod.c from rngcod13.zip from
2
+ * http://www.compressconsult.com/rangecoder/
3
+ * This JavaScript version is:
4
+ * Copyright (c) 2013 C. Scott Ananian.
5
+ */
6
+ if (typeof define !== 'function') { var define = require('amdefine')(module); }
7
+ define([],function(){
8
+
9
+ // Uses 32-bit integer math. Hopefully the JavaScript runtime figures
10
+ // that out. ;)
11
+ // see https://github.com/kripken/emscripten/wiki/LLVM-Types-in-JavaScript
12
+ // for some hints on doing 32-bit unsigned match in JavaScript.
13
+ // One key is the use of ">>>0" to change a signed result to unsigned.
14
+ var CODE_BITS = 32;
15
+ var Top_value = Math.pow(2, CODE_BITS-1);
16
+ var SHIFT_BITS = (CODE_BITS - 9);
17
+ var EXTRA_BITS = ((CODE_BITS-2) % 8 + 1);
18
+ var Bottom_value = (Top_value >>> 8);
19
+
20
+ var MAX_INT = Math.pow(2, CODE_BITS) - 1;
21
+
22
+ /* it is highly recommended that the total frequency count is less */
23
+ /* than 1 << 19 to minimize rounding effects. */
24
+ /* the total frequency count MUST be less than 1<<23 */
25
+
26
+
27
+ var RangeCoder = function(stream) {
28
+ this.low = 0; /* low end of interval */
29
+ this.range = Top_value; /* length of interval */
30
+ this.buffer = 0; /* buffer for input/output */
31
+ this.help = 0; /* bytes_to_follow / intermediate value */
32
+ this.bytecount = 0; /* counter for output bytes */
33
+ this.stream = stream;
34
+ };
35
+
36
+ /* Do the normalization before we need a defined state, instead of
37
+ * after messing it up. This simplifies starting and ending. */
38
+ var enc_normalize = function(rc, outputStream) {
39
+ while (rc.range <= Bottom_value) { /* do we need renormalization? */
40
+ if (rc.low < (0xFF << SHIFT_BITS)) {//no carry possible, so output
41
+ outputStream.writeByte(rc.buffer);
42
+ for (; rc.help; rc.help--)
43
+ outputStream.writeByte(0xFF);
44
+ rc.buffer = (rc.low >>> SHIFT_BITS) & 0xFF;
45
+ } else if (rc.low & Top_value) { /* carry now, no future carry */
46
+ outputStream.writeByte(rc.buffer+1);
47
+ for (; rc.help; rc.help--)
48
+ outputStream.writeByte(0x00);
49
+ rc.buffer = (rc.low >>> SHIFT_BITS) & 0xFF;
50
+ } else {
51
+ rc.help++;
52
+ if (rc.help > MAX_INT)
53
+ throw new Error("Too many bytes outstanding, "+
54
+ "file too large!");
55
+ }
56
+ rc.range = (rc.range << 8) >>> 0;/*ensure result remains positive*/
57
+ rc.low = ((rc.low << 8) & (Top_value - 1)) >>> 0; /* unsigned */
58
+ rc.bytecount++;
59
+ }
60
+ };
61
+
62
+ /* Start the encoder */
63
+ /* c is written as the first byte in the datastream.
64
+ * one could do w/o, but then you have an additional if per output byte */
65
+ RangeCoder.prototype.encodeStart = function(c, initlength) {
66
+ this.low = 0;
67
+ this.range = Top_value;
68
+ this.buffer = c;
69
+ this.help = 0;
70
+ this.bytecount = initlength;
71
+ };
72
+
73
+ /* Encode a symbol using frequencies */
74
+ /* rc is the range coder to be used */
75
+ /* sy_f is the interval length (frequency of the symbol) */
76
+ /* lt_f is the lower end (frequency sum of < symbols) */
77
+ /* tot_f is the total interval length (total frequency sum) */
78
+ /* or (faster): tot_f = (code_value)1<<shift */
79
+ RangeCoder.prototype.encodeFreq = function(sy_f, lt_f, tot_f) {
80
+ enc_normalize(this, this.stream);
81
+ var r = (this.range / tot_f) >>> 0; // note coercion to integer
82
+ var tmp = r * lt_f;
83
+ this.low += tmp;
84
+ if ((lt_f + sy_f) < tot_f) {
85
+ this.range = r * sy_f;
86
+ } else {
87
+ this.range -= tmp;
88
+ }
89
+ };
90
+ RangeCoder.prototype.encodeShift = function(sy_f, lt_f, shift) {
91
+ enc_normalize(this, this.stream);
92
+ var r = this.range >>> shift;
93
+ var tmp = r * lt_f;
94
+ this.low += tmp;
95
+ if ((lt_f + sy_f) >>> shift) {
96
+ this.range -= tmp;
97
+ } else {
98
+ this.range = r * sy_f;
99
+ }
100
+ };
101
+ /* Encode a bit w/o modelling. */
102
+ RangeCoder.prototype.encodeBit = function(b) {
103
+ this.encodeShift(1, b?1:0, 1);
104
+ };
105
+ /* Encode a byte w/o modelling. */
106
+ RangeCoder.prototype.encodeByte = function(b) {
107
+ this.encodeShift(1, b, 8);
108
+ };
109
+ /* Encode a short w/o modelling. */
110
+ RangeCoder.prototype.encodeShort = function(s) {
111
+ this.encodeShift(1, s, 16);
112
+ };
113
+
114
+ /* Finish encoding */
115
+ /* returns number of bytes written */
116
+ RangeCoder.prototype.encodeFinish = function() {
117
+ var outputStream = this.stream;
118
+ enc_normalize(this, outputStream);
119
+ this.bytecount += 5;
120
+ var tmp = this.low >>> SHIFT_BITS;
121
+ if ((this.low & (Bottom_value-1)) >= ((this.bytecount&0xFFFFFF)>>>1)) {
122
+ tmp++;
123
+ }
124
+ if (tmp > 0xFF) { /* we have a carry */
125
+ outputStream.writeByte(this.buffer + 1);
126
+ for (; this.help; this.help--)
127
+ outputStream.writeByte(0x00);
128
+ } else { /* no carry */
129
+ outputStream.writeByte(this.buffer);
130
+ for (; this.help; this.help--)
131
+ outputStream.writeByte(0xFF);
132
+ }
133
+ outputStream.writeByte(tmp & 0xFF);
134
+ // XXX: i'm pretty sure these could be three arbitrary bytes
135
+ // they are consumed by the decoder at the end
136
+ outputStream.writeByte((this.bytecount >>> 16) & 0xFF);
137
+ outputStream.writeByte((this.bytecount >>> 8) & 0xFF);
138
+ outputStream.writeByte((this.bytecount ) & 0xFF);
139
+ return this.bytecount;
140
+ };
141
+
142
+ /* Start the decoder; you need to provide the *second* byte from the
143
+ * datastream. (The first byte was provided to startEncoding and is
144
+ * ignored by the decoder.)
145
+ */
146
+ RangeCoder.prototype.decodeStart = function(skipInitialRead) {
147
+ var c = skipInitialRead ? 0 : this.stream.readByte();
148
+ if (typeof(c) !== 'number' || c < 0) {
149
+ return c; // EOF
150
+ }
151
+ this.buffer = this.stream.readByte();
152
+ this.low = this.buffer >>> (8 - EXTRA_BITS);
153
+ this.range = 1 << EXTRA_BITS;
154
+ return c;
155
+ };
156
+
157
+ var dec_normalize = function(rc, inputStream) {
158
+ while (rc.range <= Bottom_value) {
159
+ rc.low = (rc.low << 8) | ((rc.buffer << EXTRA_BITS) & 0xFF);
160
+ /* rc.low could be negative here; don't fix it quite yet */
161
+ rc.buffer = inputStream.readByte();
162
+ rc.low |= rc.buffer >>> (8-EXTRA_BITS);
163
+ rc.low = rc.low >>> 0; /* fix it now */
164
+ rc.range = (rc.range << 8) >>> 0; /* ensure stays positive */
165
+ }
166
+ };
167
+
168
+ /* Calculate cumulative frequency for next symbol. Does NO update!*/
169
+ /* rc is the range coder to be used */
170
+ /* tot_f is the total frequency */
171
+ /* or: totf is (code_value)1<<shift */
172
+ /* returns the <= cumulative frequency */
173
+ RangeCoder.prototype.decodeCulFreq = function(tot_f) {
174
+ dec_normalize(this, this.stream);
175
+ this.help = (this.range / tot_f) >>> 0; // note coercion to integer
176
+ var tmp = (this.low / this.help) >>> 0; // again
177
+ return (tmp >= tot_f ? tot_f-1 : tmp);
178
+ };
179
+ RangeCoder.prototype.decodeCulShift = function(shift) {
180
+ dec_normalize(this, this.stream);
181
+ this.help = this.range >>> shift;
182
+ var tmp = (this.low / this.help) >>> 0; // coercion to unsigned
183
+ // shift is less than 31, so shift below will remain positive
184
+ return ((tmp>>>shift) ? (1<<shift)-1 : tmp);
185
+ };
186
+
187
+ /* Update decoding state */
188
+ /* rc is the range coder to be used */
189
+ /* sy_f is the interval length (frequency of the symbol) */
190
+ /* lt_f is the lower end (frequency sum of < symbols) */
191
+ /* tot_f is the total interval length (total frequency sum) */
192
+ RangeCoder.prototype.decodeUpdate = function(sy_f, lt_f, tot_f) {
193
+ var tmp = this.help * lt_f; // should not overflow!
194
+ this.low -= tmp;
195
+ if (lt_f + sy_f < tot_f) {
196
+ this.range = (this.help * sy_f);
197
+ } else {
198
+ this.range -= tmp;
199
+ }
200
+ };
201
+
202
+ /* Decode a bit w/o modelling. */
203
+ RangeCoder.prototype.decodeBit = function() {
204
+ var tmp = this.decodeCulShift(1);
205
+ this.decodeUpdate(1, tmp, 1<<1);
206
+ return tmp;
207
+ };
208
+ /* decode a byte w/o modelling */
209
+ RangeCoder.prototype.decodeByte = function() {
210
+ var tmp = this.decodeCulShift(8);
211
+ this.decodeUpdate(1, tmp, 1<<8);
212
+ return tmp;
213
+ };
214
+ /* decode a short w/o modelling */
215
+ RangeCoder.prototype.decodeShort = function() {
216
+ var tmp = this.decodeCulShift(16);
217
+ this.decodeUpdate(1, tmp, 1<<16);
218
+ return tmp;
219
+ };
220
+
221
+ /* Finish decoding */
222
+ RangeCoder.prototype.decodeFinish = function() {
223
+ /* normalize to use up all bytes */
224
+ dec_normalize(this, this.stream);
225
+ };
226
+
227
+ /** Utility functions */
228
+
229
+ // bitstream interface
230
+ RangeCoder.prototype.writeBit = RangeCoder.prototype.encodeBit;
231
+ RangeCoder.prototype.readBit = RangeCoder.prototype.decodeBit;
232
+
233
+ // stream interface
234
+ RangeCoder.prototype.writeByte = RangeCoder.prototype.encodeByte;
235
+ RangeCoder.prototype.readByte = RangeCoder.prototype.decodeByte;
236
+
237
+ return RangeCoder;
238
+ });
@@ -0,0 +1,111 @@
1
+ /* *Very* simple de/compression utility, based on simple_c and simple_d from
2
+ * rngcod13.zip at http://www.compressconsult.com/rangecoder/
3
+ * Really just a demonstration/test of the rangecoder.
4
+ */
5
+ if (typeof define !== 'function') { var define = require('amdefine')(module); }
6
+ define(['./RangeCoder','./Stream','./Util'],function(RangeCoder,Stream,Util){
7
+ var MAX_BLOCK_SIZE = 1<<17;
8
+
9
+ var Simple = Object.create(null);
10
+ Simple.MAGIC = 'smpl';
11
+ Simple.compressFile = Util.compressFileHelper(Simple.MAGIC, function(input, output, size, props, finalByte) {
12
+ var encoder = new RangeCoder(output);
13
+ encoder.encodeStart(finalByte, 1);
14
+
15
+ // read a block
16
+ var block = Util.makeU8Buffer(MAX_BLOCK_SIZE);
17
+ var counts = [];
18
+ var blockLength = 0, sawEOF = false;
19
+
20
+ var readBlock = function() {
21
+ var pos = 0;
22
+ // initialize counts
23
+ for (pos=0; pos < 256; pos++) {
24
+ counts[pos] = 0;
25
+ }
26
+ if (sawEOF) {
27
+ blockLength = 0;
28
+ return;
29
+ }
30
+ for (pos=0; pos < MAX_BLOCK_SIZE; ) {
31
+ var c = input.readByte();
32
+ if (c===Stream.EOF) {
33
+ sawEOF = true;
34
+ break;
35
+ }
36
+ block[pos++] = c;
37
+ counts[c]++;
38
+ // bail if some count reaches maximum
39
+ if (counts[c]===0xFFFF) {
40
+ break;
41
+ }
42
+ }
43
+ blockLength = pos;
44
+ };
45
+
46
+ while (true) {
47
+ var i;
48
+ readBlock();
49
+ if (sawEOF && blockLength===0) {
50
+ break;
51
+ }
52
+ // indicate that there's another block comin'
53
+ encoder.encodeBit(true);
54
+ // write all the statistics
55
+ for (i=0; i<256; i++) {
56
+ encoder.encodeShort(counts[i]);
57
+ }
58
+ // convert counts to cumulative counts
59
+ counts[256] = blockLength;
60
+ for (i=256; i; i--) {
61
+ counts[i-1] = counts[i] - counts[i-1];
62
+ }
63
+ // encode the symbols using the probability table.
64
+ for (i=0; i<blockLength; i++) {
65
+ var ch = block[i];
66
+ encoder.encodeFreq(counts[ch+1]-counts[ch], counts[ch],
67
+ counts[256]);
68
+ }
69
+ }
70
+ // write a stop bit
71
+ encoder.encodeBit(false);
72
+ // done!
73
+ encoder.encodeFinish();
74
+ }, true);
75
+ Simple.decompressFile = Util.decompressFileHelper(Simple.MAGIC, function(input, output, size) {
76
+ var decoder = new RangeCoder(input);
77
+ decoder.decodeStart(true/*we already read the 'free' byte*/);
78
+ while (decoder.decodeBit()) {
79
+ var i, counts = [];
80
+ // read all the statistics
81
+ for (i=0; i<256; i++) {
82
+ counts[i] = decoder.decodeShort();
83
+ }
84
+ // compute cumulative stats & total block size
85
+ var blocksize = 0;
86
+ for (i=0; i<256; i++) {
87
+ var tmp = counts[i];
88
+ counts[i] = blocksize;
89
+ blocksize += tmp;
90
+ }
91
+ counts[256] = blocksize;
92
+
93
+ for (i=0; i<blocksize; i++) {
94
+ var cf = decoder.decodeCulFreq(blocksize);
95
+ // inefficient way to look up the symbol.
96
+ var symbol;
97
+ for (symbol=0; symbol<256; symbol++)
98
+ // careful, there are length-0 ranges
99
+ // (where counts[symbol]===counts[symbol+1])
100
+ if (counts[symbol]<=cf && cf < counts[symbol+1])
101
+ break;
102
+ var ch = symbol;
103
+ decoder.decodeUpdate(counts[symbol+1] - counts[symbol],
104
+ counts[symbol], blocksize);
105
+ output.writeByte(symbol);
106
+ }
107
+ }
108
+ decoder.decodeFinish();
109
+ });
110
+ return Simple;
111
+ });
@@ -0,0 +1,53 @@
1
+ /** Abstract Stream interface, for byte-oriented i/o. */
2
+ if (typeof define !== 'function') { var define = require('amdefine')(module); }
3
+ define(['./freeze'],function(freeze) {
4
+ var EOF = -1;
5
+
6
+ var Stream = function() {
7
+ /* ABSTRACT */
8
+ };
9
+ // you must define one of read / readByte for a readable stream
10
+ Stream.prototype.readByte = function() {
11
+ var buf = [ 0 ];
12
+ var len = this.read(buf, 0, 1);
13
+ if (len===0) { this._eof = true; return EOF; }
14
+ return buf[0];
15
+ };
16
+ Stream.prototype.read = function(buf, bufOffset, length) {
17
+ var ch, bytesRead = 0;
18
+ while (bytesRead < length) {
19
+ ch = this.readByte();
20
+ if (ch === EOF) { this._eof = true; break; }
21
+ buf[bufOffset+(bytesRead++)] = ch;
22
+ }
23
+ return bytesRead;
24
+ };
25
+ // reasonable default implementation of 'eof'
26
+ Stream.prototype.eof = function() { return !!this._eof; };
27
+ // not all readable streams are seekable
28
+ Stream.prototype.seek = function(pos) {
29
+ throw new Error('Stream is not seekable.');
30
+ };
31
+ Stream.prototype.tell = function() {
32
+ throw new Error('Stream is not seekable.');
33
+ };
34
+ // you must define one of write / writeByte for a writable stream
35
+ Stream.prototype.writeByte = function(_byte) {
36
+ var buf = [ _byte ];
37
+ this.write(buf, 0, 1);
38
+ };
39
+ Stream.prototype.write = function(buf, bufOffset, length) {
40
+ var i;
41
+ for (i=0; i<length; i++) {
42
+ this.writeByte(buf[bufOffset + i]);
43
+ }
44
+ return length;
45
+ };
46
+ // flush will happily do nothing if you don't override it.
47
+ Stream.prototype.flush = function() { };
48
+
49
+ // export EOF as a constant.
50
+ Stream.EOF = EOF;
51
+
52
+ return freeze(Stream);
53
+ });