execjs-pcruntime 0.1.2 → 0.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ba11ad7f3ad06a577368aff2e27006d95f16fe0c9f3c1ae371d8c413797b418e
4
- data.tar.gz: 654d4ddc8bfd649ff17fa59d74fa1512db3d0150a9dd759b3d2dfebf7644c767
3
+ metadata.gz: aec9e69936452420277727dacd0c7d27331b7766c8008c433cd840a8c6f38f45
4
+ data.tar.gz: 75271e7344781d9338c09263b1ac036355147cd228ae0b7581272cfb3dc53a1a
5
5
  SHA512:
6
- metadata.gz: 109ce5c2898e87f21fe75c06cc818b7ecc45cd316466ef82bb5fd3fd4c305f00434d284a038d1947626ea13d19a8e3f76037da7b6604f1680c546ee0d4a1c1f4
7
- data.tar.gz: '020513096f47aae6fd42c2e73a9b80ba378ad7ff01f1e7acdce2042f6ad37396fa40b0755dae17e7bb5f87e9c4bde881df825648e61c4603e406d8f0ec2e00b5'
6
+ metadata.gz: b8a8075e90042f2e6183dae5faf84e3c8749b0b8138e9f30fc3499287eef1cf2a3120f5bc7d5c9e3427ce9fe088ad0b28f38cfa3a4471df6b9c25cb4b3c38006
7
+ data.tar.gz: '088fe43e02e523346e26ad05cd8617aa3298e046b90760cdafcdb7d0f74fd9a4b3c0ab56e8489e65ac51493850611faf267bd1899a3486088153ddc9fd594ad0'
data/.gitignore CHANGED
@@ -2,6 +2,7 @@
2
2
  !/.github
3
3
  !/bin
4
4
  !/lib
5
+ !/doc_resources
5
6
  !/test
6
7
  !/.gitignore
7
8
  !/.rubocop.yml
@@ -10,4 +11,4 @@
10
11
  !/Gemfile
11
12
  !/LICENSE.txt
12
13
  !/Rakefile
13
- !/README.md
14
+ !/README.md
data/README.md CHANGED
@@ -4,6 +4,23 @@ Accelerated ExecJS Runtime by launching Node.js Processes per Context, not per e
4
4
 
5
5
  inspired by [execjs-fastnode](https://github.com/jhawthorn/execjs-fastnode)
6
6
 
7
+ ## How PCRuntime fast?
8
+
9
+ The existing Node.js runtime spawns a Node.js process for each eval, regardless of whether it compiles or not.
10
+ To reduce this overhead, execjs-fastnode is designed to launch a single Node.js process and manage the Context in JavaScript.
11
+
12
+ | Node.js | execjs-fastnode |
13
+ |:-------------------------------------------------------------------------------------------:|:--------------------------------------------------------------------------------------------------:|
14
+ | ![Sequence Diagram of Node.js Runtime](./doc_resources/out/sequence_nodejs/sequence_nodejs.svg) | ![Sequence Diagram of FastNode Runtime](./doc_resources/out/sequence_fastnode1/sequence_fastnode1.svg) |
15
+
16
+ execjs-fastnode is designed to limit the number of threads that can access a Node.js process to 1 to avoid the race condition when multiple Contexts are used.
17
+ execjs-pcruntime works lock-free by creating a Node.js process for each Context.
18
+ This improves performance when used with multi-threading.
19
+
20
+ | execjs-fastnode(multi-threading) | execjs-pcruntime |
21
+ |:-------------------------------------------------------------------------------------------------------------------------:|:-----------------------------------------------------------------------------------------------:|
22
+ | ![Sequence Diagram of FastNode Runtime in multi-threading](./doc_resources/out/sequence_fastnode2/sequence_fastnode2.svg) | ![Sequence Diagram of PCRuntime](./doc_resources/out/sequence_pcruntime/sequence_pcruntime.svg) |
23
+
7
24
  ## Requirements
8
25
 
9
26
  - Ruby >= 3.0.0
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="417px" preserveAspectRatio="none" style="width:603px;height:417px;background:#FFFFFF;" version="1.1" viewBox="0 0 603 417" width="603px" zoomAndPan="magnify"><defs/><g><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="59.5" x2="59.5" y1="36.4883" y2="381.2598"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="394.5" x2="394.5" y1="44.4883" y2="381.2598"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="536.5" x2="536.5" y1="75.9766" y2="381.2598"/><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="109" x="5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="95" x="12" y="25.5352">User program</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="109" x="5" y="381.2598"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="95" x="12" y="401.7949">User program</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="336.5" y="381.2598"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="102" x="343.5" y="401.7949">execjs Context</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="475.5" y="381.2598"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="482.5" y="401.7949">Node.js process</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="336.5" y="44.4883"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="102" x="343.5" y="65.0234">execjs Context</text><polygon fill="#181818" points="324.5,61.7988,334.5,65.7988,324.5,69.7988,328.5,65.7988" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="59.5" x2="330.5" y1="65.7988" y2="65.7988"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="253" x="66.5" y="61.0566">context = ExecJS.compile(initial_source)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="475.5" y="75.9766"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="482.5" y="96.5117">Node.js process</text><polygon fill="#181818" points="463.5,93.2871,473.5,97.2871,463.5,101.2871,467.5,97.2871" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="394.5" x2="469.5" y1="97.2871" y2="97.2871"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="40" x="401.5" y="92.5449">spawn</text><polygon fill="#181818" points="524.5,124.7754,534.5,128.7754,524.5,132.7754,528.5,128.7754" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="394.5" x2="530.5" y1="128.7754" y2="128.7754"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="401.5" y="124.0332">eval(initial_source)</text><polygon fill="#181818" points="382.5,154.0859,392.5,158.0859,382.5,162.0859,386.5,158.0859" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="59.5" x2="388.5" y1="158.0859" y2="158.0859"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="132" x="66.5" y="153.3438">context.call(source1)</text><polygon fill="#181818" points="524.5,183.3965,534.5,187.3965,524.5,191.3965,528.5,187.3965" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="394.5" x2="530.5" y1="187.3965" y2="187.3965"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="401.5" y="182.6543">eval(source1)</text><polygon fill="#181818" points="405.5,212.707,395.5,216.707,405.5,220.707,401.5,216.707" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="399.5" x2="535.5" y1="216.707" y2="216.707"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="411.5" y="211.9648">result: string</text><polygon fill="#181818" points="70.5,242.0176,60.5,246.0176,70.5,250.0176,66.5,246.0176" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="64.5" x2="393.5" y1="246.0176" y2="246.0176"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="76.5" y="241.2754">result: Ruby object</text><polygon fill="#181818" points="382.5,271.3281,392.5,275.3281,382.5,279.3281,386.5,275.3281" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="59.5" x2="388.5" y1="275.3281" y2="275.3281"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="132" x="66.5" y="270.5859">context.call(source2)</text><polygon fill="#181818" points="524.5,300.6387,534.5,304.6387,524.5,308.6387,528.5,304.6387" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="394.5" x2="530.5" y1="304.6387" y2="304.6387"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="401.5" y="299.8965">eval(source2)</text><polygon fill="#181818" points="405.5,329.9492,395.5,333.9492,405.5,337.9492,401.5,333.9492" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="399.5" x2="535.5" y1="333.9492" y2="333.9492"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="411.5" y="329.207">result: string</text><polygon fill="#181818" points="70.5,359.2598,60.5,363.2598,70.5,367.2598,66.5,363.2598" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="64.5" x2="393.5" y1="363.2598" y2="363.2598"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="76.5" y="358.5176">result: Ruby object</text><!--MD5=[7b77d49a8f754d39ea997907a8f03ad1]
2
+ @startuml
3
+
4
+ !pragma teoz true
5
+
6
+ participant "User program" as ruby
7
+ participant "execjs Context" as context
8
+ participant "Node.js process" as node
9
+
10
+ create context
11
+ ruby -> context : context = ExecJS.compile(initial_source)
12
+ create node
13
+ context -> node : spawn
14
+ context -> node : eval(initial_source)
15
+
16
+ ruby -> context : context.call(source1)
17
+ context -> node : eval(source1)
18
+ node -> context : result: string
19
+ context -> ruby : result: Ruby object
20
+
21
+ ruby -> context : context.call(source2)
22
+ context -> node : eval(source2)
23
+ node -> context : result: string
24
+ context -> ruby : result: Ruby object
25
+
26
+ @enduml
27
+
28
+ PlantUML version 1.2022.7(Tue Aug 23 02:01:30 JST 2022)
29
+ (GPL source distribution)
30
+ Java Runtime: Java(TM) SE Runtime Environment
31
+ JVM: Java HotSpot(TM) 64-Bit Server VM
32
+ Default Encoding: UTF-8
33
+ Language: ja
34
+ Country: JP
35
+ --></g></svg>
@@ -0,0 +1,70 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="1107px" preserveAspectRatio="none" style="width:1475px;height:1107px;background:#FFFFFF;" version="1.1" viewBox="0 0 1475 1107" width="1475px" zoomAndPan="magnify"><defs/><g><rect fill="none" height="88.1094" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="140.7754"/><rect fill="none" height="56.6211" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="246.8848"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="380.127"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="530.6797"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="751.8535"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="902.4063"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="93.5" x2="93.5" y1="36.4883" y2="1070.959"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="449" x2="449" y1="44.4883" y2="1070.959"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="668" x2="668" y1="36.4883" y2="1070.959"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="892" x2="892" y1="168.0859" y2="1070.959"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="1025.5" x2="1025.5" y1="75.9766" y2="1070.959"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="1381" x2="1381" y1="36.4883" y2="1070.959"/><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="12" y="25.5352">User program(Thread1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="113" x="611.5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="618.5" y="25.5352">internal object</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="1292.5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="1299.5" y="25.5352">User program(Thread2)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="5" y="1070.959"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="12" y="1091.4941">User program(Thread1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="386.5" y="1070.959"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="393.5" y="1091.4941">execjs Context1</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="113" x="611.5" y="1070.959"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="99" x="618.5" y="1091.4941">internal object</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="831" y="1070.959"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="838" y="1091.4941">Node.js process</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="963" y="1070.959"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="970" y="1091.4941">execjs Context2</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="1292.5" y="1070.959"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="1299.5" y="1091.4941">User program(Thread2)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="386.5" y="44.4883"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="393.5" y="65.0234">execjs Context1</text><polygon fill="#181818" points="374.5,61.7988,384.5,65.7988,374.5,69.7988,378.5,65.7988" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="380.5" y1="65.7988" y2="65.7988"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="269" x="100.5" y="61.0566">context1 = ExecJS.compile(initial_source1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="963" y="75.9766"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="970" y="96.5117">execjs Context2</text><polygon fill="#181818" points="1099,93.2871,1089,97.2871,1099,101.2871,1095,97.2871" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1093" x2="1380" y1="97.2871" y2="97.2871"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="269" x="1105" y="92.5449">context2 = ExecJS.compile(initial_source2)</text><polygon fill="#181818" points="656,124.7754,666,128.7754,656,132.7754,660,128.7754" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="662" y1="128.7754" y2="128.7754"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="195" x="456" y="124.0332">Create Context(initial_source1)</text><polygon fill="#181818" points="679,124.7754,669,128.7754,679,132.7754,675,128.7754" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="1024.5" y1="128.7754" y2="128.7754"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="195" x="685" y="124.0332">Create Context(initial_source2)</text><path d="M652,140.7754 L780,140.7754 L780,148.0859 L770,158.0859 L652,158.0859 L652,140.7754 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="88.1094" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="140.7754"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="83" x="667" y="154.3438">synchronize</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="122" x="831" y="168.0859"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="108" x="838" y="188.6211">Node.js process</text><polygon fill="#181818" points="819,185.3965,829,189.3965,819,193.3965,823,189.3965" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="825" y1="189.3965" y2="189.3965"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="40" x="675" y="184.6543">spawn</text><polygon fill="#181818" points="880,216.8848,890,220.8848,880,224.8848,884,220.8848" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="886" y1="220.8848" y2="220.8848"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="200" x="675" y="216.1426">eval(context=1, initial_source1)</text><path d="M652,246.8848 L780,246.8848 L780,254.1953 L770,264.1953 L652,264.1953 L652,246.8848 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="56.6211" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="246.8848"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="83" x="667" y="260.4531">synchronize</text><polygon fill="#181818" points="880,291.5059,890,295.5059,880,299.5059,884,295.5059" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="886" y1="295.5059" y2="295.5059"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="200" x="675" y="290.7637">eval(context=2, initial_source2)</text><polygon fill="#181818" points="437,334.8164,447,338.8164,437,342.8164,441,338.8164" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="443" y1="338.8164" y2="338.8164"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="100.5" y="334.0742">context1.call(source1)</text><polygon fill="#181818" points="1036.5,334.8164,1026.5,338.8164,1036.5,342.8164,1032.5,338.8164" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1030.5" x2="1380" y1="338.8164" y2="338.8164"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="1042.5" y="334.0742">context2.call(source2)</text><polygon fill="#181818" points="656,364.127,666,368.127,656,372.127,660,368.127" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="662" y1="368.127" y2="368.127"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="456" y="363.3848">eval(context=1, source1)</text><polygon fill="#181818" points="679,364.127,669,368.127,679,372.127,675,368.127" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="1024.5" y1="368.127" y2="368.127"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="685" y="363.3848">eval(context=2, source2)</text><path d="M652,380.127 L780,380.127 L780,387.4375 L770,397.4375 L652,397.4375 L652,380.127 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="380.127"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="83" x="667" y="393.6953">synchronize</text><polygon fill="#181818" points="880,424.748,890,428.748,880,432.748,884,428.748" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="886" y1="428.748" y2="428.748"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="675" y="424.0059">eval(context=1, source1)</text><polygon fill="#181818" points="679,454.0586,669,458.0586,679,462.0586,675,458.0586" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="891" y1="458.0586" y2="458.0586"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="685" y="453.3164">result: string</text><polygon fill="#181818" points="460,497.3691,450,501.3691,460,505.3691,456,501.3691" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="454" x2="667" y1="501.3691" y2="501.3691"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="466" y="496.627">result: Ruby object</text><polygon fill="#181818" points="104.5,526.6797,94.5,530.6797,104.5,534.6797,100.5,530.6797" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="98.5" x2="448" y1="530.6797" y2="530.6797"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="110.5" y="525.9375">result: Ruby object</text><path d="M652,530.6797 L780,530.6797 L780,537.9902 L770,547.9902 L652,547.9902 L652,530.6797 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="530.6797"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="83" x="667" y="544.248">synchronize</text><polygon fill="#181818" points="880,575.3008,890,579.3008,880,583.3008,884,579.3008" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="886" y1="579.3008" y2="579.3008"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="675" y="574.5586">eval(context=2, source2)</text><polygon fill="#181818" points="679,604.6113,669,608.6113,679,612.6113,675,608.6113" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="891" y1="608.6113" y2="608.6113"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="685" y="603.8691">result: string</text><polygon fill="#181818" points="1013.5,647.9219,1023.5,651.9219,1013.5,655.9219,1017.5,651.9219" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="1019.5" y1="651.9219" y2="651.9219"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="675" y="647.1797">result: Ruby object</text><polygon fill="#181818" points="1369,677.2324,1379,681.2324,1369,685.2324,1373,681.2324" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1025.5" x2="1375" y1="681.2324" y2="681.2324"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="1032.5" y="676.4902">result: Ruby object</text><polygon fill="#181818" points="437,706.543,447,710.543,437,714.543,441,710.543" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="443" y1="710.543" y2="710.543"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="100.5" y="705.8008">context1.call(source3)</text><polygon fill="#181818" points="1036.5,706.543,1026.5,710.543,1036.5,714.543,1032.5,710.543" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1030.5" x2="1380" y1="710.543" y2="710.543"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="1042.5" y="705.8008">context2.call(source4)</text><polygon fill="#181818" points="656,735.8535,666,739.8535,656,743.8535,660,739.8535" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="662" y1="739.8535" y2="739.8535"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="456" y="735.1113">eval(context=1, source3)</text><polygon fill="#181818" points="679,735.8535,669,739.8535,679,743.8535,675,739.8535" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="1024.5" y1="739.8535" y2="739.8535"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="685" y="735.1113">eval(context=2, source4)</text><path d="M652,751.8535 L780,751.8535 L780,759.1641 L770,769.1641 L652,769.1641 L652,751.8535 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="751.8535"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="83" x="667" y="765.4219">synchronize</text><polygon fill="#181818" points="880,796.4746,890,800.4746,880,804.4746,884,800.4746" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="886" y1="800.4746" y2="800.4746"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="675" y="795.7324">eval(context=2, source4)</text><polygon fill="#181818" points="679,825.7852,669,829.7852,679,833.7852,675,829.7852" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="891" y1="829.7852" y2="829.7852"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="685" y="825.043">result: string</text><polygon fill="#181818" points="1013.5,869.0957,1023.5,873.0957,1013.5,877.0957,1017.5,873.0957" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="1019.5" y1="873.0957" y2="873.0957"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="675" y="868.3535">result: Ruby object</text><polygon fill="#181818" points="1369,898.4063,1379,902.4063,1369,906.4063,1373,902.4063" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1025.5" x2="1375" y1="902.4063" y2="902.4063"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="1032.5" y="897.6641">result: Ruby object</text><path d="M652,902.4063 L780,902.4063 L780,909.7168 L770,919.7168 L652,919.7168 L652,902.4063 " fill="#EEEEEE" style="stroke:#000000;stroke-width:1.5;"/><rect fill="none" height="85.9316" style="stroke:#000000;stroke-width:1.5;" width="256" x="652" y="902.4063"/><text fill="#000000" font-family="sans-serif" font-size="13" font-weight="bold" lengthAdjust="spacing" textLength="83" x="667" y="915.9746">synchronize</text><polygon fill="#181818" points="880,947.0273,890,951.0273,880,955.0273,884,951.0273" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="668" x2="886" y1="951.0273" y2="951.0273"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="157" x="675" y="946.2852">eval(context=1, source3)</text><polygon fill="#181818" points="679,976.3379,669,980.3379,679,984.3379,675,980.3379" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="673" x2="891" y1="980.3379" y2="980.3379"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="685" y="975.5957">result: string</text><polygon fill="#181818" points="460,1019.6484,450,1023.6484,460,1027.6484,456,1023.6484" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="454" x2="667" y1="1023.6484" y2="1023.6484"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="466" y="1018.9063">result: Ruby object</text><polygon fill="#181818" points="104.5,1048.959,94.5,1052.959,104.5,1056.959,100.5,1052.959" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="98.5" x2="448" y1="1052.959" y2="1052.959"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="110.5" y="1048.2168">result: Ruby object</text><!--MD5=[8231295b6a95a226c222b426b1af1829]
2
+ @startuml
3
+
4
+ !pragma teoz true
5
+
6
+ participant "User program(Thread1)" as ruby1
7
+ participant "execjs Context1" as context1
8
+ participant "internal object" as vm
9
+ participant "Node.js process" as node
10
+ participant "execjs Context2" as context2
11
+ participant "User program(Thread2)" as ruby2
12
+
13
+ create context1
14
+ ruby1 -> context1 : context1 = ExecJS.compile(initial_source1)
15
+ create context2
16
+ ruby2 -> context2 : context2 = ExecJS.compile(initial_source2)
17
+ context1 -> vm : Create Context(initial_source1)
18
+ & context2 -> vm : Create Context(initial_source2)
19
+ create node
20
+ group synchronize
21
+ vm -> node : spawn
22
+ vm -> node : eval(context=1, initial_source1)
23
+ end
24
+ group synchronize
25
+ vm -> node : eval(context=2, initial_source2)
26
+ end
27
+
28
+ ruby1 -> context1 : context1.call(source1)
29
+ & ruby2 -> context2 : context2.call(source2)
30
+ context1 -> vm : eval(context=1, source1)
31
+ & context2 -> vm : eval(context=2, source2)
32
+ group synchronize
33
+ vm -> node : eval(context=1, source1)
34
+ node -> vm : result: string
35
+ end
36
+ vm -> context1 : result: Ruby object
37
+ context1 -> ruby1 : result: Ruby object
38
+ & group synchronize
39
+ vm -> node : eval(context=2, source2)
40
+ node -> vm : result: string
41
+ end
42
+ vm -> context2 : result: Ruby object
43
+ context2 -> ruby2 : result: Ruby object
44
+
45
+ ruby1 -> context1 : context1.call(source3)
46
+ & ruby2 -> context2 : context2.call(source4)
47
+ context1 -> vm : eval(context=1, source3)
48
+ & context2 -> vm : eval(context=2, source4)
49
+ group synchronize
50
+ vm -> node : eval(context=2, source4)
51
+ node -> vm : result: string
52
+ end
53
+ vm -> context2 : result: Ruby object
54
+ context2 -> ruby2 : result: Ruby object
55
+ & group synchronize
56
+ vm -> node : eval(context=1, source3)
57
+ node -> vm : result: string
58
+ end
59
+ vm -> context1 : result: Ruby object
60
+ context1 -> ruby1 : result: Ruby object
61
+ @enduml
62
+
63
+ PlantUML version 1.2022.7(Tue Aug 23 02:01:30 JST 2022)
64
+ (GPL source distribution)
65
+ Java Runtime: Java(TM) SE Runtime Environment
66
+ JVM: Java HotSpot(TM) 64-Bit Server VM
67
+ Default Encoding: UTF-8
68
+ Language: ja
69
+ Country: JP
70
+ --></g></svg>
@@ -0,0 +1,37 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="361px" preserveAspectRatio="none" style="width:882px;height:361px;background:#FFFFFF;" version="1.1" viewBox="0 0 882 361" width="882px" zoomAndPan="magnify"><defs/><g><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="59.5" x2="59.5" y1="36.4883" y2="324.8164"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="394.5" x2="394.5" y1="44.4883" y2="324.8164"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="670" x2="670" y1="105.2871" y2="324.8164"/><line style="stroke:#181818;stroke-width:2.0;" x1="661" x2="679" y1="149.0859" y2="167.0859"/><line style="stroke:#181818;stroke-width:2.0;" x1="661" x2="679" y1="167.0859" y2="149.0859"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="811" x2="811" y1="224.707" y2="324.8164"/><line style="stroke:#181818;stroke-width:2.0;" x1="802" x2="820" y1="268.5059" y2="286.5059"/><line style="stroke:#181818;stroke-width:2.0;" x1="802" x2="820" y1="286.5059" y2="268.5059"/><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="109" x="5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="95" x="12" y="25.5352">User program</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="109" x="5" y="324.8164"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="95" x="12" y="345.3516">User program</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="336.5" y="324.8164"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="102" x="343.5" y="345.3516">execjs Context</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="604.5" y="324.8164"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="611.5" y="345.3516">Node.js process1</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="745.5" y="324.8164"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="752.5" y="345.3516">Node.js process2</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="116" x="336.5" y="44.4883"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="102" x="343.5" y="65.0234">execjs Context</text><polygon fill="#181818" points="324.5,61.7988,334.5,65.7988,324.5,69.7988,328.5,65.7988" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="59.5" x2="330.5" y1="65.7988" y2="65.7988"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="253" x="66.5" y="61.0566">context = ExecJS.compile(initial_source)</text><polygon fill="#181818" points="382.5,93.2871,392.5,97.2871,382.5,101.2871,386.5,97.2871" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="59.5" x2="388.5" y1="97.2871" y2="97.2871"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="132" x="66.5" y="92.5449">context.call(source1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="604.5" y="105.2871"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="611.5" y="125.8223">Node.js process1</text><polygon fill="#181818" points="592.5,122.5977,602.5,126.5977,592.5,130.5977,596.5,126.5977" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="394.5" x2="598.5" y1="126.5977" y2="126.5977"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="186" x="401.5" y="121.8555">eval(initial_source + source1)</text><polygon fill="#181818" points="405.5,154.0859,395.5,158.0859,405.5,162.0859,401.5,158.0859" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="399.5" x2="669" y1="158.0859" y2="158.0859"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="411.5" y="153.3438">result: string</text><polygon fill="#181818" points="70.5,183.3965,60.5,187.3965,70.5,191.3965,66.5,187.3965" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="64.5" x2="393.5" y1="187.3965" y2="187.3965"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="76.5" y="182.6543">result: Ruby object</text><polygon fill="#181818" points="382.5,212.707,392.5,216.707,382.5,220.707,386.5,216.707" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="59.5" x2="388.5" y1="216.707" y2="216.707"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="132" x="66.5" y="211.9648">context.call(source2)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="745.5" y="224.707"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="752.5" y="245.2422">Node.js process2</text><polygon fill="#181818" points="733.5,242.0176,743.5,246.0176,733.5,250.0176,737.5,246.0176" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="394.5" x2="739.5" y1="246.0176" y2="246.0176"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="186" x="401.5" y="241.2754">eval(initial_source + source2)</text><polygon fill="#181818" points="405.5,273.5059,395.5,277.5059,405.5,281.5059,401.5,277.5059" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="399.5" x2="810" y1="277.5059" y2="277.5059"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="411.5" y="272.7637">result: string</text><polygon fill="#181818" points="70.5,302.8164,60.5,306.8164,70.5,310.8164,66.5,306.8164" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="64.5" x2="393.5" y1="306.8164" y2="306.8164"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="76.5" y="302.0742">result: Ruby object</text><!--MD5=[a771d5800578c0fe5d3a9efcad94a7c7]
2
+ @startuml
3
+
4
+ !pragma teoz true
5
+
6
+ participant "User program" as ruby
7
+ participant "execjs Context" as context
8
+ participant "Node.js process1" as node1
9
+ participant "Node.js process2" as node2
10
+
11
+ create context
12
+ ruby -> context : context = ExecJS.compile(initial_source)
13
+
14
+ ruby -> context : context.call(source1)
15
+ create node1
16
+ context -> node1 : eval(initial_source + source1)
17
+ node1 -> context : result: string
18
+ destroy node1
19
+ context -> ruby : result: Ruby object
20
+
21
+ ruby -> context : context.call(source2)
22
+ create node2
23
+ context -> node2 : eval(initial_source + source2)
24
+ node2 -> context : result: string
25
+ destroy node2
26
+ context -> ruby : result: Ruby object
27
+
28
+ @enduml
29
+
30
+ PlantUML version 1.2022.7(Tue Aug 23 02:01:30 JST 2022)
31
+ (GPL source distribution)
32
+ Java Runtime: Java(TM) SE Runtime Environment
33
+ JVM: Java HotSpot(TM) 64-Bit Server VM
34
+ Default Encoding: UTF-8
35
+ Language: ja
36
+ Country: JP
37
+ --></g></svg>
@@ -0,0 +1,50 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" height="480px" preserveAspectRatio="none" style="width:1340px;height:480px;background:#FFFFFF;" version="1.1" viewBox="0 0 1340 480" width="1340px" zoomAndPan="magnify"><defs/><g><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="93.5" x2="93.5" y1="36.4883" y2="444.2363"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="449" x2="449" y1="44.4883" y2="444.2363"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="599" x2="599" y1="107.4648" y2="444.2363"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="763" x2="763" y1="36.4883" y2="444.2363"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="1118.5" x2="1118.5" y1="75.9766" y2="444.2363"/><line style="stroke:#181818;stroke-width:0.5;stroke-dasharray:5.0,5.0;" x1="1268.5" x2="1268.5" y1="138.9531" y2="444.2363"/><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="12" y="25.5352">User program(Thread1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="674.5" y="5"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="681.5" y="25.5352">User program(Thread2)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="5" y="444.2363"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="12" y="464.7715">User program(Thread1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="386.5" y="444.2363"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="393.5" y="464.7715">execjs Context1</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="533.5" y="444.2363"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="540.5" y="464.7715">Node.js process1</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="177" x="674.5" y="444.2363"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="163" x="681.5" y="464.7715">User program(Thread2)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="1056" y="444.2363"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="1063" y="464.7715">execjs Context2</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="1203" y="444.2363"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="1210" y="464.7715">Node.js process2</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="386.5" y="44.4883"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="393.5" y="65.0234">execjs Context1</text><polygon fill="#181818" points="374.5,61.7988,384.5,65.7988,374.5,69.7988,378.5,65.7988" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="380.5" y1="65.7988" y2="65.7988"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="269" x="100.5" y="61.0566">context1 = ExecJS.compile(initial_source1)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="125" x="1056" y="75.9766"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="111" x="1063" y="96.5117">execjs Context2</text><polygon fill="#181818" points="1044,93.2871,1054,97.2871,1044,101.2871,1048,97.2871" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="763" x2="1050" y1="97.2871" y2="97.2871"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="269" x="770" y="92.5449">context2 = ExecJS.compile(initial_source2)</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="533.5" y="107.4648"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="540.5" y="128">Node.js process1</text><polygon fill="#181818" points="521.5,124.7754,531.5,128.7754,521.5,132.7754,525.5,128.7754" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="527.5" y1="128.7754" y2="128.7754"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="40" x="456" y="124.0332">spawn</text><rect fill="#E2E2F0" height="30.4883" rx="2.5" ry="2.5" style="stroke:#181818;stroke-width:0.5;" width="131" x="1203" y="138.9531"/><text fill="#000000" font-family="sans-serif" font-size="14" lengthAdjust="spacing" textLength="117" x="1210" y="159.4883">Node.js process2</text><polygon fill="#181818" points="1191,156.2637,1201,160.2637,1191,164.2637,1195,160.2637" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1118.5" x2="1197" y1="160.2637" y2="160.2637"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="40" x="1125.5" y="155.5215">spawn</text><polygon fill="#181818" points="587,187.752,597,191.752,587,195.752,591,191.752" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="593" y1="191.752" y2="191.752"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="126" x="456" y="187.0098">eval(initial_source1)</text><polygon fill="#181818" points="1256.5,187.752,1266.5,191.752,1256.5,195.752,1260.5,191.752" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1118.5" x2="1262.5" y1="191.752" y2="191.752"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="126" x="1125.5" y="187.0098">eval(initial_source2)</text><polygon fill="#181818" points="437,217.0625,447,221.0625,437,225.0625,441,221.0625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="443" y1="221.0625" y2="221.0625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="100.5" y="216.3203">context1.call(source1)</text><polygon fill="#181818" points="1106.5,217.0625,1116.5,221.0625,1106.5,225.0625,1110.5,221.0625" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="763" x2="1112.5" y1="221.0625" y2="221.0625"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="770" y="216.3203">context2.call(source2)</text><polygon fill="#181818" points="587,246.373,597,250.373,587,254.373,591,250.373" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="593" y1="250.373" y2="250.373"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="456" y="245.6309">eval(source1)</text><polygon fill="#181818" points="1256.5,246.373,1266.5,250.373,1256.5,254.373,1260.5,250.373" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1118.5" x2="1262.5" y1="250.373" y2="250.373"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="1125.5" y="245.6309">eval(source2)</text><polygon fill="#181818" points="460,275.6836,450,279.6836,460,283.6836,456,279.6836" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="454" x2="598" y1="279.6836" y2="279.6836"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="466" y="274.9414">result: string</text><polygon fill="#181818" points="1129.5,275.6836,1119.5,279.6836,1129.5,283.6836,1125.5,279.6836" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1123.5" x2="1267.5" y1="279.6836" y2="279.6836"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="1135.5" y="274.9414">result: string</text><polygon fill="#181818" points="104.5,304.9941,94.5,308.9941,104.5,312.9941,100.5,308.9941" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="98.5" x2="448" y1="308.9941" y2="308.9941"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="110.5" y="304.252">result: Ruby object</text><polygon fill="#181818" points="774,304.9941,764,308.9941,774,312.9941,770,308.9941" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="768" x2="1117.5" y1="308.9941" y2="308.9941"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="780" y="304.252">result: Ruby object</text><polygon fill="#181818" points="437,334.3047,447,338.3047,437,342.3047,441,338.3047" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="93.5" x2="443" y1="338.3047" y2="338.3047"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="100.5" y="333.5625">context1.call(source3)</text><polygon fill="#181818" points="1106.5,334.3047,1116.5,338.3047,1106.5,342.3047,1110.5,338.3047" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="763" x2="1112.5" y1="338.3047" y2="338.3047"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="140" x="770" y="333.5625">context2.call(source4)</text><polygon fill="#181818" points="587,363.6152,597,367.6152,587,371.6152,591,367.6152" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="449" x2="593" y1="367.6152" y2="367.6152"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="456" y="362.873">eval(source3)</text><polygon fill="#181818" points="1256.5,363.6152,1266.5,367.6152,1256.5,371.6152,1260.5,367.6152" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1118.5" x2="1262.5" y1="367.6152" y2="367.6152"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="83" x="1125.5" y="362.873">eval(source4)</text><polygon fill="#181818" points="460,392.9258,450,396.9258,460,400.9258,456,396.9258" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="454" x2="598" y1="396.9258" y2="396.9258"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="466" y="392.1836">result: string</text><polygon fill="#181818" points="1129.5,392.9258,1119.5,396.9258,1129.5,400.9258,1125.5,396.9258" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="1123.5" x2="1267.5" y1="396.9258" y2="396.9258"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="81" x="1135.5" y="392.1836">result: string</text><polygon fill="#181818" points="104.5,422.2363,94.5,426.2363,104.5,430.2363,100.5,426.2363" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="98.5" x2="448" y1="426.2363" y2="426.2363"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="110.5" y="421.4941">result: Ruby object</text><polygon fill="#181818" points="774,422.2363,764,426.2363,774,430.2363,770,426.2363" style="stroke:#181818;stroke-width:1.0;"/><line style="stroke:#181818;stroke-width:1.0;" x1="768" x2="1117.5" y1="426.2363" y2="426.2363"/><text fill="#000000" font-family="sans-serif" font-size="13" lengthAdjust="spacing" textLength="118" x="780" y="421.4941">result: Ruby object</text><!--MD5=[ee283807631a6e11c93e5d8079e71f92]
2
+ @startuml
3
+
4
+ !pragma teoz true
5
+
6
+ participant "User program(Thread1)" as ruby1
7
+ participant "execjs Context1" as context1
8
+ participant "Node.js process1" as node1
9
+ participant "User program(Thread2)" as ruby2
10
+ participant "execjs Context2" as context2
11
+ participant "Node.js process2" as node2
12
+
13
+ create context1
14
+ ruby1 -> context1 : context1 = ExecJS.compile(initial_source1)
15
+ create context2
16
+ ruby2 -> context2 : context2 = ExecJS.compile(initial_source2)
17
+ create node1
18
+ context1 -> node1 : spawn
19
+ create node2
20
+ context2 -> node2 : spawn
21
+ context1 -> node1 : eval(initial_source1)
22
+ & context2 -> node2 : eval(initial_source2)
23
+
24
+ ruby1 -> context1 : context1.call(source1)
25
+ & ruby2 -> context2 : context2.call(source2)
26
+ context1 -> node1 : eval(source1)
27
+ & context2 -> node2 : eval(source2)
28
+ node1 -> context1 : result: string
29
+ & node2 -> context2 : result: string
30
+ context1 -> ruby1 : result: Ruby object
31
+ & context2 -> ruby2 : result: Ruby object
32
+
33
+ ruby1 -> context1 : context1.call(source3)
34
+ & ruby2 -> context2 : context2.call(source4)
35
+ context1 -> node1 : eval(source3)
36
+ & context2 -> node2 : eval(source4)
37
+ node1 -> context1 : result: string
38
+ & node2 -> context2 : result: string
39
+ context1 -> ruby1 : result: Ruby object
40
+ & context2 -> ruby2 : result: Ruby object
41
+ @enduml
42
+
43
+ PlantUML version 1.2022.7(Tue Aug 23 02:01:30 JST 2022)
44
+ (GPL source distribution)
45
+ Java Runtime: Java(TM) SE Runtime Environment
46
+ JVM: Java HotSpot(TM) 64-Bit Server VM
47
+ Default Encoding: UTF-8
48
+ Language: ja
49
+ Country: JP
50
+ --></g></svg>
@@ -0,0 +1,25 @@
1
+ @startuml
2
+
3
+ !pragma teoz true
4
+
5
+ participant "User program" as ruby
6
+ participant "execjs Context" as context
7
+ participant "Node.js process" as node
8
+
9
+ create context
10
+ ruby -> context : context = ExecJS.compile(initial_source)
11
+ create node
12
+ context -> node : spawn
13
+ context -> node : eval(initial_source)
14
+
15
+ ruby -> context : context.call(source1)
16
+ context -> node : eval(source1)
17
+ node -> context : result: string
18
+ context -> ruby : result: Ruby object
19
+
20
+ ruby -> context : context.call(source2)
21
+ context -> node : eval(source2)
22
+ node -> context : result: string
23
+ context -> ruby : result: Ruby object
24
+
25
+ @enduml
@@ -0,0 +1,60 @@
1
+ @startuml
2
+
3
+ !pragma teoz true
4
+
5
+ participant "User program(Thread1)" as ruby1
6
+ participant "execjs Context1" as context1
7
+ participant "internal object" as vm
8
+ participant "Node.js process" as node
9
+ participant "execjs Context2" as context2
10
+ participant "User program(Thread2)" as ruby2
11
+
12
+ create context1
13
+ ruby1 -> context1 : context1 = ExecJS.compile(initial_source1)
14
+ create context2
15
+ ruby2 -> context2 : context2 = ExecJS.compile(initial_source2)
16
+ context1 -> vm : Create Context(initial_source1)
17
+ & context2 -> vm : Create Context(initial_source2)
18
+ create node
19
+ group synchronize
20
+ vm -> node : spawn
21
+ vm -> node : eval(context=1, initial_source1)
22
+ end
23
+ group synchronize
24
+ vm -> node : eval(context=2, initial_source2)
25
+ end
26
+
27
+ ruby1 -> context1 : context1.call(source1)
28
+ & ruby2 -> context2 : context2.call(source2)
29
+ context1 -> vm : eval(context=1, source1)
30
+ & context2 -> vm : eval(context=2, source2)
31
+ group synchronize
32
+ vm -> node : eval(context=1, source1)
33
+ node -> vm : result: string
34
+ end
35
+ vm -> context1 : result: Ruby object
36
+ context1 -> ruby1 : result: Ruby object
37
+ & group synchronize
38
+ vm -> node : eval(context=2, source2)
39
+ node -> vm : result: string
40
+ end
41
+ vm -> context2 : result: Ruby object
42
+ context2 -> ruby2 : result: Ruby object
43
+
44
+ ruby1 -> context1 : context1.call(source3)
45
+ & ruby2 -> context2 : context2.call(source4)
46
+ context1 -> vm : eval(context=1, source3)
47
+ & context2 -> vm : eval(context=2, source4)
48
+ group synchronize
49
+ vm -> node : eval(context=2, source4)
50
+ node -> vm : result: string
51
+ end
52
+ vm -> context2 : result: Ruby object
53
+ context2 -> ruby2 : result: Ruby object
54
+ & group synchronize
55
+ vm -> node : eval(context=1, source3)
56
+ node -> vm : result: string
57
+ end
58
+ vm -> context1 : result: Ruby object
59
+ context1 -> ruby1 : result: Ruby object
60
+ @enduml
@@ -0,0 +1,27 @@
1
+ @startuml
2
+
3
+ !pragma teoz true
4
+
5
+ participant "User program" as ruby
6
+ participant "execjs Context" as context
7
+ participant "Node.js process1" as node1
8
+ participant "Node.js process2" as node2
9
+
10
+ create context
11
+ ruby -> context : context = ExecJS.compile(initial_source)
12
+
13
+ ruby -> context : context.call(source1)
14
+ create node1
15
+ context -> node1 : eval(initial_source + source1)
16
+ node1 -> context : result: string
17
+ destroy node1
18
+ context -> ruby : result: Ruby object
19
+
20
+ ruby -> context : context.call(source2)
21
+ create node2
22
+ context -> node2 : eval(initial_source + source2)
23
+ node2 -> context : result: string
24
+ destroy node2
25
+ context -> ruby : result: Ruby object
26
+
27
+ @enduml
@@ -0,0 +1,40 @@
1
+ @startuml
2
+
3
+ !pragma teoz true
4
+
5
+ participant "User program(Thread1)" as ruby1
6
+ participant "execjs Context1" as context1
7
+ participant "Node.js process1" as node1
8
+ participant "User program(Thread2)" as ruby2
9
+ participant "execjs Context2" as context2
10
+ participant "Node.js process2" as node2
11
+
12
+ create context1
13
+ ruby1 -> context1 : context1 = ExecJS.compile(initial_source1)
14
+ create context2
15
+ ruby2 -> context2 : context2 = ExecJS.compile(initial_source2)
16
+ create node1
17
+ context1 -> node1 : spawn
18
+ create node2
19
+ context2 -> node2 : spawn
20
+ context1 -> node1 : eval(initial_source1)
21
+ & context2 -> node2 : eval(initial_source2)
22
+
23
+ ruby1 -> context1 : context1.call(source1)
24
+ & ruby2 -> context2 : context2.call(source2)
25
+ context1 -> node1 : eval(source1)
26
+ & context2 -> node2 : eval(source2)
27
+ node1 -> context1 : result: string
28
+ & node2 -> context2 : result: string
29
+ context1 -> ruby1 : result: Ruby object
30
+ & context2 -> ruby2 : result: Ruby object
31
+
32
+ ruby1 -> context1 : context1.call(source3)
33
+ & ruby2 -> context2 : context2.call(source4)
34
+ context1 -> node1 : eval(source3)
35
+ & context2 -> node2 : eval(source4)
36
+ node1 -> context1 : result: string
37
+ & node2 -> context2 : result: string
38
+ context1 -> ruby1 : result: Ruby object
39
+ & context2 -> ruby2 : result: Ruby object
40
+ @enduml
@@ -5,6 +5,7 @@ require 'tmpdir'
5
5
  require 'json'
6
6
  require 'net/protocol'
7
7
  require 'net/http'
8
+ require 'shellwords'
8
9
 
9
10
  module ExecJS
10
11
  module PCRuntime
@@ -157,7 +158,10 @@ module ExecJS
157
158
  request['Connection'] = 'close'
158
159
  unless content_type.nil?
159
160
  request['Content-Type'] = content_type
160
- request.body = body
161
+ # URI.encode_www_form_component replaces space(U+0020) into '+' (not '%20')
162
+ # but decodeURIComponent(in JavaScript) cannot decode '+' into space
163
+ # so, replace '+' into '%20'
164
+ request.body = URI.encode_www_form_component(body).gsub('+', '%20')
161
165
  end
162
166
 
163
167
  # Net::HTTPGenericRequest#exec
@@ -171,13 +175,13 @@ module ExecJS
171
175
  end while response.is_a?(Net::HTTPContinue)
172
176
  # rubocop:enable Lint/Loop
173
177
  response.reading_body(socket, request.response_body_permitted?) {}
178
+ result = URI.decode_www_form_component response.body
174
179
 
175
180
  if response.code == '200'
176
- result = response.body
177
- ::JSON.parse(response.body, create_additions: false) if /\S/.match?(result)
181
+ ::JSON.parse(result, create_additions: false) if /\S/.match?(result)
178
182
  else
179
183
  # expects ErrorMessage\0StackTrace =~ response.body
180
- message, stack = response.body.split "\0"
184
+ message, stack = result.split "\0"
181
185
  error_class = /SyntaxError:/.match?(message) ? RuntimeError : ProgramError
182
186
  error = error_class.new(message)
183
187
  error.set_backtrace(stack)
@@ -14,16 +14,17 @@ const server = http.createServer(function (req, res) {
14
14
  req.on('data', (data) => allData += data);
15
15
  req.on('end', () => {
16
16
  try {
17
- const result = vm.runInContext(allData, context, "(execjs)");
17
+ // Percent-encoding HTTP requests and responses to avoid invalid UTF-8 sequences.
18
+ const result = vm.runInContext(decodeURIComponent(allData), context, "(execjs)");
18
19
  res.statusCode = 200;
19
20
  res.setHeader('Content-Type', 'application/json');
20
- res.end(JSON.stringify(result), 'utf-8');
21
+ res.end(encodeURIComponent(JSON.stringify(result) || null));
21
22
  } catch (e) {
22
23
  res.statusCode = 500;
23
24
  res.setHeader('Content-Type', 'text/plain');
24
25
  // to split by \0 on Ruby side
25
26
  // see context_process_runtime.rb:179
26
- res.end(e.toString() + "\0" + (e.stack || ""));
27
+ res.end(encodeURIComponent(e.toString() + "\0" + (e.stack || "")));
27
28
  }
28
29
  });
29
30
  break;
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Execjs
4
4
  module PCRuntime
5
- VERSION = '0.1.2'
5
+ VERSION = '0.2.1'
6
6
  end
7
7
  end
@@ -3,3 +3,5 @@
3
3
  require 'execjs'
4
4
  require 'execjs/pcruntime/version'
5
5
  require 'execjs/pcruntime/runtimes'
6
+
7
+ ExecJS.runtime = ExecJS::Runtimes.from_environment || ExecJS::Runtimes::PCRuntime
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: execjs-pcruntime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - White-Green
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-07-12 00:00:00.000000000 Z
11
+ date: 2023-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: execjs
@@ -40,6 +40,14 @@ files:
40
40
  - Rakefile
41
41
  - bin/console
42
42
  - bin/setup
43
+ - doc_resources/out/sequence_fastnode1/sequence_fastnode1.svg
44
+ - doc_resources/out/sequence_fastnode2/sequence_fastnode2.svg
45
+ - doc_resources/out/sequence_nodejs/sequence_nodejs.svg
46
+ - doc_resources/out/sequence_pcruntime/sequence_pcruntime.svg
47
+ - doc_resources/sequence_fastnode1.pu
48
+ - doc_resources/sequence_fastnode2.pu
49
+ - doc_resources/sequence_nodejs.pu
50
+ - doc_resources/sequence_pcruntime.pu
43
51
  - execjs-pcruntime.gemspec
44
52
  - lib/execjs/pcruntime.rb
45
53
  - lib/execjs/pcruntime/context_process_runtime.rb
@@ -68,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
68
76
  - !ruby/object:Gem::Version
69
77
  version: '0'
70
78
  requirements: []
71
- rubygems_version: 3.2.33
79
+ rubygems_version: 3.3.26
72
80
  signing_key:
73
81
  specification_version: 4
74
82
  summary: Fast ExecJS Runtime using Process as a Context.