diff --git a/.markdownlint.json b/.markdownlint.json index e40b1c0..8f5b873 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -7,5 +7,6 @@ "MD028": false, "MD029": false, "MD033": false, - "MD036": false + "MD036": false, + "MD038": false } diff --git a/README.md b/README.md index e09c99b..eb3ceb1 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * [Prepare environment](#21-prepare-environment) * [Install STH](#22-install-sth) 3. [Run your first Sequence](#3-run-your-first-sequence) - * [Review the package](#31-review-the-package) + * [Review the Sequence package](#31-review-the-sequence-package) * [Run the Sequence](#32-run-the-sequence) 4. [Where to go next](#4-where-to-go-next) 5. [User's dictionary](#5-users-dictionary) @@ -61,22 +61,22 @@ We named our apps "Sequences" and that term describes well its nature, as they p
-The core part of our STH engine is called the "host". +The core part of our STH engine is called the "Hub".
- Host + Hub -**Host** is responsible for maintaining and deploying Sequences, keeping them running and managing its lifecycle. +**Hub** is responsible for maintaining and deploying Sequences, keeping them running and managing its lifecycle. -Host exposes also its own REST API to provide and receive data and manage Sequences and host itself. +Hub exposes also its own REST API to provide and receive data and manage Sequences and Hub itself. -What we also do on the host level is that we apply a set of algorithms to optimize and speed up data processing execution in Sequences. +What we also do on the Hub level is that we apply a set of algorithms to optimize and speed up data processing execution in Sequences. > We call our processing optimization algorithms **"IFCA"** meaning "Intelligent Function Composition Algorithms". -You can interact with host using our dedicated STH CLI that will help you with Sequences deployment, running and monitoring. +You can interact with Hub using our dedicated STH CLI that will help you with Sequences deployment, running and monitoring.

Our vanilla STH engine is based on Node.js and thus allows developers to benefit from its rich ecosystem, numerous packages and solutions provided by this vibrant community. @@ -103,16 +103,17 @@ Our vanilla STH engine is based on Node.js and thus allows developers to benefit
- Host + Hub This is a solution for the central processing and management unit with the following major components: -1. **Sequences** - these are the actual "STH" apps. It is a package containing at least two files: - * **package.json** - JSON manifest file describing the app and its configuration; such as main file to run - * **main file** - file such as `index.js` or `index.ts` that contains a lightweight application business logic. -2. **Instance** - once a Sequence is run, the host will create a separate runtime environment for it and will execute Sequence code inside this runtime entity. This is an Instance. -3. **API & CLI** - our Application Programming Interface and CLI connecting to it allows both for **Data operations** (sending input data and receiving output data) and **Management operations** (manage host itself and its entities: Sequences or Instances) +1. **Sequence** - a user's program to be executed on the Hub, that contains a developer's code that consists of one or more functions with a lightweight application business logic. It needs to be packed into a package together with its dependencies (compressed into `tar.gz` format) before sending it to STH. +2. **Instance** - once a Sequence is run, the Hub will create a separate runtime environment for it and will execute Sequence code inside this runtime entity. This is an Instance. +3. **API & CLI** - our Application Programming Interface and Command Line Interface that allow for: + + * **Data operations** - sending input data and receiving output data + * **Management operations** - manage Hub itself and its entities: Sequences or Instances
@@ -158,21 +159,17 @@ npm i -g @scramjet/sth @scramjet/cli scramjet-transform-hub ``` -> 💡 **HINT:** There is also an alias for running STH: -> ->```bash ->sth ->``` +> 💡 **HINT:** There is also an alias for running STH: `sth` More detailed installation instructions can be found in our [STH GitHub repository](https://github.com/scramjetorg/transform-hub//HEAD/#installation-clamp). ## **3. Run your first Sequence** -### **3.1 Review the package** +### **3.1 Review the Sequence package** -Before running your first Sequence let's have a quick look what's inside the Sequence package. +Before running the Sequence let's have a quick look what's inside the Sequence package. -We have prepared for you a simple JavaScript sample Sequence "hello-snowman". This Sequence is available in the directory `samples/hello-snowman` in this repository. In this directory you will find two files: +We have prepared for you a simple JavaScript sample Sequence "hello-snowman". This Sequence is available in the directory [samples/hello-snowman](./samples/hello-snowman/) in this repository. In this directory you will find two files: * `package.json` - manifest file that describes this particular Sequence * `index.js` - file containing main application logic. @@ -185,16 +182,16 @@ There is no need to change anything in our `hello-snowman` Sequence for a first ### **3.2 Run the Sequence** -There are 4 steps to follow in order to run the example Sequence: +There are 5 steps to follow in order to run the example Sequence:
- 1. Pack your Sequence into a package + 1. Pack your Sequence into a *.tar.gz package -Every "Sequence" app needs to be packaged (compressed) before sending to the Transform Hub. Package is a simple TAR archive and our STH CLI has a special command to pack an app directory into a Sequence tarball. +Every Sequence app needs to be packaged (compressed) before sending to the Transform Hub. Package is a simple TAR archive and our STH CLI has a special command to pack an app directory into a Sequence tarball. -> 💡 **Note:** any time, you can display STH CLI help by issuing terminal command `si help` (for general help) or `si help` for specific command (ie. `si sequence help`) +> 💡 **Note:** any time, you can display STH CLI help by issuing terminal command `si help` (for general help). For more information on a specific command, type help + command-name (ie. `si sequence help`) Please open new terminal window (and keep the first one open with STH running). Then issue following commands in the root directory of this repository: @@ -213,7 +210,7 @@ There is no output shown in the terminal but you can verify with `ls` that tarba 2. Send the Sequence package -Send `hello-snowman.tar.gz` to the running host (default localhost API endpoint will be used by the CLI send command) by issuing following command: +Send `hello-snowman.tar.gz` to the running Hub (default localhost API endpoint will be used by the CLI send command) by issuing following command: ```bash si sequence send ./samples/hello-snowman.tar.gz @@ -221,7 +218,7 @@ si sequence send ./samples/hello-snowman.tar.gz > 💡 **Note:** if you receive reply: **Request ok: status: 422 Unprocessable Entity**, it means that STH Docker images are not yet pulled from DockerHub. Please wait 2-3 minutes and try to issue `si sequence send` command again. We are working on fixing this issue in the next STH release. Also, if you keep receiving docker errors you can start STH without docker: `scramjet-transform-hub --no-docker` -> If you encounter any problems or issues while using our platform, please visit our **[Troubleshooting](https://github.com/scramjetorg/transform-hub#troubleshooting-collision)** section, where some of the problems are already known and described. You can also log an issue/bug there. +> If you encounter any problems or issues while using our platform, please visit our **[Troubleshooting](https://github.com/scramjetorg/transform-hub#troubleshooting-collision)** section, where some of the problems are already known and described. You are also very welcome to [log an issue/bug](https://github.com/scramjetorg/transform-hub/issues/new/choose) on GitHub any time. The output will look similar to this one: @@ -240,11 +237,11 @@ SequenceClient { } ``` -Now we have uploaded Sequence to the host and host assigned to it a random ID (GUID), in this case our Sequence ID is: +Now we have uploaded Sequence to the Hub. Each time a Sequence is loaded into the Hub, a random ID (GUID) number is assigned to it, in this case our Sequence ID is: `_id: 'cf775cc1-105b-473d-b929-6885a0c2182c'` - Host also exposes REST API endpoint for each Sequence and this is also described in this response. + Hub also exposes REST API endpoint for each Sequence and this is also described in this response. Exposed Sequence ID allows us to move to the next step where we will start the Sequence. @@ -288,7 +285,7 @@ InstanceClient { } ``` -Sequence is an app template. Once it is up and running, it will become a new Instance. The Instance also receives its own ID (GUID). In this case the Instance ID is: +Once Sequence is up and running, it becomes an Instance. The Instance also receives its own unique ID (GUID). In this case the Instance ID is: `_id: 'e70222d1-acfc-4e00-b046-4a3a9481c53b'` @@ -344,7 +341,7 @@ OUTPUT| Snowman ⛄ is freezing 🥶 Winter is coming ❄️ ❄️ ❄️ ❄ Our Sequence generator app does two things here: * Sends stream of messages; each one containing number with temperature value -* Reads output from Host API that is generated by our `hello-snowman` Sequence +* Reads output from the Hub API that is generated by our `hello-snowman` Sequence Separately, you can also open a new terminal window and see log of this particular Instance with command `si instance log ` or by using alias `si instance log -`. In our case this would be: diff --git a/dictionary.md b/dictionary.md index bba3557..f3c9652 100644 --- a/dictionary.md +++ b/dictionary.md @@ -1,6 +1,6 @@ [Home](README.md) -# Dictionary :book: +# Dictionary 📖 The idea of dictionary is not new. This one is meant to bring closer the terminology that we use in our project. Even when we think that some word has a different meaning in the outside world, here we have description what it means in case of Scramjet Platform project. @@ -31,6 +31,10 @@ Collection of [sequences](#sequence) implementing a given business requirement d Application Interface is an interface exposed by [Sequence](#sequence) to communicate with the [Runner](runner) +### Arguments + +Instance parameters, also known as function arguments. They are passed to a Sequence during start and are used as Instance parameters, affecting how the Instance works. Specific handling of the parameters depends on the Sequence code. Arguments are optional, in particular, the Sequence might not require any arguments to be passed. + ### Artifact Artifacts are byproducts of software development, e.g. project diagrams, plans, etc. In fact, this dictionary is also an [artifact](https://en.wikipedia.org/wiki/Artifact_(software_development)) @@ -43,7 +47,7 @@ Asynchronous execution of operations allows multiple processes/functions to happ ### CLI -Command Line Interface. Command line tool to allows control over the platform +Command Line Interface. Command line tool that allows to control over the platform ### Client @@ -51,7 +55,11 @@ Client is a very multi meaning word so let's try not to use it. It is allowed in ### Compilation -Compilation is a process of transforming a source code written in any programming language(human readable) into machine code(machine language), which is executed by the computer +Compilation is a process of transforming a source code written in any programming language (human readable) into machine code (machine language), which is executed by the computer + +### Config + + ### Container @@ -111,7 +119,19 @@ ESLint is a tool for a static code analysis ([linter](#linter)). It identifies a ### Endpoint - +This is an API endpoint which can be considered as a specific point of entry and also a point that can be referenced by sending the requests. For example, it is very common to send a request to API endpoint to get certain data. + +### Event + +In the context of Scramjet Cloud Platform event is a [JSON](#json) message that you send to the [Instance](#instance), that is interpreted by the Instance logic - can be processed or affect how the Instance works (change parameters). Handling the Instance message is specific for the [Sequence](#sequence) and depends on your Sequence code. More general event definition and functionality is explained by [wiki](https://en.wikipedia.org/wiki/Event_(computing)) + +#### Event name + + + +#### Event message + + ## F ### Function @@ -126,9 +146,55 @@ Gherkin is a domain-specific programming language created to write behavior desc ## H +### Health Check + +Information about the health of Instance. It informs whether an Instance is running and what is its resource consumption. + +It can be accessed directly through Instance API, in the CLI or Panel. + +The Instance API health check endpoint is /health. The following is an example health check from the Instance obtained with curl: + +```bash +$ curl http://127.0.0.1:8000/api/v1/instance/e9432a4f-2a64-41a2-82f1-39503a2a18df/health |jq + % Total % Received % Xferd Average Speed Time Time Time Current + Dload Upload Total Spent Left Speed +100 226 0 226 0 0 220k 0 --:--:-- --:--:-- --:--:-- 220k +{ + "cpuTotalUsage": 223212751, + "healthy": true, + "limit": 536870912, + "memoryMaxUsage": 14352384, + "memoryUsage": 12136448, + "networkRx": 19852, + "networkTx": 20174, + "containerId": "df0aa7adf027465da1dfb08edd0a66dc8ffc8e0bd1f5d0fc7fafecbefdac72c6" +} +``` + +While the below is an example of health check from the same Instance but executed using the CLI interface: + +```bash +$ si inst health e9432a4f-2a64-41a2-82f1-39503a2a18df +Request ok: http://127.0.0.1:8000/api/v1/instance/e9432a4f-2a64-41a2-82f1-39503a2a18df/health status: 200 OK +{ + cpuTotalUsage: 203802417, + healthy: true, + limit: 536870912, + memoryMaxUsage: 14352384, + memoryUsage: 11980800, + networkRx: 16266, + networkTx: 15358, + containerId: 'df0aa7adf027465da1dfb08edd0a66dc8ffc8e0bd1f5d0fc7fafecbefdac72c6' +} +``` + ### Host -A set of [instances](#instance) installed on the single operating system (host) together with software that controls instances and allows communication with external elements of the system via protocols (e.g. http) +A set of instances installed on the single operating system (host) together with software that controls instances and allows communication with external elements of the system via protocols (e.g. http) + +- host - a source of information or signals. The term can refer to a computer, smartphone, tablet or any electronic device. In a network, clients (users' machines) and servers are hosts because they are both sources of information in contrast to network devices, such as routers and switches, which only direct traffic. + +- host program - software/program that runs in a computer that provides the source of information or signals. ## I @@ -138,7 +204,7 @@ An interface for managing the space in which the [prerunner](#prerunner) and [ru ### Instance -It is a running [sequence](#sequence). A bundle containing [runner](#runner) that runs a [sequence](#sequence) which is controlled by [supervisor](#supervisor). +An Instance (computing instance) is a [Sequence](#sequence) that has been run and is currently being executed on the Hub. As Sequence can be started multiple times (e.g. with different parameters) it means that every Instance is literally an instance of a Sequence. Instance also can process an enormous amount of data on the fly without losing persistence. Instance comes with its own [CLI](#cli), which you can explore in the [npm docs](https://www.npmjs.com/package/@scramjet/cli) or by using command `si inst help` (install CLI first -> `npm install -g @scramjet/cli`) ### Interface @@ -146,9 +212,7 @@ In the context of Object-Oriented Programming (OOP), it is a set of methods and ### Input -Input is a set of parameters/values that are passed to the function. - - +Input is a set of parameters/values that are passed to the function(s) defined in a [Sequence](#sequence). It is delivered to the [Instance](#instance) as a stream in any form of data (JSON, text, buffer, etc.). ### Image @@ -171,7 +235,8 @@ The image can exist without the container. A container needs an image to run it ### LifeCycle Controller (LCC) -Key [instance](#instance) element, [Supervisor's](#supervisor) component, supervising its work: + +Key [Instance](#instance) element, [Supervisor's](#supervisor) component, supervising its work: - receives a stream with a sequence from [CSH](#host), - passes this stream to [LiveCycle Docker Adapter](#lifecycle-docker-adapter-lcda) @@ -184,6 +249,7 @@ Key [instance](#instance) element, [Supervisor's](#supervisor) component, superv ### LifeCycle Docker Adapter (LCDA) + One of the [supervisor's](#supervisor) components. LCDA is an interface that inherits from [IlifeCycle](#ilifecycle-ilc), it is responsible for communication with Docker: - accepts stream with sequence from [LCC](#lifecycle-controller-lcc), @@ -201,19 +267,12 @@ Lifecycle Interface is an interface that lets [LifeCycle Controller](#lifecycle- ### Loadcheck + One of the [supervisor's](#supervisor) components, which is responsible for collecting information about the work status of an [instance](#instance) and forwarding it to [LCC](#lifecycle-controller-lcc) ## M -### Manager - -in the context of the Scramjet platform, Cloud Platform Manager is a host management software that provides service-discovery, controls the scaling of individual instances in accordance with the programmed logic and client configuration, providing [API](#api) - -### MultiHost - - -### MultiManager - + ## N @@ -227,10 +286,22 @@ in the context of the Scramjet platform, Cloud Platform Manager is a host manage ## P +### Package + +A folder archived in `tar.gz` format, which is ready to be sent to the Hub. Package contains: + +- [Sequence](#sequence) (e.g. `index.ts` or `main.js`, etc.), +- configuration file in [JSON](#json) format (named `package.json`) and, +- all the dependencies needed to run the program on the Hub + ### Platform Complete, default working environment for our users. Application, host and instance management center +### Port + +Port is a part of communication point. It is represented by a number and always associated with a host's IP address and the type of transport protocol used for communication. + ## R ### Routing @@ -247,10 +318,14 @@ Catching a query from the user and redirecting it to the appropriate API functio ### Runner -An executable written in one of the supported programming languages that starts the [sequence](#sequence) created by developer, inside the container controlled by the [supervisor](#supervisor) +An executable written in one of the supported programming languages that starts the [Sequence](#sequence) created by developer, inside the container ## S +### Scope + +A scope is a handy organization unit that lets a user switch between the currently used spaces and hubs. It is a named pair consisting of one space and one hub. This named pair is saved in the session config, which lets user work with different spaces and hubs sessions simultaneously. There can be multiple scopes, but only one can be used at once in a given session. + ### Scramjet Project as whole. Common misspell: __u__ instead of __a__. Beware! @@ -261,23 +336,26 @@ Software Development Kit. A collection of tools and libraries to create a softwa ### Sequence -It is a package (application) containing a set of files. A file with a manifest(eg. `package.json`), describing the app and its configuration (such as main file to run); and a __main file__ (eg. `index.js`, `app.ts`) that contains a developer's code that consists of chained functions with a lightweight application business logic. Minimal Sequence consists of 1 [function](#function). +A User's program to be executed on the Host, that contains a developer's code that consists of one or more [function](#function)s with a lightweight application business logic. It needs to be packed into a [Package](#package) together with its dependencies (compressed into `tar.gz` format) before sending it to [STH](#sth) ### Socket Socket is a kind of an endpoint in a two-way communication channel between the server and the receiving software (client). Typically the socket is used for a specific flow of events. In the case of the client-server model, the socket on the server listens when requested by the client. The client connects to the server through the socket. The socket can be a socket on the disk or it can be an IP socket - so you can actually serve HTTP API on your disk - for real! +### Space + + ### SSH [Secure Shell](https://en.wikipedia.org/wiki/SSH_(Secure_Shell)). It's a network cryptographic protocol -### stdin/stdout/stderr +### stdin/stdout/stderr -standard input/standard output. Application communication channels with the outside world (e.g. the console). Stdin allows you to enter information into an application (e.g. from the keyboard). stdout allows you to display messages from the application, e.g. on a monitor/printer, etc +standard input/standard output/standard error. Application communication channels with the outside world (e.g. the console). Stdin allows you to enter information into an application (e.g. from the keyboard). stdout allows you to display messages from the application, e.g. on a monitor/printer, etc., stderr is a channel which expose the effects of error handling in the application -### STH +### STH -shortcut for Scramjet Transform Hub +shortcut for Scramjet Transform Hub. It is a data processing engine for our Scramjet Cloud Platform ### Synchronous diff --git a/templates/README.md b/templates/README.md index cef6111..fa3c028 100644 --- a/templates/README.md +++ b/templates/README.md @@ -2,16 +2,18 @@ We have prepared for you some templates. User templates allow you to apply predefined settings to start building your own applications. Using templates, you can easily set up multiple applications with similar settings. -You can use it as a base for your own samples 👉 [sample template](https://github.com/scramjetorg/scramjet-cloud-docs/tree/HEAD/templates). For this moment we support two variants of template in two programming languages: +For this moment we support two variants of template in two programming languages: -- JavaScript (Node.js) 👉 [template](https://github.com/scramjetorg/scramjet-cloud-docs/tree/HEAD/templates/template-js) +- JavaScript (node) 👉 [template](https://github.com/scramjetorg/scramjet-cloud-docs/tree/HEAD/templates/template-js) - TypeScript (ts-node) 👉 [template](https://github.com/scramjetorg/scramjet-cloud-docs/tree/HEAD/templates/template-ts) In the following sections we will describe both templates' contents and show you how they can be used in your own project. +> 💡 **Note!** Please refer to methods and definitions described in [AppContext](/docs/types/AppContext) when writing a Sequence code. + ## Work with JavaScript (Node.js) -This application package template contains two files: +This application template contains two files: - **package.json** - this file holds all the important information about the project in plain JSON Object format. It contains human-readable metadata about the project (like the project name and description) as well as functional metadata like the package version number or dependencies required by the application.`package.json` file is one of the basic requirement to have in the root of every project. This is the heart of any Node.js project, used by the application to find its dependencies to install, scripts to run, etc. If you would like to start your project from scratch, without using our js-template, you would need to create a directory and run `npm init` inside. This command would create a `package.json` file for you with all the obligatory properties, for example: @@ -73,8 +75,8 @@ To see how this template works you can run it with a few simple commands written - `cd templates` - `si pack template-js` - `si seq send template-js.tar.gz` -- `si sequence start -` which is the same as `si sequence start ` -- `si q output -` which is the same as `si q output ` +- `si seq start -` which is the same as `si sequence start ` +- `si inst output -` which is the same as `si instance output ` #### 3️⃣ terminal: @@ -88,26 +90,24 @@ The command below will run the app in the background. The app generates random n What you can see in the attached image is 3 terminals that illustrates the template's workflow: -Terminal 1️⃣ shows the logs of running `scramjet-transform-hub` process. - -Terminal 2️⃣ shows the output of the program that we launched using STH CLI. - -Terminal 3️⃣ shows the output of the `node` command that runs the app which generates random numbers and sends them to the q's input. +- Terminal 1️⃣ shows the logs of running `scramjet-transform-hub` process. +- Terminal 2️⃣ shows the output of the program that we launched using STH CLI. +- Terminal 3️⃣ shows the output of the `node` command that runs the app which generates random numbers and sends them to the Instances's input. ## Work with TypeScript (ts-node) TypeScript compiles to JavaScript. It is a superset of JavaScript, which means that you can use all the features of JavaScript plus some new features and advantages of TypeScript, then compile it and get regular JavaScript. -This application package template contains files: +This application template contains files: -- **package.json** - function of this file is similar to `package.json` file in [JavaScript template](##Work-with-JavaScript-(Node.js)) with a small but ❗**VERY IMPORTANT**❗ difference. The file given in `"main"` property must be typed in without any extension, like in the example below. This is because this `package.json` will be copied into the `dist` directory, which eventually will be archived into a `.tar.gz` format and sent to the STH. +- **package.json** - function of this file is similar to `package.json` file in [JavaScript template](<##Work-with-JavaScript-(node)>). ```json { "name": "@template/template-ts", "private": true, "version": "1.0.0", - "main": "index", // the entry file MUST be named without any extension! + "main": "index.js", "description": "This package is a User's template for ts-node projects", "author": "Scramjet ", "license": "GPL-3.0", @@ -138,9 +138,9 @@ This application package template contains files: - **index.ts** - this is where you should put your code and all the logic of the application you create. It will be the entry point of your application. This file will be compiled into manila JavaScript and stores in `index.js` file in `dist` directory. -In our template we introduce you to a very straight forward application, which simply reads input stream and write it to the output stream. +In our template we introduce you to a very straight forward application, which simply reads input stream and writes to the output stream. -> 📖 In the example below we use `@scramjet/types` module. Scramjet is a very nice and functional stream programming framework. You might find it very useful while writing your app or dealing with streams in general. More info, examples and usage you can find [here](https://www.npmjs.com/package/scramjet). +> 📘 In the example below we use one of application type from [@scramjet/types](https://www.npmjs.com/package/@scramjet/types) module. Scramjet is a very nice and functional stream programming framework that you might find very useful while writing your app or dealing with streams in general. More read about Scramjet Framework and examples of usage you can find on [npm scramjet](https://www.npmjs.com/package/scramjet) or [GitHub](https://github.com/scramjetorg/scramjet). ```typescript import { ReadableApp } from "@scramjet/types"; @@ -179,7 +179,7 @@ To see how this template works you can run it with a few simple commands written > 💡 **Note!** To run this template you need to have those two packages installed: `npm install -g @scramjet/sth @scramjet/cli` -### **Open 3 terminals** and run the following commands and let the magic begin :magic_wand:: +### **Open 3 terminals** and run the following commands and let the magic begin ✨: #### 1️⃣ terminal: @@ -193,8 +193,8 @@ To see how this template works you can run it with a few simple commands written - `cp -r node_modules/ package.json dist/` - it copies node_modules and package.json to the dist folder - `si pack dist` - it creates a tar.gz archive of the dist folder - `si sequence send dist.tar.gz` - it sends the archive to STH -- `si sequence start ` - it starts the Sequence (started Sequence turns into Instance) -- `si inst output `- it shows the Instance's output stream in the terminal +- `si sequence start - ` - this command starts the Sequence (started Sequence turns into Instance) +- `si inst output - `- this command the Instance's output stream in the terminal #### 3️⃣ terminal: @@ -208,8 +208,6 @@ The command below will run the app in the background. The app generates random n What you can see in the attached image is 3 terminals that illustrates the template's workflow: -Terminal 1️⃣ shows the logs of running `scramjet-transform-hub` process. - -Terminal 2️⃣ shows the output of the program that we launched using STH CLI. - -Terminal 3️⃣ shows the output of the `node` command that runs the app which generates random numbers and sends them to the q's input. +- Terminal 1️⃣ shows the logs of running `scramjet-transform-hub` process. +- Terminal 2️⃣ shows the output of the program that we launched using STH CLI. +- Terminal 3️⃣ shows the output of the `node` command that runs the app which generates random numbers and sends them to the Instances's input.