@swagger-api/apidom-parser-adapter-yaml-1-2 1.8.0 → 1.10.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swagger-api/apidom-parser-adapter-yaml-1-2",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
4
4
  "description": "Parser adapter for parsing YAML documents into base namespace.",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -51,9 +51,9 @@
51
51
  "license": "Apache-2.0",
52
52
  "dependencies": {
53
53
  "@babel/runtime-corejs3": "^7.26.10",
54
- "@swagger-api/apidom-ast": "^1.8.0",
55
- "@swagger-api/apidom-core": "^1.8.0",
56
- "@swagger-api/apidom-error": "^1.8.0",
54
+ "@swagger-api/apidom-ast": "^1.10.0",
55
+ "@swagger-api/apidom-core": "^1.10.0",
56
+ "@swagger-api/apidom-error": "^1.10.0",
57
57
  "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1",
58
58
  "@types/ramda": "~0.30.0",
59
59
  "ramda": "~0.30.0",
@@ -75,5 +75,5 @@
75
75
  "README.md",
76
76
  "CHANGELOG.md"
77
77
  ],
78
- "gitHead": "1dd54ab78366b9936cdd0422949093b93e958ab7"
78
+ "gitHead": "c72e92fc541b7df2b92335a0f2df147eb7b9b945"
79
79
  }
@@ -14,13 +14,16 @@ exports.namespace = _adapter.namespace;
14
14
  * @public
15
15
  */
16
16
  const detect = async source => {
17
+ let cst = null;
17
18
  try {
18
- const cst = await (0, _browser.default)(source);
19
- const isError = !cst.rootNode.isError;
20
- cst.delete();
21
- return isError;
19
+ cst = await (0, _browser.default)(source);
20
+ return !cst.rootNode.isError;
22
21
  } catch {
23
22
  return false;
23
+ } finally {
24
+ if (cst !== null) {
25
+ cst.delete();
26
+ }
24
27
  }
25
28
  };
26
29
 
@@ -38,11 +41,16 @@ exports.detect = detect;
38
41
  const parse = async (source, {
39
42
  sourceMap = false
40
43
  } = {}) => {
41
- const cst = await (0, _browser.default)(source);
42
- const syntacticAnalysisResult = (0, _index.default)(cst, {
43
- sourceMap
44
- });
45
- cst.delete();
46
- return syntacticAnalysisResult;
44
+ let cst = null;
45
+ try {
46
+ cst = await (0, _browser.default)(source);
47
+ return (0, _index.default)(cst, {
48
+ sourceMap
49
+ });
50
+ } finally {
51
+ if (cst !== null) {
52
+ cst.delete();
53
+ }
54
+ }
47
55
  };
48
56
  exports.parse = parse;
@@ -7,13 +7,16 @@ export { lexicalAnalysis, syntacticAnalysis };
7
7
  * @public
8
8
  */
9
9
  export const detect = async source => {
10
+ let cst = null;
10
11
  try {
11
- const cst = await lexicalAnalysis(source);
12
- const isError = !cst.rootNode.isError;
13
- cst.delete();
14
- return isError;
12
+ cst = await lexicalAnalysis(source);
13
+ return !cst.rootNode.isError;
15
14
  } catch {
16
15
  return false;
16
+ } finally {
17
+ if (cst !== null) {
18
+ cst.delete();
19
+ }
17
20
  }
18
21
  };
19
22
 
@@ -31,10 +34,15 @@ export const detect = async source => {
31
34
  export const parse = async (source, {
32
35
  sourceMap = false
33
36
  } = {}) => {
34
- const cst = await lexicalAnalysis(source);
35
- const syntacticAnalysisResult = syntacticAnalysis(cst, {
36
- sourceMap
37
- });
38
- cst.delete();
39
- return syntacticAnalysisResult;
37
+ let cst = null;
38
+ try {
39
+ cst = await lexicalAnalysis(source);
40
+ return syntacticAnalysis(cst, {
41
+ sourceMap
42
+ });
43
+ } finally {
44
+ if (cst !== null) {
45
+ cst.delete();
46
+ }
47
+ }
40
48
  };
@@ -14,11 +14,13 @@ exports.namespace = _adapter.namespace;
14
14
  * @public
15
15
  */
16
16
  const detect = async source => {
17
+ const cst = await (0, _node.default)(source);
17
18
  try {
18
- const cst = await (0, _node.default)(source);
19
19
  return !cst.rootNode.isError;
20
20
  } catch {
21
21
  return false;
22
+ } finally {
23
+ cst.delete();
22
24
  }
23
25
  };
24
26
 
@@ -37,8 +39,12 @@ const parse = async (source, {
37
39
  sourceMap = false
38
40
  } = {}) => {
39
41
  const cst = await (0, _node.default)(source);
40
- return (0, _index.default)(cst, {
41
- sourceMap
42
- });
42
+ try {
43
+ return (0, _index.default)(cst, {
44
+ sourceMap
45
+ });
46
+ } finally {
47
+ cst.delete();
48
+ }
43
49
  };
44
50
  exports.parse = parse;
@@ -7,11 +7,13 @@ export { lexicalAnalysis, syntacticAnalysis };
7
7
  * @public
8
8
  */
9
9
  export const detect = async source => {
10
+ const cst = await lexicalAnalysis(source);
10
11
  try {
11
- const cst = await lexicalAnalysis(source);
12
12
  return !cst.rootNode.isError;
13
13
  } catch {
14
14
  return false;
15
+ } finally {
16
+ cst.delete();
15
17
  }
16
18
  };
17
19
 
@@ -30,7 +32,11 @@ export const parse = async (source, {
30
32
  sourceMap = false
31
33
  } = {}) => {
32
34
  const cst = await lexicalAnalysis(source);
33
- return syntacticAnalysis(cst, {
34
- sourceMap
35
- });
35
+ try {
36
+ return syntacticAnalysis(cst, {
37
+ sourceMap
38
+ });
39
+ } finally {
40
+ cst.delete();
41
+ }
36
42
  };
@@ -7,7 +7,8 @@ var _webTreeSitter = _interopRequireDefault(require("web-tree-sitter"));
7
7
  var _apidomError = require("@swagger-api/apidom-error");
8
8
  let parser = null;
9
9
  let parserInitLock = null;
10
- let currentTree = null;
10
+ const activeTrees = new Set();
11
+ const MAX_ACTIVE_TREES = 5;
11
12
  const createAnalyze = treeSitterYaml => async source => {
12
13
  if (parser === null && parserInitLock === null) {
13
14
  // acquire lock
@@ -27,8 +28,27 @@ const createAnalyze = treeSitterYaml => async source => {
27
28
  if (parser === null) {
28
29
  throw new _apidomError.ApiDOMError('Error while initializing web-tree-sitter and loading tree-sitter-yaml grammar.');
29
30
  }
30
- currentTree = parser.parse(source);
31
+
32
+ // prevent WASM OOM during concurrency spikes by evicting oldest trees
33
+ // when the pool exceeds threshold; tree.delete() is idempotent so
34
+ // callers that still hold a reference can safely call delete() again
35
+ if (activeTrees.size >= MAX_ACTIVE_TREES) {
36
+ const treesToEvict = [...activeTrees];
37
+ activeTrees.clear();
38
+ for (const oldTree of treesToEvict) {
39
+ oldTree.delete();
40
+ }
41
+ }
42
+ const tree = parser.parse(source);
43
+ activeTrees.add(tree);
44
+
45
+ // remove from tracking when caller deletes
46
+ const originalDelete = tree.delete;
47
+ tree.delete = function deleteAndUntrack() {
48
+ activeTrees.delete(this);
49
+ originalDelete.call(this);
50
+ };
31
51
  parser.reset();
32
- return currentTree;
52
+ return tree;
33
53
  };
34
54
  var _default = exports.default = createAnalyze;
@@ -2,7 +2,8 @@ import Parser from 'web-tree-sitter';
2
2
  import { ApiDOMError } from '@swagger-api/apidom-error';
3
3
  let parser = null;
4
4
  let parserInitLock = null;
5
- let currentTree = null;
5
+ const activeTrees = new Set();
6
+ const MAX_ACTIVE_TREES = 5;
6
7
  const createAnalyze = treeSitterYaml => async source => {
7
8
  if (parser === null && parserInitLock === null) {
8
9
  // acquire lock
@@ -22,8 +23,27 @@ const createAnalyze = treeSitterYaml => async source => {
22
23
  if (parser === null) {
23
24
  throw new ApiDOMError('Error while initializing web-tree-sitter and loading tree-sitter-yaml grammar.');
24
25
  }
25
- currentTree = parser.parse(source);
26
+
27
+ // prevent WASM OOM during concurrency spikes by evicting oldest trees
28
+ // when the pool exceeds threshold; tree.delete() is idempotent so
29
+ // callers that still hold a reference can safely call delete() again
30
+ if (activeTrees.size >= MAX_ACTIVE_TREES) {
31
+ const treesToEvict = [...activeTrees];
32
+ activeTrees.clear();
33
+ for (const oldTree of treesToEvict) {
34
+ oldTree.delete();
35
+ }
36
+ }
37
+ const tree = parser.parse(source);
38
+ activeTrees.add(tree);
39
+
40
+ // remove from tracking when caller deletes
41
+ const originalDelete = tree.delete;
42
+ tree.delete = function deleteAndUntrack() {
43
+ activeTrees.delete(this);
44
+ originalDelete.call(this);
45
+ };
26
46
  parser.reset();
27
- return currentTree;
47
+ return tree;
28
48
  };
29
49
  export default createAnalyze;