@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.
- package/README.md +57 -2
- package/lib/index.cjs +29 -265
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.ts +13 -9
- package/lib/index.mjs +21 -256
- package/lib/index.mjs.map +1 -1
- package/lib/iterate-chunks-concatted.cjs +15 -0
- package/lib/iterate-chunks-concatted.cjs.map +1 -0
- package/lib/iterate-chunks-concatted.d.ts +2 -0
- package/lib/iterate-chunks-concatted.mjs +13 -0
- package/lib/iterate-chunks-concatted.mjs.map +1 -0
- package/lib/iterate-chunks.cjs +22 -0
- package/lib/iterate-chunks.cjs.map +1 -0
- package/lib/iterate-chunks.d.ts +2 -0
- package/lib/iterate-chunks.mjs +20 -0
- package/lib/iterate-chunks.mjs.map +1 -0
- package/lib/iterate-strings.cjs +16 -0
- package/lib/iterate-strings.cjs.map +1 -0
- package/lib/iterate-strings.d.ts +2 -0
- package/lib/iterate-strings.mjs +14 -0
- package/lib/iterate-strings.mjs.map +1 -0
- package/lib/iterator.cjs +42 -0
- package/lib/iterator.cjs.map +1 -0
- package/lib/iterator.d.ts +7 -0
- package/lib/iterator.mjs +40 -0
- package/lib/iterator.mjs.map +1 -0
- package/lib/queueable.cjs +55 -0
- package/lib/queueable.cjs.map +1 -0
- package/lib/queueable.d.ts +11 -11
- package/lib/queueable.mjs +53 -0
- package/lib/queueable.mjs.map +1 -0
- package/lib/readable.cjs +36 -0
- package/lib/readable.cjs.map +1 -0
- package/lib/readable.d.ts +7 -7
- package/lib/readable.mjs +34 -0
- package/lib/readable.mjs.map +1 -0
- package/lib/search-BXQkEs3p.js +97 -0
- package/lib/search-BXQkEs3p.js.map +1 -0
- package/lib/search-D_ihawrM.js +108 -0
- package/lib/search-D_ihawrM.js.map +1 -0
- package/lib/{index.js → search.cjs} +179 -263
- package/lib/search.cjs.map +1 -0
- package/lib/search.d.ts +13 -14
- package/lib/search.mjs +185 -0
- package/lib/search.mjs.map +1 -0
- package/lib/split.cjs +26 -0
- package/lib/split.cjs.map +1 -0
- package/lib/split.d.ts +1 -0
- package/lib/split.mjs +24 -0
- package/lib/split.mjs.map +1 -0
- package/package.json +85 -37
- 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;;;;"}
|
package/lib/readable.cjs
ADDED
|
@@ -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
|
|
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
|
+
}
|
package/lib/readable.mjs
ADDED
|
@@ -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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"}
|