Tony Garnock-Jones
97cfb19852
This is a kind of ad-hocish response to an interesting problem. In previous Syndicates, assertion changes were gathered into *patches* which *netted out* intra-turn changes. In this implementation, each change is relayed unchanged, so there is *no netting* going on. The closest we get is a convention that when things are being replaced, incoming assertions should be made before outgoing ones are retracted, so that the kind of glitch that's seen is a double-up of records, rather than a brief window where no records are present. So here, by moving the stop continuation into an onStop for the stopping facet (that nonetheless *executes* in that facet's parent's context), we allow the following pattern to run without problem glitching: react { assert Something(1); stop on asserted Condition() => react { assert Something(2); } } Observers like this... during Something(_) => { // **A** ... during Something($specific) => { // **B** } } will see + Something(1) + Something(2) - Something(1) rather than what they saw before this change, + Something(1) - Something(1) + Something(2) The consequence is that the line marked **A** above will *remain active* after this change, with the facet at **B** being replaced, rather than briefly tearing down the **A** facet when `- Something(1)` and then creating a fresh one when `+ Something(2)`. This came up in flappy bird, where I had react { at mainDs { assert ui.html('#board-area', template`<h1 class="score">${score.value}</h1>`); } at gameDs { stop on asserted GameOver() => react { at mainDs { assert ui.html( '#board-area', template`<h1 class="score">${score.value}<br/>GAME OVER</h1>`); } } } } which, in combination with the particular implementation of index.ts in the html package, caused the UIFragment responder to get confused and to not show the GAME OVER message - the previous score message was removed, but the new one wasn't manifested in the DOM. Changing the last `ui.html` above to `ui.context('foo').html` caused the problem to go away (by making it effectively two unrelated fragments, rather than a replacement of the content of a single fragment). |
||
---|---|---|
examples | ||
git-hooks | ||
packages | ||
todo | ||
.dir-locals.el | ||
.gitignore | ||
.npmignore | ||
LICENCE | ||
Makefile | ||
Makefile.generic-package | ||
README.md | ||
TODO.md | ||
fixcopyright.rkt | ||
lerna.json | ||
package.json | ||
rollup.js | ||
setup.sh | ||
watchall |
README.md
Syndicate/js
A fourth-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.
Branches
The main
branch is where active development happens:
git clone -b main https://git.syndicate-lang.org/syndicate-lang/syndicate-js
An earlier TypeScript+JavaScript implementation from early 2021 (the
primary difference to main
being a lack of object-capability
support) can be found on the typescript1
branch:
git clone -b typescript1 https://git.syndicate-lang.org/syndicate-lang/syndicate-js
Finally, the babel-based
branch is from 2018, and is an
implementation for JavaScript only. It extends babel with new syntax
and new plugins, (rather than implementing its own error-tolerant
parser, like typescript1
and main
):
git clone -b babel-based https://git.syndicate-lang.org/syndicate-lang/syndicate-js
Building
These instructions are for the main
branch.
This project uses yarn
, not npm
.
The repository is a monorepo, using yarn workspaces. Lerna is used as a thin veneer atop yarn workspaces, providing convenient automation for package version management and publication.
After a checkout, run:
make bootstrap
Alternatively, running:
yarn install
./node_modules/.bin/lerna exec yarn prepare
will download and install all dependencies and then build all the packages.
Licence
@syndicate-lang, an implementation of Syndicate for TypeScript and JavaScript.
Copyright (C) 2016-2021 Tony Garnock-Jones tonyg@leastfixedpoint.com
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.
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.
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.