|
|
|
@ -1,126 +1,157 @@
|
|
|
|
|
# Syndicate/js
|
|
|
|
|
|
|
|
|
|
A new, efficient implementation of Syndicate for JavaScript in both
|
|
|
|
|
node.js and the browser. The implementation techniques herein are the
|
|
|
|
|
subject of a forthcoming paper.
|
|
|
|
|
A third-generation implementation of Dataspaces and Syndicate for
|
|
|
|
|
TypeScript and JavaScript, in both node.js and the browser. The
|
|
|
|
|
implementation techniques herein are the subject of a forthcoming
|
|
|
|
|
paper.
|
|
|
|
|
|
|
|
|
|
## Quickstart
|
|
|
|
|
## Building
|
|
|
|
|
|
|
|
|
|
### Option 1. Create a new program/library using Syndicate/js.
|
|
|
|
|
This project uses [`yarn`](https://yarnpkg.com/), not `npm`.
|
|
|
|
|
|
|
|
|
|
Use `npx @syndicate-lang/create DIRECTORY` or `npm init
|
|
|
|
|
@syndicate-lang DIRECTORY`:
|
|
|
|
|
The repository is a monorepo, using
|
|
|
|
|
[yarn workspaces](https://classic.yarnpkg.com/en/docs/workspaces/).
|
|
|
|
|
[Lerna](https://lerna.js.org/) is used as a thin
|
|
|
|
|
[veneer atop yarn workspaces](https://medium.com/@jsilvax/a-workflow-guide-for-lerna-with-yarn-workspaces-60f97481149d),
|
|
|
|
|
providing convenient automation for package version management and
|
|
|
|
|
publication.
|
|
|
|
|
|
|
|
|
|
npm init @syndicate-lang myprogram
|
|
|
|
|
cd myprogram
|
|
|
|
|
npm i .
|
|
|
|
|
npm run build
|
|
|
|
|
node lib/index.js
|
|
|
|
|
After a checkout, run:
|
|
|
|
|
|
|
|
|
|
### Option 2. Add Syndicate/js to an existing program/library.
|
|
|
|
|
```shell
|
|
|
|
|
make bootstrap
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Install a few packages from the
|
|
|
|
|
[@syndicate-lang](https://www.npmjs.com/org/syndicate-lang) scope on
|
|
|
|
|
npmjs.com:
|
|
|
|
|
Alternatively, running:
|
|
|
|
|
|
|
|
|
|
npm i --save-dev @syndicate-lang/syntax @babel/preset-env
|
|
|
|
|
npm i --save @syndicate-lang/core
|
|
|
|
|
```shell
|
|
|
|
|
yarn install
|
|
|
|
|
./node_modules/.bin/lerna exec yarn prepare
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Then, add the `@syndicate-lang/syntax/plugin` to your `.babelrc`. Use
|
|
|
|
|
`npx syndicate-babel` in place of `npx babel` to compile your code.
|
|
|
|
|
will download and install all dependencies and then build all the
|
|
|
|
|
packages.
|
|
|
|
|
|
|
|
|
|
## Creating a new Syndicate/js project
|
|
|
|
|
## Licence
|
|
|
|
|
|
|
|
|
|
Create a skeletal `package.json`:
|
|
|
|
|
@syndicate-lang, an implementation of Syndicate for JS.
|
|
|
|
|
Copyright (C) 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
"main": "lib/index.js",
|
|
|
|
|
"scripts": {
|
|
|
|
|
"build": "npx syndicate-babel src --out-dir lib",
|
|
|
|
|
"clean": "rm -rf lib"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
|
|
The entry point will be `lib/index.js`; the corresponding *source*
|
|
|
|
|
file will be `src/index.js`.
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
Two `npm run` scripts are defined: one which compiles Syndicate/js
|
|
|
|
|
source files in `src` to plain JavaScript in `lib`. The compiler uses
|
|
|
|
|
Babel; we will configure Babel next.
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
Create a `.babelrc` file:
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
"presets": [ "@babel/preset-env" ],
|
|
|
|
|
"plugins": [ "@syndicate-lang/syntax/plugin" ]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Now, install the necessary dependencies. Babel and the Syndicate/js
|
|
|
|
|
extensions are needed at build-time:
|
|
|
|
|
<!-- ## Quickstart -->
|
|
|
|
|
|
|
|
|
|
npm i --save-dev @syndicate-lang/syntax @babel/preset-env
|
|
|
|
|
<!-- ### Option 1. Create a new program/library using Syndicate/js. -->
|
|
|
|
|
|
|
|
|
|
The Syndicate/js runtime and as many drivers as you would like to use
|
|
|
|
|
are needed at run-time:
|
|
|
|
|
<!-- Use `npx @syndicate-lang/create DIRECTORY` or `npm init -->
|
|
|
|
|
<!-- @syndicate-lang DIRECTORY`: -->
|
|
|
|
|
|
|
|
|
|
npm i --save @syndicate-lang/core
|
|
|
|
|
npm i --save @syndicate-lang/driver-timer
|
|
|
|
|
<!-- npm init @syndicate-lang myprogram -->
|
|
|
|
|
<!-- cd myprogram -->
|
|
|
|
|
<!-- npm i . -->
|
|
|
|
|
<!-- npm run build -->
|
|
|
|
|
<!-- node lib/index.js -->
|
|
|
|
|
|
|
|
|
|
Finally, create the main program file. Create a directory `src`, and
|
|
|
|
|
then a file `src/index.js`:
|
|
|
|
|
<!-- ### Option 2. Add Syndicate/js to an existing program/library. -->
|
|
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
|
const { TimeLaterThan } = activate require("@syndicate-lang/driver-timer");
|
|
|
|
|
<!-- Install a few packages from the -->
|
|
|
|
|
<!-- [@syndicate-lang](https://www.npmjs.com/org/syndicate-lang) scope on -->
|
|
|
|
|
<!-- npmjs.com: -->
|
|
|
|
|
|
|
|
|
|
spawn named 'ticker' {
|
|
|
|
|
field this.counter = 0;
|
|
|
|
|
field this.deadline = +(new Date());
|
|
|
|
|
<!-- npm i --save-dev @syndicate-lang/syntax @babel/preset-env -->
|
|
|
|
|
<!-- npm i --save @syndicate-lang/core -->
|
|
|
|
|
|
|
|
|
|
on start { console.log('ticker starting'); }
|
|
|
|
|
on stop { console.log('ticker stopping'); }
|
|
|
|
|
<!-- Then, add the `@syndicate-lang/syntax/plugin` to your `.babelrc`. Use -->
|
|
|
|
|
<!-- `npx syndicate-babel` in place of `npx babel` to compile your code. -->
|
|
|
|
|
|
|
|
|
|
on asserted TimeLaterThan(this.deadline) {
|
|
|
|
|
this.counter++;
|
|
|
|
|
console.log('tick', new Date(), this.counter);
|
|
|
|
|
this.deadline += 1000;
|
|
|
|
|
}
|
|
|
|
|
<!-- ## Creating a new Syndicate/js project -->
|
|
|
|
|
|
|
|
|
|
stop on (this.counter == 5);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
<!-- Create a skeletal `package.json`: -->
|
|
|
|
|
|
|
|
|
|
Now, compile the project:
|
|
|
|
|
<!-- { -->
|
|
|
|
|
<!-- "main": "lib/index.js", -->
|
|
|
|
|
<!-- "scripts": { -->
|
|
|
|
|
<!-- "build": "npx syndicate-babel src --out-dir lib", -->
|
|
|
|
|
<!-- "clean": "rm -rf lib" -->
|
|
|
|
|
<!-- } -->
|
|
|
|
|
<!-- } -->
|
|
|
|
|
|
|
|
|
|
npm run build
|
|
|
|
|
<!-- The entry point will be `lib/index.js`; the corresponding *source* -->
|
|
|
|
|
<!-- file will be `src/index.js`. -->
|
|
|
|
|
|
|
|
|
|
Finally, run the program:
|
|
|
|
|
<!-- Two `npm run` scripts are defined: one which compiles Syndicate/js -->
|
|
|
|
|
<!-- source files in `src` to plain JavaScript in `lib`. The compiler uses -->
|
|
|
|
|
<!-- Babel; we will configure Babel next. -->
|
|
|
|
|
|
|
|
|
|
node lib/index.js
|
|
|
|
|
<!-- Create a `.babelrc` file: -->
|
|
|
|
|
|
|
|
|
|
The output should be something like:
|
|
|
|
|
<!-- { -->
|
|
|
|
|
<!-- "presets": [ "@babel/preset-env" ], -->
|
|
|
|
|
<!-- "plugins": [ "@syndicate-lang/syntax/plugin" ] -->
|
|
|
|
|
<!-- } -->
|
|
|
|
|
|
|
|
|
|
ticker starting
|
|
|
|
|
tick 2018-11-05T14:23:27.713Z 1
|
|
|
|
|
tick 2018-11-05T14:23:28.705Z 2
|
|
|
|
|
tick 2018-11-05T14:23:29.706Z 3
|
|
|
|
|
tick 2018-11-05T14:23:30.706Z 4
|
|
|
|
|
tick 2018-11-05T14:23:31.707Z 5
|
|
|
|
|
ticker stopping
|
|
|
|
|
<!-- Now, install the necessary dependencies. Babel and the Syndicate/js -->
|
|
|
|
|
<!-- extensions are needed at build-time: -->
|
|
|
|
|
|
|
|
|
|
## Licence
|
|
|
|
|
<!-- npm i --save-dev @syndicate-lang/syntax @babel/preset-env -->
|
|
|
|
|
|
|
|
|
|
@syndicate-lang, an implementation of Syndicate for JS.
|
|
|
|
|
Copyright (C) 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
|
|
|
|
|
<!-- The Syndicate/js runtime and as many drivers as you would like to use -->
|
|
|
|
|
<!-- are needed at run-time: -->
|
|
|
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
|
|
|
|
<!-- npm i --save @syndicate-lang/core -->
|
|
|
|
|
<!-- npm i --save @syndicate-lang/driver-timer -->
|
|
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
<!-- Finally, create the main program file. Create a directory `src`, and -->
|
|
|
|
|
<!-- then a file `src/index.js`: -->
|
|
|
|
|
|
|
|
|
|
<!-- ```javascript -->
|
|
|
|
|
<!-- const { TimeLaterThan } = activate require("@syndicate-lang/driver-timer"); -->
|
|
|
|
|
|
|
|
|
|
<!-- spawn named 'ticker' { -->
|
|
|
|
|
<!-- field this.counter = 0; -->
|
|
|
|
|
<!-- field this.deadline = +(new Date()); -->
|
|
|
|
|
|
|
|
|
|
<!-- on start { console.log('ticker starting'); } -->
|
|
|
|
|
<!-- on stop { console.log('ticker stopping'); } -->
|
|
|
|
|
|
|
|
|
|
<!-- on asserted TimeLaterThan(this.deadline) { -->
|
|
|
|
|
<!-- this.counter++; -->
|
|
|
|
|
<!-- console.log('tick', new Date(), this.counter); -->
|
|
|
|
|
<!-- this.deadline += 1000; -->
|
|
|
|
|
<!-- } -->
|
|
|
|
|
|
|
|
|
|
<!-- stop on (this.counter == 5); -->
|
|
|
|
|
<!-- } -->
|
|
|
|
|
<!-- ``` -->
|
|
|
|
|
|
|
|
|
|
<!-- Now, compile the project: -->
|
|
|
|
|
|
|
|
|
|
<!-- npm run build -->
|
|
|
|
|
|
|
|
|
|
<!-- Finally, run the program: -->
|
|
|
|
|
|
|
|
|
|
<!-- node lib/index.js -->
|
|
|
|
|
|
|
|
|
|
<!-- The output should be something like: -->
|
|
|
|
|
|
|
|
|
|
<!-- ticker starting -->
|
|
|
|
|
<!-- tick 2018-11-05T14:23:27.713Z 1 -->
|
|
|
|
|
<!-- tick 2018-11-05T14:23:28.705Z 2 -->
|
|
|
|
|
<!-- tick 2018-11-05T14:23:29.706Z 3 -->
|
|
|
|
|
<!-- tick 2018-11-05T14:23:30.706Z 4 -->
|
|
|
|
|
<!-- tick 2018-11-05T14:23:31.707Z 5 -->
|
|
|
|
|
<!-- ticker stopping -->
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|