@dodona/papyros 3.0.1 → 4.0.0-beta-9
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 +132 -72
- package/dist/Library.d.ts +10 -11
- package/dist/Library.js +9 -7
- package/dist/Library.js.map +1 -1
- package/dist/{Backend.d.ts → backend/Backend.d.ts} +3 -12
- package/dist/{Backend.js → backend/Backend.js} +4 -17
- package/dist/backend/Backend.js.map +1 -0
- package/dist/{workers → backend/workers}/javascript/JavaScriptWorker.js +1 -1
- package/dist/backend/workers/javascript/JavaScriptWorker.js.map +1 -0
- package/dist/backend/workers/javascript/worker.js.map +1 -0
- package/dist/{workers → backend/workers}/python/PythonWorker.d.ts +2 -2
- package/dist/{workers → backend/workers}/python/PythonWorker.js +2 -2
- package/dist/backend/workers/python/PythonWorker.js.map +1 -0
- package/dist/backend/workers/python/python_package.tar.gz.load_by_url +0 -0
- package/dist/backend/workers/python/worker.js.map +1 -0
- package/dist/communication/BackendEvent.js.map +1 -0
- package/dist/{BackendEventQueue.d.ts → communication/BackendEventQueue.d.ts} +1 -36
- package/dist/{BackendEventQueue.js → communication/BackendEventQueue.js} +2 -45
- package/dist/communication/BackendEventQueue.js.map +1 -0
- package/dist/{BackendManager.d.ts → communication/BackendManager.d.ts} +2 -2
- package/dist/{BackendManager.js → communication/BackendManager.js} +4 -4
- package/dist/communication/BackendManager.js.map +1 -0
- package/dist/communication/InputServiceWorker.js +37 -0
- package/dist/communication/InputServiceWorker.js.map +1 -0
- package/dist/communication/InputWorker.js.map +1 -0
- package/dist/frontend/components/CodeRunner.d.ts +9 -0
- package/dist/frontend/components/CodeRunner.js +60 -0
- package/dist/frontend/components/CodeRunner.js.map +1 -0
- package/dist/frontend/components/Debugger.d.ts +7 -0
- package/dist/frontend/components/Debugger.js +61 -0
- package/dist/frontend/components/Debugger.js.map +1 -0
- package/dist/frontend/components/Input.d.ts +13 -0
- package/dist/frontend/components/Input.js +65 -0
- package/dist/frontend/components/Input.js.map +1 -0
- package/dist/frontend/components/Output.d.ts +14 -0
- package/dist/frontend/components/Output.js +154 -0
- package/dist/frontend/components/Output.js.map +1 -0
- package/dist/frontend/components/PapyrosElement.d.ts +8 -0
- package/dist/frontend/components/PapyrosElement.js +24 -0
- package/dist/frontend/components/PapyrosElement.js.map +1 -0
- package/dist/frontend/components/app/App.d.ts +24 -0
- package/dist/frontend/components/app/App.js +204 -0
- package/dist/frontend/components/app/App.js.map +1 -0
- package/dist/frontend/components/app/ExamplePicker.d.ts +7 -0
- package/dist/frontend/components/app/ExamplePicker.js +35 -0
- package/dist/frontend/components/app/ExamplePicker.js.map +1 -0
- package/dist/frontend/components/app/LanguagePicker.d.ts +7 -0
- package/dist/frontend/components/app/LanguagePicker.js +35 -0
- package/dist/frontend/components/app/LanguagePicker.js.map +1 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.d.ts +7 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js +39 -0
- package/dist/frontend/components/app/ProgrammingLanguagePicker.js.map +1 -0
- package/dist/frontend/components/app/examples/JavaScriptExamples.js.map +1 -0
- package/dist/frontend/components/app/examples/PythonExamples.js.map +1 -0
- package/dist/frontend/components/app/themes/ThemePicker.d.ts +11 -0
- package/dist/frontend/components/app/themes/ThemePicker.js +47 -0
- package/dist/frontend/components/app/themes/ThemePicker.js.map +1 -0
- package/dist/frontend/components/app/themes/ThemedButton.d.ts +9 -0
- package/dist/frontend/components/app/themes/ThemedButton.js +43 -0
- package/dist/frontend/components/app/themes/ThemedButton.js.map +1 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.d.ts +8 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.js +54 -0
- package/dist/frontend/components/code_mirror/BatchInputEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/CodeEditor.d.ts +24 -0
- package/dist/frontend/components/code_mirror/CodeEditor.js +205 -0
- package/dist/frontend/components/code_mirror/CodeEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.d.ts +20 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js +99 -0
- package/dist/frontend/components/code_mirror/CodeMirrorEditor.js.map +1 -0
- package/dist/frontend/components/code_mirror/Extensions.d.ts +15 -0
- package/dist/frontend/components/code_mirror/Extensions.js +169 -0
- package/dist/frontend/components/code_mirror/Extensions.js.map +1 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.d.ts +5 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.js +109 -0
- package/dist/frontend/components/code_mirror/MaterialTheme.js.map +1 -0
- package/dist/frontend/components/code_runner/ButtonLint.d.ts +9 -0
- package/dist/frontend/components/code_runner/ButtonLint.js +76 -0
- package/dist/frontend/components/code_runner/ButtonLint.js.map +1 -0
- package/dist/frontend/components/code_runner/Code.d.ts +7 -0
- package/dist/frontend/components/code_runner/Code.js +46 -0
- package/dist/frontend/components/code_runner/Code.js.map +1 -0
- package/dist/frontend/components/code_runner/RunState.d.ts +7 -0
- package/dist/frontend/components/code_runner/RunState.js +41 -0
- package/dist/frontend/components/code_runner/RunState.js.map +1 -0
- package/dist/frontend/components/input/BatchInput.d.ts +9 -0
- package/dist/frontend/components/input/BatchInput.js +53 -0
- package/dist/frontend/components/input/BatchInput.js.map +1 -0
- package/dist/frontend/components/input/InteractiveInput.d.ts +13 -0
- package/dist/frontend/components/input/InteractiveInput.js +73 -0
- package/dist/frontend/components/input/InteractiveInput.js.map +1 -0
- package/dist/frontend/state/Constants.d.ts +38 -0
- package/dist/frontend/state/Constants.js +108 -0
- package/dist/frontend/state/Constants.js.map +1 -0
- package/dist/frontend/state/Debugger.d.ts +23 -0
- package/dist/frontend/state/Debugger.js +84 -0
- package/dist/frontend/state/Debugger.js.map +1 -0
- package/dist/frontend/state/Examples.d.ts +11 -0
- package/dist/frontend/state/Examples.js +36 -0
- package/dist/frontend/state/Examples.js.map +1 -0
- package/dist/frontend/state/I18n.d.ts +16 -0
- package/dist/frontend/state/I18n.js +75 -0
- package/dist/frontend/state/I18n.js.map +1 -0
- package/dist/frontend/state/InputOutput.d.ts +64 -0
- package/dist/frontend/state/InputOutput.js +133 -0
- package/dist/frontend/state/InputOutput.js.map +1 -0
- package/dist/frontend/state/Papyros.d.ts +32 -0
- package/dist/frontend/state/Papyros.js +93 -0
- package/dist/frontend/state/Papyros.js.map +1 -0
- package/dist/frontend/state/Runner.d.ts +118 -0
- package/dist/frontend/state/Runner.js +334 -0
- package/dist/frontend/state/Runner.js.map +1 -0
- package/dist/frontend/state/Test.d.ts +11 -0
- package/dist/frontend/state/Test.js +59 -0
- package/dist/frontend/state/Test.js.map +1 -0
- package/dist/frontend/state/Translations.d.ts +178 -0
- package/dist/frontend/state/Translations.js +188 -0
- package/dist/frontend/state/Translations.js.map +1 -0
- package/dist/frontend/state/themes/blue-dark.d.ts +2 -0
- package/dist/frontend/state/themes/blue-dark.js +55 -0
- package/dist/frontend/state/themes/blue-dark.js.map +1 -0
- package/dist/frontend/state/themes/blue-light.d.ts +2 -0
- package/dist/frontend/state/themes/blue-light.js +55 -0
- package/dist/frontend/state/themes/blue-light.js.map +1 -0
- package/dist/frontend/state/themes/green-dark.d.ts +2 -0
- package/dist/frontend/state/themes/green-dark.js +55 -0
- package/dist/frontend/state/themes/green-dark.js.map +1 -0
- package/dist/frontend/state/themes/green-light.d.ts +2 -0
- package/dist/frontend/state/themes/green-light.js +55 -0
- package/dist/frontend/state/themes/green-light.js.map +1 -0
- package/dist/frontend/state/themes/red-dark.d.ts +2 -0
- package/dist/frontend/state/themes/red-dark.js +55 -0
- package/dist/frontend/state/themes/red-dark.js.map +1 -0
- package/dist/frontend/state/themes/red-light.d.ts +2 -0
- package/dist/frontend/state/themes/red-light.js +55 -0
- package/dist/frontend/state/themes/red-light.js.map +1 -0
- package/dist/util/Util.d.ts +0 -43
- package/dist/util/Util.js +0 -91
- package/dist/util/Util.js.map +1 -1
- package/package.json +13 -26
- package/dist/App.d.ts +0 -1
- package/dist/App.js +0 -76
- package/dist/App.js.map +0 -1
- package/dist/Backend.js.map +0 -1
- package/dist/BackendEvent.js.map +0 -1
- package/dist/BackendEventQueue.js.map +0 -1
- package/dist/BackendManager.js.map +0 -1
- package/dist/CodeRunner.d.ts +0 -188
- package/dist/CodeRunner.js +0 -548
- package/dist/CodeRunner.js.map +0 -1
- package/dist/Constants.d.ts +0 -31
- package/dist/Constants.js +0 -36
- package/dist/Constants.js.map +0 -1
- package/dist/Debugger.d.ts +0 -18
- package/dist/Debugger.js +0 -86
- package/dist/Debugger.js.map +0 -1
- package/dist/InputManager.d.ts +0 -38
- package/dist/InputManager.js +0 -101
- package/dist/InputManager.js.map +0 -1
- package/dist/InputServiceWorker.js.map +0 -1
- package/dist/OutputManager.d.ts +0 -90
- package/dist/OutputManager.js +0 -172
- package/dist/OutputManager.js.map +0 -1
- package/dist/Papyros.css +0 -657
- package/dist/Papyros.d.ts +0 -141
- package/dist/Papyros.js +0 -268
- package/dist/Papyros.js.map +0 -1
- package/dist/Translations.d.ts +0 -180
- package/dist/Translations.js +0 -191
- package/dist/Translations.js.map +0 -1
- package/dist/editor/BatchInputEditor.d.ts +0 -41
- package/dist/editor/BatchInputEditor.js +0 -80
- package/dist/editor/BatchInputEditor.js.map +0 -1
- package/dist/editor/CodeEditor.d.ts +0 -81
- package/dist/editor/CodeEditor.js +0 -213
- package/dist/editor/CodeEditor.js.map +0 -1
- package/dist/editor/CodeMirrorEditor.d.ts +0 -133
- package/dist/editor/CodeMirrorEditor.js +0 -169
- package/dist/editor/CodeMirrorEditor.js.map +0 -1
- package/dist/editor/DarkTheme.d.ts +0 -1
- package/dist/editor/DarkTheme.js +0 -72
- package/dist/editor/DarkTheme.js.map +0 -1
- package/dist/editor/DebugExtension.d.ts +0 -11
- package/dist/editor/DebugExtension.js +0 -70
- package/dist/editor/DebugExtension.js.map +0 -1
- package/dist/editor/Gutters.d.ts +0 -109
- package/dist/editor/Gutters.js +0 -201
- package/dist/editor/Gutters.js.map +0 -1
- package/dist/editor/LineEffectExtension.d.ts +0 -13
- package/dist/editor/LineEffectExtension.js +0 -48
- package/dist/editor/LineEffectExtension.js.map +0 -1
- package/dist/editor/TestCodeExtension.d.ts +0 -21
- package/dist/editor/TestCodeExtension.js +0 -134
- package/dist/editor/TestCodeExtension.js.map +0 -1
- package/dist/examples/Examples.d.ts +0 -6
- package/dist/examples/Examples.js +0 -23
- package/dist/examples/Examples.js.map +0 -1
- package/dist/examples/JavaScriptExamples.js.map +0 -1
- package/dist/examples/PythonExamples.js.map +0 -1
- package/dist/input/BatchInputHandler.d.ts +0 -55
- package/dist/input/BatchInputHandler.js +0 -131
- package/dist/input/BatchInputHandler.js.map +0 -1
- package/dist/input/InteractiveInputHandler.d.ts +0 -27
- package/dist/input/InteractiveInputHandler.js +0 -89
- package/dist/input/InteractiveInputHandler.js.map +0 -1
- package/dist/input/UserInputHandler.d.ts +0 -68
- package/dist/input/UserInputHandler.js +0 -39
- package/dist/input/UserInputHandler.js.map +0 -1
- package/dist/util/HTMLShapes.d.ts +0 -15
- package/dist/util/HTMLShapes.js +0 -25
- package/dist/util/HTMLShapes.js.map +0 -1
- package/dist/util/Rendering.d.ts +0 -120
- package/dist/util/Rendering.js +0 -142
- package/dist/util/Rendering.js.map +0 -1
- package/dist/workers/input/InputWorker.js.map +0 -1
- package/dist/workers/javascript/JavaScriptWorker.js.map +0 -1
- package/dist/workers/javascript/worker.js.map +0 -1
- package/dist/workers/python/PythonWorker.js.map +0 -1
- package/dist/workers/python/python_package.tar.gz.load_by_url +0 -0
- package/dist/workers/python/worker.js.map +0 -1
- /package/dist/{workers → backend/workers}/javascript/JavaScriptWorker.d.ts +0 -0
- /package/dist/{workers → backend/workers}/javascript/worker.d.ts +0 -0
- /package/dist/{workers → backend/workers}/javascript/worker.js +0 -0
- /package/dist/{workers → backend/workers}/python/worker.d.ts +0 -0
- /package/dist/{workers → backend/workers}/python/worker.js +0 -0
- /package/dist/{BackendEvent.d.ts → communication/BackendEvent.d.ts} +0 -0
- /package/dist/{BackendEvent.js → communication/BackendEvent.js} +0 -0
- /package/dist/{InputServiceWorker.d.ts → communication/InputServiceWorker.d.ts} +0 -0
- /package/dist/{workers/input → communication}/InputWorker.d.ts +0 -0
- /package/dist/{workers/input → communication}/InputWorker.js +0 -0
- /package/dist/{examples → frontend/components/app/examples}/JavaScriptExamples.d.ts +0 -0
- /package/dist/{examples → frontend/components/app/examples}/JavaScriptExamples.js +0 -0
- /package/dist/{examples → frontend/components/app/examples}/PythonExamples.d.ts +0 -0
- /package/dist/{examples → frontend/components/app/examples}/PythonExamples.js +0 -0
package/README.md
CHANGED
|
@@ -12,113 +12,173 @@
|
|
|
12
12
|
</a>
|
|
13
13
|
</p>
|
|
14
14
|
|
|
15
|
-
Papyros is a programming scratchpad in the browser. It allows running code
|
|
16
|
-
|
|
17
|
-
By taking away obstacles between students and coding, the learning experience becomes
|
|
18
|
-
smoother and less error-prone.
|
|
15
|
+
Papyros is a programming scratchpad in the browser. It allows running code directly in your browser, no installation required.
|
|
16
|
+
Right now, the focus is on providing a great experience for Python, while also supporting JavaScript.
|
|
17
|
+
By taking away obstacles between students and coding, the learning experience becomes smoother and less error-prone.
|
|
19
18
|
|
|
20
19
|
Currently, Papyros provides support for the following programming languages:
|
|
21
20
|
- Python, powered by [Pyodide](https://pyodide.org/en/stable/)
|
|
22
21
|
- JavaScript, powered by your browser
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
---
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
- npm:
|
|
28
|
-
```shell
|
|
29
|
-
npm install @dodona/papyros
|
|
30
|
-
```
|
|
31
|
-
- yarn:
|
|
32
|
-
```shell
|
|
33
|
-
yarn add @dodona/papyros
|
|
34
|
-
```
|
|
25
|
+
## Try it Online
|
|
35
26
|
|
|
36
|
-
|
|
27
|
+
Start coding directly in your [browser](https://papyros.dodona.be/).
|
|
37
28
|
|
|
38
|
-
|
|
39
|
-
This includes extra UI elements to allow selecting a locale, a programming language, ...
|
|
29
|
+
---
|
|
40
30
|
|
|
41
|
-
|
|
42
|
-
as the user knows for what purpose Papyros is being used. For example, when used in the
|
|
43
|
-
scope of a Python exercise in Dodona, there is no need to support other programming languages.
|
|
44
|
-
The locale should also match that of the actual application.
|
|
31
|
+
## Use papyros in your project
|
|
45
32
|
|
|
46
|
-
|
|
47
|
-
Papyros instance with a `PapyrosConfig` object.
|
|
48
|
-
The following options are supported:
|
|
33
|
+
### Installation
|
|
49
34
|
|
|
50
|
-
|
|
51
|
-
- `programmingLanguage`: The [programming language](/src/ProgrammingLanguage.ts) to use in the CodeEditor and Backend.
|
|
52
|
-
- `locale`: The locale to use, currently English and Dutch translations are provided.
|
|
53
|
-
- `inputMode`: How the users can provide input, according to the [InputMode enum](/src/InputManager.ts)
|
|
54
|
-
- `example`: Optional name of the selected example, only appliccable in standAlone-mode
|
|
55
|
-
- `channelOptions`: Optional options to provide to the [sync-message](https://github.com/alexmojaki/sync-message) channel. Extra is the serviceWorkerName, which is the relative pathname to the service worker script
|
|
35
|
+
Install via npm or yarn:
|
|
56
36
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
- `outputOptions`: for the panel that displays the output of the code
|
|
37
|
+
```shell
|
|
38
|
+
npm install @dodona/papyros
|
|
39
|
+
# or
|
|
40
|
+
yarn add @dodona/papyros
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Setup input handling
|
|
65
44
|
|
|
66
|
-
|
|
45
|
+
Running interactive programs in the browser requires special handling of synchronous input.
|
|
46
|
+
Papyros supports two approaches (via [`sync-message`](https://github.com/alexmojaki/sync-message)):
|
|
67
47
|
|
|
68
|
-
|
|
69
|
-
|
|
48
|
+
#### COOP/COEP headers
|
|
49
|
+
Add the following HTTP headers to your server responses:
|
|
70
50
|
|
|
71
|
-
The most efficient and practical way is using SharedArrayBuffers, which requires the presence of certain HTTP headers.
|
|
72
|
-
The following headers must be set on resources using Papyros.
|
|
73
51
|
```yaml
|
|
74
52
|
{
|
|
75
53
|
"Cross-Origin-Opener-Policy": "same-origin",
|
|
76
54
|
"Cross-Origin-Embedder-Policy": "require-corp"
|
|
77
55
|
}
|
|
78
56
|
```
|
|
79
|
-
|
|
57
|
+
These headers are required to enable `SharedArrayBuffer`, which is the preferred way to handle synchronous input.
|
|
58
|
+
They need to be set on all assets that are loaded, including scripts, images, fonts, etc.
|
|
80
59
|
|
|
81
|
-
|
|
82
|
-
If
|
|
83
|
-
|
|
60
|
+
#### Service Worker
|
|
61
|
+
If you cannot set these headers, you can use a service worker to handle input.
|
|
62
|
+
We provide a compiled and minified version of the `InputServiceWorker` in the `dist` folder.
|
|
63
|
+
You need to serve this file from the root of your domain (i.e. `/input-sw.js`).
|
|
64
|
+
You can then register the service worker in your application before launching: `papyros.serviceWorkerName = 'input-sw.js';`.
|
|
84
65
|
|
|
85
|
-
|
|
66
|
+
---
|
|
86
67
|
|
|
87
|
-
|
|
88
|
-
- the [programming language](/src/ProgrammingLanguage.ts) of the contents (for e.g. syntax higlighting)
|
|
89
|
-
- the displayed placeholder
|
|
90
|
-
- the indentation unit
|
|
91
|
-
- the shown panel
|
|
92
|
-
- the autocompletion source
|
|
93
|
-
- the linting source
|
|
94
|
-
- the theme used to style the editor
|
|
68
|
+
## Usage
|
|
95
69
|
|
|
96
|
-
|
|
70
|
+
### Minimal setup
|
|
97
71
|
|
|
98
|
-
|
|
72
|
+
If you only want to use the state and runner logic without UI components:
|
|
99
73
|
|
|
100
|
-
|
|
74
|
+
```ts
|
|
75
|
+
import { papyros } from "@dodona/papyros";
|
|
101
76
|
|
|
102
|
-
|
|
77
|
+
papyros.launch(); // heavy operation, loads workers and Pyodide
|
|
78
|
+
papyros.runner.code = "print(input())";
|
|
103
79
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
80
|
+
papyros.io.subscribe(
|
|
81
|
+
() => (papyros.io.awaitingInput ? papyros.io.provideInput("foo") : ""),
|
|
82
|
+
"awaitingInput"
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
await papyros.runner.start();
|
|
86
|
+
console.log(papyros.runner.io.output[0].content);
|
|
107
87
|
```
|
|
108
88
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
89
|
+
### Minimal setup with components
|
|
90
|
+
|
|
91
|
+
Papyros provides four web components for visualization.
|
|
92
|
+
Each expects a `papyros` state instance, but defaults to the global `papyros`.
|
|
93
|
+
|
|
94
|
+
```html
|
|
95
|
+
<script type="module">
|
|
96
|
+
import { papyros } from "@dodona/papyros";
|
|
97
|
+
|
|
98
|
+
papyros.launch();
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<p-code-runner></p-code-runner>
|
|
102
|
+
<p-debugger></p-debugger>
|
|
103
|
+
<p-input></p-input>
|
|
104
|
+
<p-output></p-output>
|
|
112
105
|
```
|
|
113
106
|
|
|
114
|
-
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Theming
|
|
110
|
+
|
|
111
|
+
Papyros uses [Material Web Components](https://github.com/material-components/material-web) for buttons, inputs, sliders, etc.
|
|
112
|
+
All styling is driven by Material color system CSS variables (`--md-sys-color-...`).
|
|
113
|
+
Generate your own theme using the [Material Theme Builder](https://material-foundation.github.io/material-theme-builder/).
|
|
114
|
+
|
|
115
|
+
* Three example themes (light + dark) are provided via `papyros.constants.themes`.
|
|
116
|
+
* A theme picker component is available out of the box.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Structure
|
|
121
|
+
|
|
122
|
+
The codebase organized into clear layers:
|
|
123
|
+
|
|
124
|
+
* `backend`: code execution functionality (runs in Web Workers)
|
|
125
|
+
* `communication`: helpers to connect frontend and backend
|
|
126
|
+
* `frontend`: all browser-side code
|
|
127
|
+
* `state`: state management (e.g. execution state, debugger, input/output)
|
|
128
|
+
* `components`: visualization of that state, as Lit web components
|
|
129
|
+
|
|
130
|
+
### Components
|
|
131
|
+
|
|
132
|
+
#### `<p-code-runner>`
|
|
133
|
+
|
|
134
|
+
A [CodeMirror 6](https://codemirror.net/6/) editor to edit, run, and debug code.
|
|
135
|
+
Additional buttons can be added via the `.buttons` slot.
|
|
136
|
+
|
|
137
|
+
#### `<p-input>`
|
|
138
|
+
|
|
139
|
+
Lets users provide input (batch or interactive), passed to `papyros.io`.
|
|
140
|
+
|
|
141
|
+
#### `<p-output>`
|
|
142
|
+
|
|
143
|
+
Visualizes program output: stdout, stderr, and images.
|
|
144
|
+
|
|
145
|
+
#### `<p-debugger>`
|
|
146
|
+
|
|
147
|
+
Displays execution traces using [`@dodona/json-tracer`](https://github.com/dodona-edu/json-tracer).
|
|
148
|
+
|
|
149
|
+
### State API
|
|
150
|
+
|
|
151
|
+
A `Papyros` instance contains multiple logical parts:
|
|
152
|
+
|
|
153
|
+
* `papyros.constants`: general settings, constants, and themes (can be overridden).
|
|
154
|
+
* `papyros.debugger`: debug frames and currently active frame.
|
|
155
|
+
* `papyros.examples`: available code examples.
|
|
156
|
+
* `papyros.i18n`: translations (extend or override as needed).
|
|
157
|
+
* `papyros.io`: input/output handling. Subscribe to `awaitingInput` to supply input when needed.
|
|
158
|
+
* `papyros.runner`: code, execution state, programming language. Run code with `papyros.runner.start()`.
|
|
159
|
+
* `papyros.test`: test code (appended to the code document).
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Development
|
|
164
|
+
|
|
115
165
|
```shell
|
|
166
|
+
# Clone the repository:
|
|
167
|
+
git clone git@github.com:dodona-edu/papyros.git
|
|
168
|
+
cd papyros
|
|
169
|
+
# Install dependencies:
|
|
170
|
+
yarn install
|
|
171
|
+
# Build the python packages:
|
|
172
|
+
yarn setup
|
|
173
|
+
# Start a local server with live reload:
|
|
116
174
|
yarn start
|
|
117
175
|
```
|
|
118
176
|
|
|
119
|
-
|
|
120
|
-
You can view the results in your browser by visting http://localhost:8080.
|
|
121
|
-
|
|
122
|
-
## Try it online
|
|
177
|
+
## Publishing
|
|
123
178
|
|
|
124
|
-
|
|
179
|
+
```shell
|
|
180
|
+
# Build as library
|
|
181
|
+
yarn build:lib
|
|
182
|
+
# Publish to npm
|
|
183
|
+
yarn publish
|
|
184
|
+
```
|
package/dist/Library.d.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { Papyros,
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
1
|
+
import "./frontend/components/Input";
|
|
2
|
+
import "./frontend/components/Output";
|
|
3
|
+
import "./frontend/components/CodeRunner";
|
|
4
|
+
import "./frontend/components/Debugger";
|
|
5
|
+
import { Papyros, papyros } from "./frontend/state/Papyros";
|
|
6
|
+
import { InputMode } from "./frontend/state/InputOutput";
|
|
7
|
+
import { RunMode } from "./backend/Backend";
|
|
8
8
|
import { ProgrammingLanguage } from "./ProgrammingLanguage";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
export type {
|
|
12
|
-
export { Papyros, ProgrammingLanguage, BackendManager, CodeEditor, CodeRunner, RunState, InputManager, InputMode, OutputManager };
|
|
9
|
+
import { OutputType, FriendlyError } from "./frontend/state/InputOutput";
|
|
10
|
+
export { Papyros, InputMode, RunMode, ProgrammingLanguage, OutputType, papyros };
|
|
11
|
+
export type { FriendlyError };
|
package/dist/Library.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
1
|
+
import "./frontend/components/Input";
|
|
2
|
+
import "./frontend/components/Output";
|
|
3
|
+
import "./frontend/components/CodeRunner";
|
|
4
|
+
import "./frontend/components/Debugger";
|
|
5
|
+
import { Papyros, papyros } from "./frontend/state/Papyros";
|
|
6
|
+
import { InputMode } from "./frontend/state/InputOutput";
|
|
7
|
+
import { RunMode } from "./backend/Backend";
|
|
7
8
|
import { ProgrammingLanguage } from "./ProgrammingLanguage";
|
|
8
|
-
|
|
9
|
+
import { OutputType } from "./frontend/state/InputOutput";
|
|
10
|
+
export { Papyros, InputMode, RunMode, ProgrammingLanguage, OutputType, papyros };
|
|
9
11
|
//# sourceMappingURL=Library.js.map
|
package/dist/Library.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Library.js","sourceRoot":"","sources":["../src/Library.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Library.js","sourceRoot":"","sources":["../src/Library.ts"],"names":[],"mappings":"AAAA,OAAO,6BAA6B,CAAC;AACrC,OAAO,8BAA8B,CAAC;AACtC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAiB,MAAM,8BAA8B,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { BackendEvent } from "
|
|
1
|
+
import { BackendEvent } from "../communication/BackendEvent";
|
|
2
2
|
import { SyncExtras } from "comsync";
|
|
3
|
-
import { BackendEventQueue } from "
|
|
3
|
+
import { BackendEventQueue } from "../communication/BackendEventQueue";
|
|
4
4
|
export interface WorkerDiagnostic {
|
|
5
5
|
/**
|
|
6
6
|
* 1-based index of the starting line containing the issue
|
|
@@ -60,10 +60,9 @@ export declare abstract class Backend<Extras extends SyncExtras = SyncExtras> {
|
|
|
60
60
|
/**
|
|
61
61
|
* Initialize the backend by doing all setup-related work
|
|
62
62
|
* @param {function(BackendEvent):void} onEvent Callback for when events occur
|
|
63
|
-
* @param {function():void} onOverflow Callback for when overflow occurs
|
|
64
63
|
* @return {Promise<void>} Promise of launching
|
|
65
64
|
*/
|
|
66
|
-
launch(onEvent: (e: BackendEvent) => void
|
|
65
|
+
launch(onEvent: (e: BackendEvent) => void): Promise<void>;
|
|
67
66
|
/**
|
|
68
67
|
* Determine whether the modes supported by this Backend are active
|
|
69
68
|
* @param {string} code The current code in the editor
|
|
@@ -83,14 +82,6 @@ export declare abstract class Backend<Extras extends SyncExtras = SyncExtras> {
|
|
|
83
82
|
* @param {string} code The code to lint
|
|
84
83
|
*/
|
|
85
84
|
abstract lintCode(code: string): Promise<Array<WorkerDiagnostic>>;
|
|
86
|
-
/**
|
|
87
|
-
* @return {boolean} Whether too many output events were generated
|
|
88
|
-
*/
|
|
89
|
-
hasOverflow(): boolean;
|
|
90
|
-
/**
|
|
91
|
-
* @return {Array<BackendEvent>} The events that happened after overflow
|
|
92
|
-
*/
|
|
93
|
-
getOverflow(): Array<BackendEvent>;
|
|
94
85
|
/**
|
|
95
86
|
* Provide files to be used by the backend
|
|
96
87
|
* @param {Record<string, string>} inlineFiles Map of file names to their contents
|
|
@@ -7,9 +7,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { BackendEventType } from "
|
|
10
|
+
import { BackendEventType } from "../communication/BackendEvent";
|
|
11
11
|
import { syncExpose } from "comsync";
|
|
12
|
-
import { BackendEventQueue } from "
|
|
12
|
+
import { BackendEventQueue } from "../communication/BackendEventQueue";
|
|
13
13
|
export var RunMode;
|
|
14
14
|
(function (RunMode) {
|
|
15
15
|
RunMode["Run"] = "run";
|
|
@@ -39,10 +39,9 @@ export class Backend {
|
|
|
39
39
|
/**
|
|
40
40
|
* Initialize the backend by doing all setup-related work
|
|
41
41
|
* @param {function(BackendEvent):void} onEvent Callback for when events occur
|
|
42
|
-
* @param {function():void} onOverflow Callback for when overflow occurs
|
|
43
42
|
* @return {Promise<void>} Promise of launching
|
|
44
43
|
*/
|
|
45
|
-
launch(onEvent
|
|
44
|
+
launch(onEvent) {
|
|
46
45
|
return __awaiter(this, void 0, void 0, function* () {
|
|
47
46
|
this.onEvent = (e) => {
|
|
48
47
|
onEvent(e);
|
|
@@ -53,7 +52,7 @@ export class Backend {
|
|
|
53
52
|
return this.extras.readMessage();
|
|
54
53
|
}
|
|
55
54
|
};
|
|
56
|
-
this.queue = new BackendEventQueue(this.onEvent.bind(this)
|
|
55
|
+
this.queue = new BackendEventQueue(this.onEvent.bind(this));
|
|
57
56
|
return Promise.resolve();
|
|
58
57
|
});
|
|
59
58
|
}
|
|
@@ -66,18 +65,6 @@ export class Backend {
|
|
|
66
65
|
runModes(code) {
|
|
67
66
|
return [];
|
|
68
67
|
}
|
|
69
|
-
/**
|
|
70
|
-
* @return {boolean} Whether too many output events were generated
|
|
71
|
-
*/
|
|
72
|
-
hasOverflow() {
|
|
73
|
-
return this.queue.hasOverflow();
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* @return {Array<BackendEvent>} The events that happened after overflow
|
|
77
|
-
*/
|
|
78
|
-
getOverflow() {
|
|
79
|
-
return this.queue.getOverflow();
|
|
80
|
-
}
|
|
81
68
|
/**
|
|
82
69
|
* Provide files to be used by the backend
|
|
83
70
|
* @param {Record<string, string>} inlineFiles Map of file names to their contents
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Backend.js","sourceRoot":"","sources":["../../src/backend/Backend.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAgB,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AA8BvE,MAAM,CAAN,IAAY,OAIX;AAJD,WAAY,OAAO;IACf,sBAAW,CAAA;IACX,0BAAe,CAAA;IACf,8BAAmB,CAAA;AACvB,CAAC,EAJW,OAAO,KAAP,OAAO,QAIlB;AAED,MAAM,OAAgB,OAAO;IAczB;;;;OAIG;IACH;QACI,IAAI,CAAC,MAAM,GAAG,EAAY,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE;YAChB,+BAA+B;QACnC,CAAC,CAAC;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,EAAuB,CAAC;IACzC,CAAC;IAED;;OAEG;IACO,UAAU;QAChB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACU,MAAM,CACf,OAAkC;;YAElC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAe,EAAE,EAAE;gBAC/B,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBACpC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;qBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACrC,CAAC;YACL,CAAC,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;KAAA;IAED;;;;OAIG;IACH,6DAA6D;IACtD,QAAQ,CAAC,IAAY;QACxB,OAAO,EAAE,CAAC;IACd,CAAC;IAiBD;;;;;OAKG;IACH,6DAA6D;IACtD,YAAY,CAAC,WAAmC,EAAE,SAAiC;QACtF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ"}
|
|
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { Backend } from "../../Backend";
|
|
11
|
-
import { BackendEventType } from "
|
|
11
|
+
import { BackendEventType } from "../../../communication/BackendEvent";
|
|
12
12
|
/**
|
|
13
13
|
* Implementation of a JavaScript backend for Papyros
|
|
14
14
|
* by using eval and overriding some builtins
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JavaScriptWorker.js","sourceRoot":"","sources":["../../../../src/backend/workers/javascript/JavaScriptWorker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/backend/workers/javascript/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;AACtC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Backend, RunMode, WorkerDiagnostic } from "../../Backend";
|
|
2
|
-
import { BackendEvent } from "
|
|
2
|
+
import { BackendEvent } from "../../../communication/BackendEvent";
|
|
3
3
|
import { PyodideExtras } from "pyodide-worker-runner";
|
|
4
4
|
/**
|
|
5
5
|
* Implementation of a Python backend for Papyros
|
|
@@ -19,7 +19,7 @@ export declare class PythonWorker extends Backend<PyodideExtras> {
|
|
|
19
19
|
*/
|
|
20
20
|
protected syncExpose(): any;
|
|
21
21
|
private static getPyodide;
|
|
22
|
-
launch(onEvent: (e: BackendEvent) => void
|
|
22
|
+
launch(onEvent: (e: BackendEvent) => void): Promise<void>;
|
|
23
23
|
/**
|
|
24
24
|
* Helper method to install imports and prevent race conditions with double downloading
|
|
25
25
|
* @param {string} code The code containing import statements
|
|
@@ -35,12 +35,12 @@ export class PythonWorker extends Backend {
|
|
|
35
35
|
return yield loadPyodideAndPackage({ url: pythonPackageUrl, format: ".tgz" });
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
launch(onEvent
|
|
38
|
+
launch(onEvent) {
|
|
39
39
|
const _super = Object.create(null, {
|
|
40
40
|
launch: { get: () => super.launch }
|
|
41
41
|
});
|
|
42
42
|
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
yield _super.launch.call(this, onEvent
|
|
43
|
+
yield _super.launch.call(this, onEvent);
|
|
44
44
|
this.pyodide = yield PythonWorker.getPyodide();
|
|
45
45
|
// Python calls our function with a PyProxy dict or a Js Map,
|
|
46
46
|
// These must be converted to a PapyrosEvent (JS Object) to allow message passing
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PythonWorker.js","sourceRoot":"","sources":["../../../../src/backend/workers/python/PythonWorker.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../src/backend/workers/python/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackendEvent.js","sourceRoot":"","sources":["../../src/communication/BackendEvent.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,gBAYX;AAZD,WAAY,gBAAgB;IACxB,mCAAe,CAAA;IACf,+BAAW,CAAA;IACX,mCAAe,CAAA;IACf,qCAAiB,CAAA;IACjB,mCAAe,CAAA;IACf,mCAAe,CAAA;IACf,2CAAuB,CAAA;IACvB,uCAAmB,CAAA;IACnB,mCAAe,CAAA;IACf,gDAA4B,CAAA;IAC5B,iCAAa,CAAA;AACjB,CAAC,EAZW,gBAAgB,KAAhB,gBAAgB,QAY3B"}
|
|
@@ -9,10 +9,6 @@ export declare class BackendEventQueue {
|
|
|
9
9
|
* Function to process events in the queue
|
|
10
10
|
*/
|
|
11
11
|
private callback;
|
|
12
|
-
/**
|
|
13
|
-
* The maximal amount of output events to send before overflowing
|
|
14
|
-
*/
|
|
15
|
-
private limit;
|
|
16
12
|
/**
|
|
17
13
|
* The time in milliseconds before sending events through
|
|
18
14
|
*/
|
|
@@ -21,37 +17,19 @@ export declare class BackendEventQueue {
|
|
|
21
17
|
* Queue storing the BackendEvents before flushing
|
|
22
18
|
*/
|
|
23
19
|
private queue;
|
|
24
|
-
/**
|
|
25
|
-
* Queue storing Output-events after overflowing
|
|
26
|
-
*/
|
|
27
|
-
private overflow;
|
|
28
|
-
/**
|
|
29
|
-
* Callback for when overflow occurs
|
|
30
|
-
*/
|
|
31
|
-
private onOverflow;
|
|
32
|
-
/**
|
|
33
|
-
* Keep track whether the queue reached its limit this run
|
|
34
|
-
*/
|
|
35
|
-
private overflown;
|
|
36
20
|
/**
|
|
37
21
|
* Time in milliseconds when the last flush occurred
|
|
38
22
|
*/
|
|
39
23
|
private lastFlushTime;
|
|
40
|
-
/**
|
|
41
|
-
* Amount of BackendEvents sent through this run
|
|
42
|
-
*/
|
|
43
|
-
private sendCount;
|
|
44
24
|
/**
|
|
45
25
|
* Decoder to convert data to strings
|
|
46
26
|
*/
|
|
47
27
|
private decoder;
|
|
48
28
|
/**
|
|
49
29
|
* @param {function(BackendEvent):void} callback Function to process events in the queue
|
|
50
|
-
* @param {function():void} onOverflow Callback for when overflow occurs
|
|
51
|
-
* @param {number} limit The maximal amount of output lines to send before overflowing
|
|
52
30
|
* @param {number} flushTime The time in milliseconds before sending events through
|
|
53
31
|
*/
|
|
54
|
-
constructor(callback: (e: BackendEvent) => void,
|
|
32
|
+
constructor(callback: (e: BackendEvent) => void, flushTime?: number);
|
|
55
33
|
/**
|
|
56
34
|
* Add an element to the queue
|
|
57
35
|
* @param {BackendEventType} type The type of the event
|
|
@@ -70,23 +48,10 @@ export declare class BackendEventQueue {
|
|
|
70
48
|
* Reset the queue contents for a new run
|
|
71
49
|
*/
|
|
72
50
|
reset(): void;
|
|
73
|
-
/**
|
|
74
|
-
* @param {BackendEvent} e The event put in the queue
|
|
75
|
-
* @return {number} The amount of lines of data in the event
|
|
76
|
-
*/
|
|
77
|
-
private static lines;
|
|
78
51
|
/**
|
|
79
52
|
* Flush the queue contents using the callback
|
|
80
53
|
*/
|
|
81
54
|
flush(): void;
|
|
82
|
-
/**
|
|
83
|
-
* @return {boolean} Whether too many output events were generated
|
|
84
|
-
*/
|
|
85
|
-
hasOverflow(): boolean;
|
|
86
|
-
/**
|
|
87
|
-
* @return {Array<BackendEvent>} The events that happened after overflow
|
|
88
|
-
*/
|
|
89
|
-
getOverflow(): Array<BackendEvent>;
|
|
90
55
|
/**
|
|
91
56
|
* @param {Function} callback The event-consuming callback
|
|
92
57
|
*/
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { BackendEventType } from "./BackendEvent";
|
|
2
1
|
/**
|
|
3
2
|
* Queue to limit the amount of messages sent between threads
|
|
4
3
|
* This prevents communication issues which arise either in Comlink
|
|
@@ -7,20 +6,13 @@ import { BackendEventType } from "./BackendEvent";
|
|
|
7
6
|
export class BackendEventQueue {
|
|
8
7
|
/**
|
|
9
8
|
* @param {function(BackendEvent):void} callback Function to process events in the queue
|
|
10
|
-
* @param {function():void} onOverflow Callback for when overflow occurs
|
|
11
|
-
* @param {number} limit The maximal amount of output lines to send before overflowing
|
|
12
9
|
* @param {number} flushTime The time in milliseconds before sending events through
|
|
13
10
|
*/
|
|
14
|
-
constructor(callback,
|
|
11
|
+
constructor(callback, flushTime = 100) {
|
|
15
12
|
this.callback = callback;
|
|
16
|
-
this.limit = limit;
|
|
17
13
|
this.flushTime = flushTime;
|
|
18
14
|
this.queue = [];
|
|
19
|
-
this.overflow = [];
|
|
20
|
-
this.onOverflow = onOverflow;
|
|
21
|
-
this.overflown = false;
|
|
22
15
|
this.lastFlushTime = new Date().getTime();
|
|
23
|
-
this.sendCount = 0;
|
|
24
16
|
this.decoder = new TextDecoder();
|
|
25
17
|
}
|
|
26
18
|
/**
|
|
@@ -81,53 +73,18 @@ export class BackendEventQueue {
|
|
|
81
73
|
*/
|
|
82
74
|
reset() {
|
|
83
75
|
this.queue = [];
|
|
84
|
-
this.overflow = [];
|
|
85
|
-
this.overflown = false;
|
|
86
76
|
this.lastFlushTime = new Date().getTime();
|
|
87
|
-
this.sendCount = 0;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* @param {BackendEvent} e The event put in the queue
|
|
91
|
-
* @return {number} The amount of lines of data in the event
|
|
92
|
-
*/
|
|
93
|
-
static lines(e) {
|
|
94
|
-
return (e.data.match(/\n/g) || []).length + 1;
|
|
95
77
|
}
|
|
96
78
|
/**
|
|
97
79
|
* Flush the queue contents using the callback
|
|
98
80
|
*/
|
|
99
81
|
flush() {
|
|
100
82
|
this.queue.forEach(e => {
|
|
101
|
-
|
|
102
|
-
this.overflow.push(e);
|
|
103
|
-
if (this.sendCount < this.limit) {
|
|
104
|
-
this.sendCount += BackendEventQueue.lines(e);
|
|
105
|
-
this.callback(e);
|
|
106
|
-
}
|
|
107
|
-
else if (!this.overflown) {
|
|
108
|
-
this.overflown = true;
|
|
109
|
-
this.onOverflow();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
this.callback(e);
|
|
114
|
-
}
|
|
83
|
+
this.callback(e);
|
|
115
84
|
});
|
|
116
85
|
this.queue = [];
|
|
117
86
|
this.lastFlushTime = new Date().getTime();
|
|
118
87
|
}
|
|
119
|
-
/**
|
|
120
|
-
* @return {boolean} Whether too many output events were generated
|
|
121
|
-
*/
|
|
122
|
-
hasOverflow() {
|
|
123
|
-
return this.overflown;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* @return {Array<BackendEvent>} The events that happened after overflow
|
|
127
|
-
*/
|
|
128
|
-
getOverflow() {
|
|
129
|
-
return this.overflow;
|
|
130
|
-
}
|
|
131
88
|
/**
|
|
132
89
|
* @param {Function} callback The event-consuming callback
|
|
133
90
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BackendEventQueue.js","sourceRoot":"","sources":["../../src/communication/BackendEventQueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Backend } from "
|
|
2
|
-
import { ProgrammingLanguage } from "
|
|
1
|
+
import { Backend } from "../backend/Backend";
|
|
2
|
+
import { ProgrammingLanguage } from "../ProgrammingLanguage";
|
|
3
3
|
import { BackendEvent, BackendEventType } from "./BackendEvent";
|
|
4
4
|
import { Channel } from "sync-message";
|
|
5
5
|
import { SyncClient } from "comsync";
|