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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/defult-D5RLDUrI.js +1 -0
- package/.output/public/assets/{dist-CMBqBOCp.js → dist-BH_oa-kv.js} +1 -1
- package/.output/public/assets/index-7JvURuHy.js +204 -0
- package/.output/public/assets/index-K43slwjJ.css +1 -0
- package/.output/public/index.html +11 -2
- package/.output/server/_...path_.get.mjs +16 -0
- package/.output/server/_chunks/app.mjs +261 -181
- package/.output/server/_chunks/browser.mjs +4 -1
- package/.output/server/_chunks/config.mjs +4 -0
- package/.output/server/_chunks/db.mjs +32 -28
- package/.output/server/_chunks/device-bus.mjs +123 -0
- package/.output/server/_chunks/dummy.mjs +1 -1
- package/.output/server/_chunks/logger.mjs +23 -0
- package/.output/server/_chunks/login.mjs +1 -1
- package/.output/server/_chunks/notes.mjs +1 -3
- package/.output/server/_chunks/renderer-template.mjs +1 -1
- package/.output/server/_chunks/sandbox.mjs +217 -0
- package/.output/server/_chunks/server.mjs +2302 -122
- package/.output/server/_chunks/terminal.mjs +63 -8
- package/.output/server/_chunks/uploads.mjs +60 -0
- package/.output/server/_chunks/virtual.mjs +192 -54
- package/.output/server/_id_.delete.mjs +5 -2
- package/.output/server/_id_.patch.mjs +2 -0
- package/.output/server/_id_2.delete.mjs +8 -0
- package/.output/server/_jid_.delete.mjs +5 -2
- package/.output/server/_jid_.patch.mjs +37 -4
- package/.output/server/_jid_2.delete.mjs +5 -2
- package/.output/server/_libs/@acemir/cssom+[...].mjs +2269 -1137
- package/.output/server/_libs/@google/genai.mjs +337 -273
- package/.output/server/_libs/@mariozechner/pi-agent-core+[...].mjs +381 -2073
- package/.output/server/_libs/@mariozechner/pi-coding-agent+[...].mjs +231 -131
- package/.output/server/_libs/_.mjs +3 -2
- package/.output/server/_libs/_10.mjs +2 -4
- package/.output/server/_libs/_11.mjs +2 -4
- package/.output/server/_libs/_12.mjs +2 -3
- package/.output/server/_libs/_13.mjs +2 -3
- package/.output/server/_libs/_14.mjs +2 -4
- package/.output/server/_libs/_15.mjs +2 -4
- package/.output/server/_libs/_16.mjs +2 -3
- package/.output/server/_libs/_17.mjs +2 -4
- package/.output/server/_libs/_18.mjs +2 -2
- package/.output/server/_libs/_19.mjs +2 -2
- package/.output/server/_libs/_2.mjs +3 -3
- package/.output/server/_libs/_20.mjs +2 -2
- package/.output/server/_libs/_21.mjs +2 -2
- package/.output/server/_libs/_22.mjs +2 -2
- package/.output/server/_libs/_23.mjs +2 -2
- package/.output/server/_libs/_24.mjs +2 -2
- package/.output/server/_libs/_25.mjs +2 -2
- package/.output/server/_libs/_26.mjs +2 -2
- package/.output/server/_libs/_27.mjs +2 -2
- package/.output/server/_libs/_28.mjs +2 -2
- package/.output/server/_libs/_29.mjs +2 -2
- package/.output/server/_libs/_3.mjs +3 -3
- package/.output/server/_libs/_30.mjs +2 -2
- package/.output/server/_libs/_31.mjs +2 -2
- package/.output/server/_libs/_32.mjs +2 -2
- package/.output/server/_libs/_33.mjs +2 -2
- package/.output/server/_libs/_34.mjs +2 -2
- package/.output/server/_libs/_35.mjs +2 -2
- package/.output/server/_libs/_36.mjs +2 -2
- package/.output/server/_libs/_37.mjs +2 -2
- package/.output/server/_libs/_38.mjs +2 -2
- package/.output/server/_libs/_39.mjs +2 -2
- package/.output/server/_libs/_4.mjs +4 -3
- package/.output/server/_libs/_40.mjs +2 -2
- package/.output/server/_libs/_41.mjs +2 -2
- package/.output/server/_libs/_42.mjs +2 -2
- package/.output/server/_libs/_43.mjs +2 -2
- package/.output/server/_libs/_44.mjs +2 -2
- package/.output/server/_libs/_45.mjs +2 -2
- package/.output/server/_libs/_46.mjs +2 -2
- package/.output/server/_libs/_47.mjs +2 -2
- package/.output/server/_libs/_48.mjs +2 -2
- package/.output/server/_libs/_49.mjs +2 -2
- package/.output/server/_libs/_5.mjs +2 -3
- package/.output/server/_libs/_50.mjs +2 -2
- package/.output/server/_libs/_51.mjs +2 -2
- package/.output/server/_libs/_52.mjs +2 -2
- package/.output/server/_libs/_53.mjs +2 -2
- package/.output/server/_libs/_54.mjs +2 -2
- package/.output/server/_libs/_55.mjs +2 -2
- package/.output/server/_libs/_56.mjs +2 -2
- package/.output/server/_libs/_57.mjs +2 -2
- package/.output/server/_libs/_58.mjs +2 -2
- package/.output/server/_libs/_59.mjs +2 -2
- package/.output/server/_libs/_6.mjs +2 -3
- package/.output/server/_libs/_60.mjs +2 -2
- package/.output/server/_libs/_61.mjs +2 -2
- package/.output/server/_libs/_62.mjs +2 -2
- package/.output/server/_libs/_63.mjs +2 -2
- package/.output/server/_libs/_64.mjs +2 -2
- package/.output/server/_libs/_65.mjs +2 -2
- package/.output/server/_libs/_66.mjs +2 -2
- package/.output/server/_libs/_67.mjs +2 -2
- package/.output/server/_libs/_68.mjs +2 -2
- package/.output/server/_libs/_69.mjs +2 -2
- package/.output/server/_libs/_7.mjs +2 -5
- package/.output/server/_libs/_70.mjs +2 -2
- package/.output/server/_libs/_71.mjs +2 -2
- package/.output/server/_libs/_72.mjs +2 -2
- package/.output/server/_libs/_73.mjs +2 -2
- package/.output/server/_libs/_74.mjs +2 -2
- package/.output/server/_libs/_75.mjs +2 -2
- package/.output/server/_libs/_76.mjs +2 -2
- package/.output/server/_libs/_77.mjs +2 -2
- package/.output/server/_libs/_78.mjs +2 -2
- package/.output/server/_libs/_79.mjs +2 -2
- package/.output/server/_libs/_8.mjs +2 -3
- package/.output/server/_libs/_80.mjs +2 -2
- package/.output/server/_libs/_81.mjs +2 -2
- package/.output/server/_libs/_82.mjs +2 -2
- package/.output/server/_libs/_83.mjs +2 -2
- package/.output/server/_libs/_84.mjs +2 -2
- package/.output/server/_libs/_85.mjs +2 -2
- package/.output/server/_libs/_86.mjs +2 -2
- package/.output/server/_libs/_87.mjs +2 -2
- package/.output/server/_libs/_88.mjs +2 -2
- package/.output/server/_libs/_89.mjs +2 -2
- package/.output/server/_libs/_9.mjs +2 -4
- package/.output/server/_libs/_90.mjs +5 -2
- package/.output/server/_libs/_91.mjs +3 -2
- package/.output/server/_libs/_92.mjs +2 -2
- package/.output/server/_libs/_93.mjs +2 -2
- package/.output/server/_libs/_94.mjs +2 -2
- package/.output/server/_libs/agent-base.mjs +1 -1
- package/.output/server/_libs/cheerio+[...].mjs +1 -1
- package/.output/server/_libs/data-uri-to-buffer.mjs +2 -67
- package/.output/server/_libs/data-urls+[...].mjs +1 -1
- package/.output/server/_libs/diff.mjs +1 -1
- package/.output/server/_libs/exodus__bytes.mjs +99 -81
- package/.output/server/_libs/fetch-blob+node-domexception.mjs +1 -1
- package/.output/server/_libs/h3+rou3+srvx.mjs +34 -4
- package/.output/server/_libs/html-encoding-sniffer.mjs +1 -1
- package/.output/server/_libs/https-proxy-agent.mjs +2 -2
- package/.output/server/_libs/jsdom.mjs +1 -1
- package/.output/server/_libs/just-bash+[...].mjs +4676 -3916
- package/.output/server/_libs/mariozechner__jiti.mjs +1 -1
- package/.output/server/_libs/mariozechner__pi-ai.mjs +1472 -0
- package/.output/server/_libs/md4x.mjs +1 -1
- package/.output/server/_libs/mime.mjs +838 -1
- package/.output/server/_libs/node-fetch.mjs +4 -4
- package/.output/server/_libs/node-liblzma.mjs +1 -1
- package/.output/server/_libs/silvia-odwyer__photon-node.mjs +1 -1
- package/.output/server/_routes/api/auth/approve.mjs +2 -0
- package/.output/server/_routes/api/auth/revoke.mjs +2 -0
- package/.output/server/_routes/api/auth/status.mjs +25 -6
- package/.output/server/_routes/api/browser2.mjs +1 -1
- package/.output/server/_routes/api/config2.mjs +2 -0
- package/.output/server/_routes/api/device_events.mjs +36 -0
- package/.output/server/_routes/api/files/groups.mjs +1 -2
- package/.output/server/_routes/api/files/raw.mjs +1 -1
- package/.output/server/_routes/api/groups.mjs +5 -3
- package/.output/server/_routes/api/groups2.mjs +18 -6
- package/.output/server/_routes/api/health.mjs +1 -2
- package/.output/server/_routes/api/messages.mjs +7 -1
- package/.output/server/_routes/api/notes/delete.mjs +4 -1
- package/.output/server/_routes/api/notes/write.mjs +2 -0
- package/.output/server/_routes/api/ntfy/setup.mjs +8 -0
- package/.output/server/_routes/api/pi/apikey.mjs +3 -2
- package/.output/server/_routes/api/pi/apikey_providers.mjs +1 -2
- package/.output/server/_routes/api/pi/commands.mjs +13 -3
- package/.output/server/_routes/api/pi/login/events.mjs +0 -1
- package/.output/server/_routes/api/pi/login/respond.mjs +2 -1
- package/.output/server/_routes/api/pi/login.mjs +1 -2
- package/.output/server/_routes/api/pi/logout.mjs +2 -1
- package/.output/server/_routes/api/pi/models.mjs +1 -2
- package/.output/server/_routes/api/pi/models_config2.mjs +2 -0
- package/.output/server/_routes/api/pi/settings2.mjs +2 -0
- package/.output/server/_routes/api/pi/status.mjs +1 -2
- package/.output/server/_routes/api/proxy.mjs +19 -1
- package/.output/server/_routes/api/sandbox.mjs +26 -0
- package/.output/server/_routes/api/sandbox2.mjs +17 -0
- package/.output/server/_routes/api/send.mjs +26 -18
- package/.output/server/_routes/api/status.mjs +1 -3
- package/.output/server/_routes/api/stop.mjs +11 -0
- package/.output/server/_routes/api/store/plugins.mjs +75 -0
- package/.output/server/_routes/api/store/skills.mjs +11 -0
- package/.output/server/_routes/api/tasks2.mjs +3 -2
- package/.output/server/_routes/api/telegram/setup.mjs +5 -2
- package/.output/server/_routes/api/telegram/status.mjs +1 -2
- package/.output/server/_routes/api/terminal2.mjs +2 -1
- package/.output/server/_routes/api/tunnel/setup.mjs +4 -2
- package/.output/server/_runtime.mjs +1 -2
- package/.output/server/_utils.mjs +10 -2
- package/.output/server/index.mjs +1 -1
- package/.output/server/node_modules/amdefine/amdefine.js +301 -0
- package/.output/server/node_modules/amdefine/package.json +16 -0
- package/.output/server/node_modules/compressjs/lib/BWT.js +420 -0
- package/.output/server/node_modules/compressjs/lib/BWTC.js +234 -0
- package/.output/server/node_modules/compressjs/lib/BitStream.js +108 -0
- package/.output/server/node_modules/compressjs/lib/Bzip2.js +936 -0
- package/.output/server/node_modules/compressjs/lib/CRC32.js +105 -0
- package/.output/server/node_modules/compressjs/lib/Context1Model.js +56 -0
- package/.output/server/node_modules/compressjs/lib/DefSumModel.js +152 -0
- package/.output/server/node_modules/compressjs/lib/DeflateDistanceModel.js +55 -0
- package/.output/server/node_modules/compressjs/lib/Dmc.js +197 -0
- package/.output/server/node_modules/compressjs/lib/DummyRangeCoder.js +81 -0
- package/.output/server/node_modules/compressjs/lib/FenwickModel.js +194 -0
- package/.output/server/node_modules/compressjs/lib/Huffman.js +514 -0
- package/.output/server/node_modules/compressjs/lib/HuffmanAllocator.js +227 -0
- package/.output/server/node_modules/compressjs/lib/LogDistanceModel.js +46 -0
- package/.output/server/node_modules/compressjs/lib/Lzjb.js +300 -0
- package/.output/server/node_modules/compressjs/lib/LzjbR.js +241 -0
- package/.output/server/node_modules/compressjs/lib/Lzp3.js +273 -0
- package/.output/server/node_modules/compressjs/lib/MTFModel.js +208 -0
- package/.output/server/node_modules/compressjs/lib/NoModel.js +46 -0
- package/.output/server/node_modules/compressjs/lib/PPM.js +343 -0
- package/.output/server/node_modules/compressjs/lib/RangeCoder.js +238 -0
- package/.output/server/node_modules/compressjs/lib/Simple.js +111 -0
- package/.output/server/node_modules/compressjs/lib/Stream.js +53 -0
- package/.output/server/node_modules/compressjs/lib/Util.js +324 -0
- package/.output/server/node_modules/compressjs/lib/freeze.js +14 -0
- package/.output/server/node_modules/compressjs/main.js +29 -0
- package/.output/server/node_modules/compressjs/package.json +35 -0
- package/.output/server/package.json +2 -1
- package/README.md +10 -1
- package/lib/index.d.mts +1 -0
- package/lib/index.mjs +1 -0
- package/lib/piclaw.mjs +100 -0
- package/lib/utils.mjs +96 -0
- package/package.json +16 -11
- package/.output/public/assets/defult-CMO6TZ5a.js +0 -1
- package/.output/public/assets/index-jdnbJw-M.js +0 -204
- package/.output/public/assets/index-ooXrRwgl.css +0 -1
- package/.output/server/_chunks/commands.mjs +0 -282
- package/.output/server/_chunks/pi.mjs +0 -202
- package/.output/server/_chunks/session.mjs +0 -1114
- package/.output/server/_libs/@aws-crypto/crc32+[...].mjs +0 -299
- package/.output/server/_libs/@aws-sdk/client-bedrock-runtime+[...].mjs +0 -17828
- package/.output/server/_libs/@aws-sdk/credential-provider-http+[...].mjs +0 -122
- package/.output/server/_libs/@aws-sdk/credential-provider-ini+[...].mjs +0 -417
- package/.output/server/_libs/@aws-sdk/credential-provider-process+[...].mjs +0 -54
- package/.output/server/_libs/@aws-sdk/credential-provider-sso+[...].mjs +0 -1151
- package/.output/server/_libs/@aws-sdk/credential-provider-web-identity+[...].mjs +0 -50
- package/.output/server/_libs/@smithy/credential-provider-imds+[...].mjs +0 -369
- package/.output/server/_libs/@tootallnate/quickjs-emscripten+[...].mjs +0 -3011
- package/.output/server/_libs/_100.mjs +0 -2
- package/.output/server/_libs/_101.mjs +0 -2
- package/.output/server/_libs/_102.mjs +0 -5
- package/.output/server/_libs/_103.mjs +0 -3
- package/.output/server/_libs/_104.mjs +0 -2
- package/.output/server/_libs/_105.mjs +0 -3
- package/.output/server/_libs/_106.mjs +0 -2
- package/.output/server/_libs/_107.mjs +0 -2
- package/.output/server/_libs/_95.mjs +0 -2
- package/.output/server/_libs/_96.mjs +0 -2
- package/.output/server/_libs/_97.mjs +0 -2
- package/.output/server/_libs/_98.mjs +0 -2
- package/.output/server/_libs/_99.mjs +0 -2
- package/.output/server/_libs/amdefine.mjs +0 -188
- package/.output/server/_libs/ast-types.mjs +0 -2270
- package/.output/server/_libs/aws-sdk__nested-clients.mjs +0 -3141
- package/.output/server/_libs/basic-ftp.mjs +0 -1906
- package/.output/server/_libs/compressjs.mjs +0 -50
- package/.output/server/_libs/degenerator+[...].mjs +0 -9964
- package/.output/server/_libs/get-uri.mjs +0 -413
- package/.output/server/_libs/http-proxy-agent.mjs +0 -123
- package/.output/server/_libs/ip-address.mjs +0 -1423
- package/.output/server/_libs/lru-cache.mjs +0 -732
- package/.output/server/_libs/netmask.mjs +0 -139
- package/.output/server/_libs/pac-proxy-agent+[...].mjs +0 -3104
- package/.output/server/_libs/proxy-agent+proxy-from-env.mjs +0 -204
- package/.output/server/_libs/smithy__core.mjs +0 -192
- package/.output/server/node_modules/tslib/modules/index.js +0 -70
- package/.output/server/node_modules/tslib/modules/package.json +0 -3
- package/.output/server/node_modules/tslib/package.json +0 -47
- package/.output/server/node_modules/tslib/tslib.js +0 -484
- 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
|
+
});
|