@ssttevee/streamsearch 0.3.0 → 0.4.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 (52) hide show
  1. package/README.md +57 -2
  2. package/lib/index.cjs +29 -265
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.d.ts +13 -9
  5. package/lib/index.mjs +21 -256
  6. package/lib/index.mjs.map +1 -1
  7. package/lib/iterate-chunks-concatted.cjs +15 -0
  8. package/lib/iterate-chunks-concatted.cjs.map +1 -0
  9. package/lib/iterate-chunks-concatted.d.ts +2 -0
  10. package/lib/iterate-chunks-concatted.mjs +13 -0
  11. package/lib/iterate-chunks-concatted.mjs.map +1 -0
  12. package/lib/iterate-chunks.cjs +22 -0
  13. package/lib/iterate-chunks.cjs.map +1 -0
  14. package/lib/iterate-chunks.d.ts +2 -0
  15. package/lib/iterate-chunks.mjs +20 -0
  16. package/lib/iterate-chunks.mjs.map +1 -0
  17. package/lib/iterate-strings.cjs +16 -0
  18. package/lib/iterate-strings.cjs.map +1 -0
  19. package/lib/iterate-strings.d.ts +2 -0
  20. package/lib/iterate-strings.mjs +14 -0
  21. package/lib/iterate-strings.mjs.map +1 -0
  22. package/lib/iterator.cjs +42 -0
  23. package/lib/iterator.cjs.map +1 -0
  24. package/lib/iterator.d.ts +7 -0
  25. package/lib/iterator.mjs +40 -0
  26. package/lib/iterator.mjs.map +1 -0
  27. package/lib/queueable.cjs +55 -0
  28. package/lib/queueable.cjs.map +1 -0
  29. package/lib/queueable.d.ts +11 -11
  30. package/lib/queueable.mjs +53 -0
  31. package/lib/queueable.mjs.map +1 -0
  32. package/lib/readable.cjs +36 -0
  33. package/lib/readable.cjs.map +1 -0
  34. package/lib/readable.d.ts +7 -7
  35. package/lib/readable.mjs +34 -0
  36. package/lib/readable.mjs.map +1 -0
  37. package/lib/search-BXQkEs3p.js +97 -0
  38. package/lib/search-BXQkEs3p.js.map +1 -0
  39. package/lib/search-D_ihawrM.js +108 -0
  40. package/lib/search-D_ihawrM.js.map +1 -0
  41. package/lib/{index.js → search.cjs} +179 -263
  42. package/lib/search.cjs.map +1 -0
  43. package/lib/search.d.ts +13 -14
  44. package/lib/search.mjs +185 -0
  45. package/lib/search.mjs.map +1 -0
  46. package/lib/split.cjs +26 -0
  47. package/lib/split.cjs.map +1 -0
  48. package/lib/split.d.ts +1 -0
  49. package/lib/split.mjs +24 -0
  50. package/lib/split.mjs.map +1 -0
  51. package/package.json +85 -37
  52. package/lib/index.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { StreamSearch } from './search.mjs';
2
+ import 'uint8arrays/concat';
3
+ import 'uint8arrays/from-string';
4
+
5
+ const EOQ = Symbol("End of Queue");
6
+ class QueueableStreamSearch {
7
+ _search;
8
+ _chunksQueue = [];
9
+ _notify;
10
+ _closed = false;
11
+ constructor(needle) {
12
+ this._search = new StreamSearch(needle);
13
+ }
14
+ push(...chunks) {
15
+ if (this._closed) {
16
+ throw new Error("cannot call push after close");
17
+ }
18
+ this._chunksQueue.push(...chunks);
19
+ if (this._notify) {
20
+ this._notify();
21
+ }
22
+ }
23
+ close() {
24
+ if (this._closed) {
25
+ throw new Error("close was already called");
26
+ }
27
+ this._closed = true;
28
+ this._chunksQueue.push(EOQ);
29
+ if (this._notify) {
30
+ this._notify();
31
+ }
32
+ }
33
+ async *[Symbol.asyncIterator]() {
34
+ while (true) {
35
+ let chunk;
36
+ while (!(chunk = this._chunksQueue.shift())) {
37
+ await new Promise((resolve) => (this._notify = resolve));
38
+ this._notify = undefined;
39
+ }
40
+ if (chunk === EOQ) {
41
+ break;
42
+ }
43
+ yield* this._search.feed(chunk);
44
+ }
45
+ const tail = this._search.end();
46
+ if (tail.length) {
47
+ yield tail;
48
+ }
49
+ }
50
+ }
51
+
52
+ export { QueueableStreamSearch };
53
+ //# sourceMappingURL=queueable.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queueable.mjs","sources":["../src/queueable.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAEA,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC;MAErB,qBAAqB,CAAA;AACzB,IAAA,OAAO;IACP,YAAY,GAAmC,EAAE;AACjD,IAAA,OAAO;IACP,OAAO,GAAG,KAAK;AAEvB,IAAA,WAAA,CAAmB,MAA2B,EAAA;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC;IACxC;IAEO,IAAI,CAAC,GAAG,MAAoB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;QAChD;QAEA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACjC,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,EAAE;QACf;IACD;IAEO,KAAK,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC;QAC5C;AAEA,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3B,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,EAAE;QACf;IACD;AAEO,IAAA,QAAQ,MAAM,CAAC,aAAa,CAAC,GAAA;QACnC,OAAO,IAAI,EAAE;AACZ,YAAA,IAAI,KAA0C;AAC9C,YAAA,OAAO,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE;AAC5C,gBAAA,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,MAAM,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AAC9D,gBAAA,IAAI,CAAC,OAAO,GAAG,SAAS;YACzB;AAEA,YAAA,IAAI,KAAK,KAAK,GAAG,EAAE;gBAClB;YACD;YAEA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAChC;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC/B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,MAAM,IAAI;QACX;IACD;AACA;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ var search = require('./search.cjs');
4
+ require('uint8arrays/concat');
5
+ require('uint8arrays/from-string');
6
+
7
+ class ReadableStreamSearch {
8
+ _readableStream;
9
+ _search;
10
+ constructor(needle, _readableStream) {
11
+ this._readableStream = _readableStream;
12
+ this._search = new search.StreamSearch(needle);
13
+ }
14
+ async *[Symbol.asyncIterator]() {
15
+ const reader = this._readableStream.getReader();
16
+ try {
17
+ while (true) {
18
+ const result = await reader.read();
19
+ if (result.done) {
20
+ break;
21
+ }
22
+ yield* this._search.feed(result.value);
23
+ }
24
+ const tail = this._search.end();
25
+ if (tail.length) {
26
+ yield tail;
27
+ }
28
+ }
29
+ finally {
30
+ reader.releaseLock();
31
+ }
32
+ }
33
+ }
34
+
35
+ exports.ReadableStreamSearch = ReadableStreamSearch;
36
+ //# sourceMappingURL=readable.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readable.cjs","sources":["../src/readable.ts"],"sourcesContent":[null],"names":["StreamSearch"],"mappings":";;;;;;MAEa,oBAAoB,CAAA;AAKvB,IAAA,eAAA;AAJD,IAAA,OAAO;IAEf,WAAA,CACC,MAA2B,EACnB,eAA2C,EAAA;QAA3C,IAAA,CAAA,eAAe,GAAf,eAAe;QAEvB,IAAI,CAAC,OAAO,GAAG,IAAIA,mBAAY,CAAC,MAAM,CAAC;IACxC;AAEO,IAAA,QAAQ,MAAM,CAAC,aAAa,CAAC,GAAA;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;AAC/C,QAAA,IAAI;YACH,OAAO,IAAI,EAAE;AACZ,gBAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAClC,gBAAA,IAAI,MAAM,CAAC,IAAI,EAAE;oBAChB;gBACD;AAEA,gBAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC/B,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AAChB,gBAAA,MAAM,IAAI;YACX;QACD;gBAAU;YACT,MAAM,CAAC,WAAW,EAAE;QACrB;IACD;AACA;;;;"}
package/lib/readable.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { Token } from './search';
2
- export declare class ReadableStreamSearch {
3
- private _readableStream;
4
- private _search;
5
- constructor(needle: Uint8Array | string, _readableStream: ReadableStream<Uint8Array>);
6
- [Symbol.asyncIterator](): AsyncIterableIterator<Token>;
7
- }
1
+ import { type Token } from "./search.js";
2
+ export declare class ReadableStreamSearch {
3
+ private _readableStream;
4
+ private _search;
5
+ constructor(needle: Uint8Array | string, _readableStream: ReadableStream<Uint8Array>);
6
+ [Symbol.asyncIterator](): AsyncIterableIterator<Token>;
7
+ }
@@ -0,0 +1,34 @@
1
+ import { StreamSearch } from './search.mjs';
2
+ import 'uint8arrays/concat';
3
+ import 'uint8arrays/from-string';
4
+
5
+ class ReadableStreamSearch {
6
+ _readableStream;
7
+ _search;
8
+ constructor(needle, _readableStream) {
9
+ this._readableStream = _readableStream;
10
+ this._search = new StreamSearch(needle);
11
+ }
12
+ async *[Symbol.asyncIterator]() {
13
+ const reader = this._readableStream.getReader();
14
+ try {
15
+ while (true) {
16
+ const result = await reader.read();
17
+ if (result.done) {
18
+ break;
19
+ }
20
+ yield* this._search.feed(result.value);
21
+ }
22
+ const tail = this._search.end();
23
+ if (tail.length) {
24
+ yield tail;
25
+ }
26
+ }
27
+ finally {
28
+ reader.releaseLock();
29
+ }
30
+ }
31
+ }
32
+
33
+ export { ReadableStreamSearch };
34
+ //# sourceMappingURL=readable.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readable.mjs","sources":["../src/readable.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAEa,oBAAoB,CAAA;AAKvB,IAAA,eAAA;AAJD,IAAA,OAAO;IAEf,WAAA,CACC,MAA2B,EACnB,eAA2C,EAAA;QAA3C,IAAA,CAAA,eAAe,GAAf,eAAe;QAEvB,IAAI,CAAC,OAAO,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC;IACxC;AAEO,IAAA,QAAQ,MAAM,CAAC,aAAa,CAAC,GAAA;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE;AAC/C,QAAA,IAAI;YACH,OAAO,IAAI,EAAE;AACZ,gBAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;AAClC,gBAAA,IAAI,MAAM,CAAC,IAAI,EAAE;oBAChB;gBACD;AAEA,gBAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACvC;YAEA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC/B,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AAChB,gBAAA,MAAM,IAAI;YACX;QACD;gBAAU;YACT,MAAM,CAAC,WAAW,EAAE;QACrB;IACD;AACA;;;;"}
@@ -0,0 +1,97 @@
1
+ import { concat } from "uint8arrays/concat";
2
+ import { fromString } from "uint8arrays/from-string";
3
+
4
+ //#region src/search.ts
5
+ function jsmemcmp(buf1, pos1, buf2, pos2, len) {
6
+ for (let i = 0; i < len; i++) if (buf1[pos1 + i] !== buf2[pos2 + i]) return false;
7
+ return true;
8
+ }
9
+ function createOccurenceTable(s) {
10
+ const table = new Array(256).fill(s.length);
11
+ if (s.length > 1) for (let i = 0; i < s.length - 1; i++) table[s[i]] = s.length - 1 - i;
12
+ return table;
13
+ }
14
+ const MATCH = Symbol("Match");
15
+ var StreamSearch = class {
16
+ _needle;
17
+ _lastChar;
18
+ _occ;
19
+ _lookbehind = new Uint8Array();
20
+ constructor(needle) {
21
+ if (typeof needle === "string") this._needle = needle = fromString(needle);
22
+ else this._needle = needle;
23
+ this._lastChar = needle[needle.length - 1];
24
+ this._occ = createOccurenceTable(needle);
25
+ }
26
+ feed(chunk) {
27
+ let pos = 0;
28
+ let tokens;
29
+ const allTokens = [];
30
+ while (pos !== chunk.length) {
31
+ [pos, ...tokens] = this._feed(chunk, pos);
32
+ allTokens.push(...tokens);
33
+ }
34
+ return allTokens;
35
+ }
36
+ end() {
37
+ const tail = this._lookbehind;
38
+ this._lookbehind = new Uint8Array();
39
+ return tail;
40
+ }
41
+ _feed(data, buf_pos) {
42
+ const tokens = [];
43
+ let pos = -this._lookbehind.length;
44
+ if (pos < 0) {
45
+ while (pos < 0 && pos <= data.length - this._needle.length) {
46
+ const cpos = pos + this._needle.length - 1;
47
+ const ch = cpos < 0 ? this._lookbehind[this._lookbehind.length + cpos] : data[cpos];
48
+ if (ch === this._lastChar && this._memcmp(data, pos, this._needle.length - 1)) {
49
+ if (pos > -this._lookbehind.length) tokens.push(this._lookbehind.subarray(0, this._lookbehind.length + pos));
50
+ tokens.push(MATCH);
51
+ this._lookbehind = new Uint8Array();
52
+ return [pos + this._needle.length, ...tokens];
53
+ } else pos += this._occ[ch];
54
+ }
55
+ if (pos < 0) while (pos < 0 && !this._memcmp(data, pos, data.length - pos)) pos++;
56
+ if (pos >= 0) {
57
+ tokens.push(this._lookbehind);
58
+ this._lookbehind = new Uint8Array();
59
+ } else {
60
+ const bytesToCutOff = this._lookbehind.length + pos;
61
+ if (bytesToCutOff > 0) {
62
+ tokens.push(this._lookbehind.subarray(0, bytesToCutOff));
63
+ this._lookbehind = this._lookbehind.subarray(bytesToCutOff);
64
+ }
65
+ this._lookbehind = concat([this._lookbehind, data]);
66
+ return [data.length, ...tokens];
67
+ }
68
+ }
69
+ pos += buf_pos;
70
+ while (pos <= data.length - this._needle.length) {
71
+ const ch = data[pos + this._needle.length - 1];
72
+ if (ch === this._lastChar && data[pos] === this._needle[0] && jsmemcmp(this._needle, 0, data, pos, this._needle.length - 1)) {
73
+ if (pos > buf_pos) tokens.push(data.subarray(buf_pos, pos));
74
+ tokens.push(MATCH);
75
+ return [pos + this._needle.length, ...tokens];
76
+ } else pos += this._occ[ch];
77
+ }
78
+ if (pos < data.length) {
79
+ while (pos < data.length && (data[pos] !== this._needle[0] || !jsmemcmp(data, pos, this._needle, 0, data.length - pos))) ++pos;
80
+ if (pos < data.length) this._lookbehind = data.subarray(pos);
81
+ }
82
+ if (pos > 0) tokens.push(data.subarray(buf_pos, pos < data.length ? pos : data.length));
83
+ return [data.length, ...tokens];
84
+ }
85
+ _memcmp(data, pos, len) {
86
+ if (pos < 0) {
87
+ if (!jsmemcmp(this._lookbehind, this._lookbehind.length + pos, this._needle, 0, Math.min(-pos, len))) return false;
88
+ if (len < -pos) return true;
89
+ len += pos;
90
+ }
91
+ return jsmemcmp(data, Math.max(0, pos), this._needle, -Math.min(0, pos), len);
92
+ }
93
+ };
94
+
95
+ //#endregion
96
+ export { StreamSearch as n, MATCH as t };
97
+ //# sourceMappingURL=search-BXQkEs3p.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-BXQkEs3p.js","names":[],"sources":["../src/search.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ let uint8arrays_concat = require("uint8arrays/concat");
2
+ let uint8arrays_from_string = require("uint8arrays/from-string");
3
+
4
+ //#region src/search.ts
5
+ function jsmemcmp(buf1, pos1, buf2, pos2, len) {
6
+ for (let i = 0; i < len; i++) if (buf1[pos1 + i] !== buf2[pos2 + i]) return false;
7
+ return true;
8
+ }
9
+ function createOccurenceTable(s) {
10
+ const table = new Array(256).fill(s.length);
11
+ if (s.length > 1) for (let i = 0; i < s.length - 1; i++) table[s[i]] = s.length - 1 - i;
12
+ return table;
13
+ }
14
+ const MATCH = Symbol("Match");
15
+ var StreamSearch = class {
16
+ _needle;
17
+ _lastChar;
18
+ _occ;
19
+ _lookbehind = new Uint8Array();
20
+ constructor(needle) {
21
+ if (typeof needle === "string") this._needle = needle = (0, uint8arrays_from_string.fromString)(needle);
22
+ else this._needle = needle;
23
+ this._lastChar = needle[needle.length - 1];
24
+ this._occ = createOccurenceTable(needle);
25
+ }
26
+ feed(chunk) {
27
+ let pos = 0;
28
+ let tokens;
29
+ const allTokens = [];
30
+ while (pos !== chunk.length) {
31
+ [pos, ...tokens] = this._feed(chunk, pos);
32
+ allTokens.push(...tokens);
33
+ }
34
+ return allTokens;
35
+ }
36
+ end() {
37
+ const tail = this._lookbehind;
38
+ this._lookbehind = new Uint8Array();
39
+ return tail;
40
+ }
41
+ _feed(data, buf_pos) {
42
+ const tokens = [];
43
+ let pos = -this._lookbehind.length;
44
+ if (pos < 0) {
45
+ while (pos < 0 && pos <= data.length - this._needle.length) {
46
+ const cpos = pos + this._needle.length - 1;
47
+ const ch = cpos < 0 ? this._lookbehind[this._lookbehind.length + cpos] : data[cpos];
48
+ if (ch === this._lastChar && this._memcmp(data, pos, this._needle.length - 1)) {
49
+ if (pos > -this._lookbehind.length) tokens.push(this._lookbehind.subarray(0, this._lookbehind.length + pos));
50
+ tokens.push(MATCH);
51
+ this._lookbehind = new Uint8Array();
52
+ return [pos + this._needle.length, ...tokens];
53
+ } else pos += this._occ[ch];
54
+ }
55
+ if (pos < 0) while (pos < 0 && !this._memcmp(data, pos, data.length - pos)) pos++;
56
+ if (pos >= 0) {
57
+ tokens.push(this._lookbehind);
58
+ this._lookbehind = new Uint8Array();
59
+ } else {
60
+ const bytesToCutOff = this._lookbehind.length + pos;
61
+ if (bytesToCutOff > 0) {
62
+ tokens.push(this._lookbehind.subarray(0, bytesToCutOff));
63
+ this._lookbehind = this._lookbehind.subarray(bytesToCutOff);
64
+ }
65
+ this._lookbehind = (0, uint8arrays_concat.concat)([this._lookbehind, data]);
66
+ return [data.length, ...tokens];
67
+ }
68
+ }
69
+ pos += buf_pos;
70
+ while (pos <= data.length - this._needle.length) {
71
+ const ch = data[pos + this._needle.length - 1];
72
+ if (ch === this._lastChar && data[pos] === this._needle[0] && jsmemcmp(this._needle, 0, data, pos, this._needle.length - 1)) {
73
+ if (pos > buf_pos) tokens.push(data.subarray(buf_pos, pos));
74
+ tokens.push(MATCH);
75
+ return [pos + this._needle.length, ...tokens];
76
+ } else pos += this._occ[ch];
77
+ }
78
+ if (pos < data.length) {
79
+ while (pos < data.length && (data[pos] !== this._needle[0] || !jsmemcmp(data, pos, this._needle, 0, data.length - pos))) ++pos;
80
+ if (pos < data.length) this._lookbehind = data.subarray(pos);
81
+ }
82
+ if (pos > 0) tokens.push(data.subarray(buf_pos, pos < data.length ? pos : data.length));
83
+ return [data.length, ...tokens];
84
+ }
85
+ _memcmp(data, pos, len) {
86
+ if (pos < 0) {
87
+ if (!jsmemcmp(this._lookbehind, this._lookbehind.length + pos, this._needle, 0, Math.min(-pos, len))) return false;
88
+ if (len < -pos) return true;
89
+ len += pos;
90
+ }
91
+ return jsmemcmp(data, Math.max(0, pos), this._needle, -Math.min(0, pos), len);
92
+ }
93
+ };
94
+
95
+ //#endregion
96
+ Object.defineProperty(exports, 'MATCH', {
97
+ enumerable: true,
98
+ get: function () {
99
+ return MATCH;
100
+ }
101
+ });
102
+ Object.defineProperty(exports, 'StreamSearch', {
103
+ enumerable: true,
104
+ get: function () {
105
+ return StreamSearch;
106
+ }
107
+ });
108
+ //# sourceMappingURL=search-D_ihawrM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-D_ihawrM.js","names":[],"sources":["../src/search.ts"],"sourcesContent":[],"mappings":"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"}