{"_id":"@ac-synth/y-websocket","_rev":"2-fab4f11afe34f6e656a88c7c6e0ef14f","name":"@ac-synth/y-websocket","dist-tags":{"latest":"1.4.3-alpha3"},"versions":{"1.4.3-alpha":{"name":"@ac-synth/y-websocket","version":"1.4.3-alpha","description":"Websockets provider for Yjs - Synthesia fork","main":"./dist/y-websocket.cjs","module":"./src/y-websocket.js","types":"./dist/src/y-websocket.d.ts","sideEffects":false,"funding":{"type":"GitHub Sponsors ❤","url":"https://github.com/sponsors/dmonad"},"scripts":{"start":"node ./bin/server.js","dist":"rm -rf dist && rollup -c && tsc","lint":"standard && tsc","test":"npm run lint","preversion":"npm run lint && npm run dist && test -e dist/src/y-websocket.d.ts && test -e dist/y-websocket.cjs"},"bin":{"y-websocket-server":"bin/server.js","y-websocket":"bin/server.js"},"exports":{"./package.json":"./package.json","./bin/utils":"./bin/utils.js","./bin/callback":"./bin/callback.js",".":{"import":"./src/y-websocket.js","require":"./dist/y-websocket.cjs"}},"repository":{"type":"git","url":"git+https://github.com/Synthesia-Technologies/y-websocket.git"},"keywords":["Yjs"],"author":{"name":"Kevin Jahns","email":"kevin.jahns@protonmail.com"},"license":"MIT","bugs":{"url":"https://github.com/Synthesia-Technologies/y-websocket/issues"},"homepage":"https://github.com/Synthesia-Technologies/y-websocket#readme","standard":{"ignore":["/dist","/node_modules"]},"dependencies":{"lib0":"^0.2.42","lodash.debounce":"^4.0.8","y-protocols":"^1.0.5","ws":"^6.2.1","y-leveldb":"^0.1.0"},"devDependencies":{"rollup":"^1.32.1","rollup-cli":"^1.0.9","standard":"^12.0.1","typescript":"^3.9.9","yjs":"^13.5.0"},"peerDependencies":{"yjs":"^13.5.6"},"optionalDependencies":{"ws":"^6.2.1","y-leveldb":"^0.1.0"},"gitHead":"9497f4c04286e39cc3f435e0096e40fea3a4386a","_id":"@ac-synth/y-websocket@1.4.3-alpha","_nodeVersion":"18.0.0","_npmVersion":"8.6.0","dist":{"integrity":"sha512-/kv6tS+AwBYlBv4eFshWEJtE4rEDUOc/05qPZDO8k4mSQwgUqX2TMaJcPKQj9pAexKwPm29oKbQ+VimJYYYNfg==","shasum":"a86e36165b145aeec74c6c2994b9187e3cc57f8d","tarball":"https://registry.npmjs.org/@ac-synth/y-websocket/-/y-websocket-1.4.3-alpha.tgz","fileCount":10,"unpackedSize":95402,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIH+KiFA9ejd9/f8/9vtndE09rCAOC7A8fDe4x3kNfW+6AiA4P8YI92d/z5O5aXiEhpENV9+lhmEJxaFdwx8EpewHww=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJinzyIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmosmg/9F65sm/pqE19CdWw6hSRVIRbFMaMbHCN4Uic+FVHEfnZAN053\r\nvDgJICKjRY6z+Tbj7py8g+xlNYKtNWioboS6kmdaVN6eXUfFnTzXOMZ7JM28\r\nIg73paaVRO4YDE6nKs9dJ5ZTACVkvQsxbFmjWSbT/ATn6Q3sa80Fmg6Cp2hD\r\nzBK/LH+CzGwRF9lKdPmUdapu4Oromggf26RMOnymh1zbaGN7/JWvwtEG0CqD\r\nv3SQ8AuUKDhK2kqdYf7vJwISIy0vG2hIp5CGaTslOJDMWI788ehdTO3sX444\r\nNno9Af0rHeKHHYGJiYui8D9/woiSNpaLuFCuZq52qAwvITlj4dylY0SgKXhS\r\nrEk0OiDuOFpwW5klWgsoHC7Ij3S/TAnlX0n4eUp0ikM2rUcVFvn/wN9rf5GA\r\n46Ql0HKFZLKc7ReC0XqfhoxjxYz0t490xRNVDXJuRBzP85oSF2qKMvoCT+W/\r\nrWaX+RNGzTmj9YDZgxw1i5e3C2L+cngKT+/TXpCou+VE9fl9P6cSx80KW1no\r\n67w311TvWj+fXc9lvVhhifP1WD3ooe7FZMq+R4stN3OOhg4qq+IFpwfQjm3c\r\nX3NW/VbPWRVUVI6I4fdUrsxqtL/tqKqP/fZvnj7Z1YeQ7VYKt5+BPzl6GQrN\r\nnempcZ1M8gq1E2fioov4Ab9gLwlRPRnpZx0=\r\n=8FtG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ac-synth","email":"adam@synthesia.io"},"directories":{},"maintainers":[{"name":"ac-synth","email":"adam@synthesia.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/y-websocket_1.4.3-alpha_1654602888359_0.8951005919666695"},"_hasShrinkwrap":false},"1.4.3-alpha2":{"name":"@ac-synth/y-websocket","version":"1.4.3-alpha2","description":"Websockets provider for Yjs - Synthesia fork","main":"./dist/y-websocket.cjs","module":"./src/y-websocket.js","types":"./dist/src/y-websocket.d.ts","sideEffects":false,"funding":{"type":"GitHub Sponsors ❤","url":"https://github.com/sponsors/dmonad"},"scripts":{"start":"node ./bin/server.js","dist":"rm -rf dist && rollup -c && tsc","lint":"standard && tsc","test":"npm run lint","preversion":"npm run lint && npm run dist && test -e dist/src/y-websocket.d.ts && test -e dist/y-websocket.cjs"},"bin":{"y-websocket-server":"bin/server.js","y-websocket":"bin/server.js"},"exports":{"./package.json":"./package.json","./bin/utils":"./bin/utils.js","./bin/callback":"./bin/callback.js",".":{"import":"./src/y-websocket.js","require":"./dist/y-websocket.cjs"}},"repository":{"type":"git","url":"git+https://github.com/Synthesia-Technologies/y-websocket.git"},"keywords":["Yjs"],"author":{"name":"Kevin Jahns","email":"kevin.jahns@protonmail.com"},"license":"MIT","bugs":{"url":"https://github.com/Synthesia-Technologies/y-websocket/issues"},"homepage":"https://github.com/Synthesia-Technologies/y-websocket#readme","standard":{"ignore":["/dist","/node_modules"]},"dependencies":{"hash-sum":"^2.0.0","lib0":"^0.2.42","lodash.debounce":"^4.0.8","y-protocols":"^1.0.5","ws":"^6.2.1","y-leveldb":"^0.1.0"},"devDependencies":{"rollup":"^1.32.1","rollup-cli":"^1.0.9","standard":"^12.0.1","typescript":"^3.9.9"},"peerDependencies":{"yjs":"^13.5.39"},"optionalDependencies":{"ws":"^6.2.1","y-leveldb":"^0.1.0"},"gitHead":"b03f4cfa5c6c44c581af6e80841d8a4e17a35aa6","_id":"@ac-synth/y-websocket@1.4.3-alpha2","_nodeVersion":"18.0.0","_npmVersion":"8.6.0","dist":{"integrity":"sha512-dXbdzFBkGA8vDI2uTeu9Almzn89OmjuCuElJ+puNY+wnPMXa5DmyIwg0TOoNLg/a35Nu2lHEkztwrvWc8EVZow==","shasum":"b9f2a915a96f57fa204b1ba91b145e66ce865318","tarball":"https://registry.npmjs.org/@ac-synth/y-websocket/-/y-websocket-1.4.3-alpha2.tgz","fileCount":10,"unpackedSize":90290,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFfStSjP29aCH8dOf+uqrP7rDjrd86O63Fgp8TUMJMPsAiEA7dkzOe7a5bqKUcoDzqSP9MVD/nIzN2hTS+5huECitrE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqb5JACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhhQ//Uc65wE2K59v65NdEhCkL3XkW5Lvh9XbY+kUdYHb2o18naAf1\r\nefzrAgLdMmurbJd2nbafDf/0b7av5UU1hJOXxaFki/Fuaoy0xtt/S0jXwwdg\r\nz1EXkeQ5xthKIL5j20EGWCgGfwJl0mayqR6pcJWMx4aoMpInNJO2jn+R1pEd\r\nl0FBTvs+pp/YC+xUUBke1iyLWVIliqfd9PIpBGfqsdz0OKg6Lpb/5Wc4xSvK\r\n8pQG+xCiZnCVxWuO5kr9Cd9xk6ch9rZpgnLMRg9f+GbErqVldzYswOtHJkcT\r\n5r9FuwOdYz/crU69wzNaDe5T8TCuFNTj/ctm3Vs41j+Gbi0l2h4Ch6i47zUi\r\nzlQLET24+jZwFCdjuS2xMEXLBiUSturOIm5iFj0YxFClAvbyvKbAwZ+wj8Xi\r\nLaHsCd1bKQOH8OpTLMyijG8OopIVdYTuqsALbPc/1odw5kkd8XXSc5iq7TQf\r\nnef7/aDgLok2H3C8f1sNPGyepMxAF+k31bzLsC55LQlnMVF8wOI2OHBLtBrG\r\ncdletyjUkM4apAZySEQBWhwKKYURPRDyAWjBD6WitYidqdSoCOyjsshXmZcI\r\n2jffj7N2Vj5Dltno3QoboZ3ARPX2MRnqEFZJWCfaMYnjPuwFC7w5aYtsWwHO\r\nZar5JOWKDY/6uDiPyQsmhYTRUsxt7qFrasM=\r\n=vP5G\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ac-synth","email":"adam@synthesia.io"},"directories":{},"maintainers":[{"name":"ac-synth","email":"adam@synthesia.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/y-websocket_1.4.3-alpha2_1655291465208_0.21725082218111536"},"_hasShrinkwrap":false},"1.4.3-alpha3":{"name":"@ac-synth/y-websocket","version":"1.4.3-alpha3","description":"Websockets provider for Yjs - Synthesia fork","main":"./dist/y-websocket.cjs","module":"./src/y-websocket.js","types":"./dist/src/y-websocket.d.ts","sideEffects":false,"funding":{"type":"GitHub Sponsors ❤","url":"https://github.com/sponsors/dmonad"},"scripts":{"start":"node ./bin/server.js","dist":"rm -rf dist && rollup -c && tsc","lint":"standard && tsc","test":"npm run lint","preversion":"npm run lint && npm run dist && test -e dist/src/y-websocket.d.ts && test -e dist/y-websocket.cjs"},"bin":{"y-websocket-server":"bin/server.js","y-websocket":"bin/server.js"},"exports":{"./package.json":"./package.json","./bin/utils":"./bin/utils.js","./bin/callback":"./bin/callback.js",".":{"import":"./src/y-websocket.js","require":"./dist/y-websocket.cjs"}},"repository":{"type":"git","url":"git+https://github.com/Synthesia-Technologies/y-websocket.git"},"keywords":["Yjs"],"author":{"name":"Kevin Jahns","email":"kevin.jahns@protonmail.com"},"license":"MIT","bugs":{"url":"https://github.com/Synthesia-Technologies/y-websocket/issues"},"homepage":"https://github.com/Synthesia-Technologies/y-websocket#readme","standard":{"ignore":["/dist","/node_modules"]},"dependencies":{"hash-sum":"^2.0.0","lib0":"^0.2.42","lodash.debounce":"^4.0.8","y-protocols":"^1.0.5","ws":"^6.2.1","y-leveldb":"^0.1.0"},"devDependencies":{"rollup":"^1.32.1","rollup-cli":"^1.0.9","standard":"^12.0.1","typescript":"^3.9.9"},"peerDependencies":{"yjs":"^13.5.39"},"optionalDependencies":{"ws":"^6.2.1","y-leveldb":"^0.1.0"},"gitHead":"b03f4cfa5c6c44c581af6e80841d8a4e17a35aa6","_id":"@ac-synth/y-websocket@1.4.3-alpha3","_nodeVersion":"18.0.0","_npmVersion":"8.6.0","dist":{"integrity":"sha512-T3o3ofqjoUCUENBP1o0QLD3w2vNYHYTKSelFu52eTS088cLLGRt/LcGuP0IwYePpdqDwkhIdbQeerzCl4vGIjA==","shasum":"2e27936e6d08ce0f3dd6b88a17fa0e7599b66b68","tarball":"https://registry.npmjs.org/@ac-synth/y-websocket/-/y-websocket-1.4.3-alpha3.tgz","fileCount":10,"unpackedSize":92544,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHjYWsTFUxfJY5SfSJsXMbsKFHb7f9XMdfPsVRQxJ9+WAiEAoTl3hosu7cSD1S9C41S55jjwdRzEN53HnTw8r1XOp/I="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiqdY6ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmryUA/+P05z0ST+DHknrs4gVHTn1cy25dJkOLjjz2dCvo9/pTwkpqJ8\r\n2BeJzCN1exUNkhOwOXpt4ogSx9qd5A0IpSZVnUtM2l7+PHjBbtyzMTwJfBMD\r\nf7rpiJpKVxNwRHd95L1u8S4ErZldTl4f1C5a8RfuOQKR0lv7Rk7CFxTkj0Mw\r\nGLtoS7/yc04cX9gsVaplSq9JrzqHBLvE5Fyq/xQL3ohdzagUJrpDs5qFSo/Q\r\nfWo5LmTnVPq8rw9uLsY3xuHP3XvTGN7BC1KTOOfO9+Sk8CAOq86euaUgcXOW\r\nR8rp7aqomCqTDcT0lYq0FpM4huVkI87BTy2I85k6eC98qEK7JnZexNsIb+gs\r\nozbLUWeP3z/bJ9QR8ld50zd+NjSPtXcxswMxx5vZUGw1ebjNldxzx9l4wydb\r\nRmoNq6VT8bHiOh4Tb9TJ6fqlb3/Ry7uPBzkUbLupNdkxWX20BtfQByuEXYV+\r\nlBfJmVdnluwNypMIDu3k2Hpj6h4pVNQOODzJGN7d6NGKRu/d4rvlDMoKbgSA\r\nXQ64kxE6602X/82dUlRhzcpvUtqT8uzjjm9OjcuwxCWH5H2vDyq5AQMDhPKI\r\nVt4k3QEtkfU+F13JrEIi/CXX2tv0Tye03O/g5Ve9wu3wh1mF20DMK5VQg+tb\r\n8eoVzdkVppw37rDaJeoIJvIY5+73VdPyXFI=\r\n=FTsC\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"ac-synth","email":"adam@synthesia.io"},"directories":{},"maintainers":[{"name":"ac-synth","email":"adam@synthesia.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/y-websocket_1.4.3-alpha3_1655297593914_0.8765799129055274"},"_hasShrinkwrap":false}},"time":{"created":"2022-06-07T11:54:48.276Z","1.4.3-alpha":"2022-06-07T11:54:48.531Z","modified":"2022-06-15T12:53:14.188Z","1.4.3-alpha2":"2022-06-15T11:11:05.427Z","1.4.3-alpha3":"2022-06-15T12:53:14.068Z"},"maintainers":[{"name":"ac-synth","email":"adam@synthesia.io"}],"description":"Websockets provider for Yjs - Synthesia fork","homepage":"https://github.com/Synthesia-Technologies/y-websocket#readme","keywords":["Yjs"],"repository":{"type":"git","url":"git+https://github.com/Synthesia-Technologies/y-websocket.git"},"author":{"name":"Kevin Jahns","email":"kevin.jahns@protonmail.com"},"bugs":{"url":"https://github.com/Synthesia-Technologies/y-websocket/issues"},"license":"MIT","readme":"\n# y-websocket :tophat:\n> WebSocket Provider for Yjs\n\nThe Websocket Provider implements a classical client server model. Clients connect to a single endpoint over Websocket. The server distributes awareness information and document updates among clients.\n\nThe Websocket Provider is a solid choice if you want a central source that handles authentication and authorization. Websockets also send header information and cookies, so you can use existing authentication mechanisms with this server.\n\n* Supports cross-tab communication. When you open the same document in the same browser, changes on the document are exchanged via cross-tab communication ([Broadcast Channel](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) and [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) as fallback).\n* Supports exchange of awareness information (e.g. cursors).\n\n## Quick Start\n\n### Install dependencies\n\n```sh\nnpm i y-websocket\n```\n\n### Start a y-websocket server\n\nThis repository implements a basic server that you can adopt to your specific use-case. [(source code)](./bin/)\n\nStart a y-websocket server:\n\n```sh\nHOST=localhost PORT=1234 npx y-websocket\n```\n\n### Client Code:\n\n```js\nimport * as Y from 'yjs'\nimport { WebsocketProvider } from 'y-websocket'\n\nconst doc = new Y.Doc()\nconst wsProvider = new WebsocketProvider('ws://localhost:1234', 'my-roomname', doc)\n\nwsProvider.on('status', event => {\n  console.log(event.status) // logs \"connected\" or \"disconnected\"\n})\n```\n\n#### Client Code in Node.js\n\nThe WebSocket provider requires a [`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) object to create connection to a server. You can polyfill WebSocket support in Node.js using the [`ws` package](https://www.npmjs.com/package/ws).\n\n```js\nconst wsProvider = new WebsocketProvider('ws://localhost:1234', 'my-roomname', doc, { WebSocketPolyfill: require('ws') })\n```\n\n## API\n\n```js\nimport { WebsocketProvider } from 'y-websocket'\n```\n\n<dl>\n  <b><code>wsProvider = new WebsocketProvider(serverUrl: string, room: string, ydoc: Y.Doc [, wsOpts: WsOpts])</code></b>\n  <dd>Create a new websocket-provider instance. As long as this provider, or the connected ydoc, is not destroyed, the changes will be synced to other clients via the connected server. Optionally, you may specify a configuration object. The following default values of wsOpts can be overwritten. </dd>\n</dl>\n\n```js\nwsOpts = {\n  // Set this to `false` if you want to connect manually using wsProvider.connect()\n  connect: true,\n  // Specify a query-string that will be url-encoded and attached to the `serverUrl`\n  // I.e. params = { auth: \"bearer\" } will be transformed to \"?auth=bearer\"\n  params: {}, // Object<string,string>\n  // You may polyill the Websocket object (https://developer.mozilla.org/en-US/docs/Web/API/WebSocket).\n  // E.g. In nodejs, you could specify WebsocketPolyfill = require('ws')\n  WebsocketPolyfill: Websocket,\n  // Specify an existing Awareness instance - see https://github.com/yjs/y-protocols\n  awareness: new awarenessProtocol.Awareness(ydoc),\n  // Specify the maximum amount to wait between reconnects (we use exponential backoff).\n  maxBackoffTime: 2500\n}\n```\n\n<dl>\n  <b><code>wsProvider.wsconnected: boolean</code></b>\n  <dd>True if this instance is currently connected to the server.</dd>\n  <b><code>wsProvider.wsconnecting: boolean</code></b>\n  <dd>True if this instance is currently connecting to the server.</dd>\n  <b><code>wsProvider.shouldConnect: boolean</code></b>\n  <dd>If false, the client will not try to reconnect.</dd>\n  <b><code>wsProvider.bcconnected: boolean</code></b>\n  <dd>True if this instance is currently communicating to other browser-windows via BroadcastChannel.</dd>\n  <b><code>wsProvider.synced: boolean</code></b>\n  <dd>True if this instance is currently connected and synced with the server.</dd>\n  <b><code>wsProvider.disconnect()</code></b>\n  <dd>Disconnect from the server and don't try to reconnect.</dd>\n  <b><code>wsProvider.connect()</code></b>\n  <dd>Establish a websocket connection to the websocket-server. Call this if you recently disconnected or if you set wsOpts.connect = false.</dd>\n  <b><code>wsProvider.destroy()</code></b>\n  <dd>Destroy this wsProvider instance. Disconnects from the server and removes all event handlers.</dd>\n  <b><code>wsProvider.on('sync', function(isSynced: boolean))</code></b>\n  <dd>Add an event listener for the sync event that is fired when the client received content from the server.</dd>\n  <b><code>wsProvider.on('status', function({ status: 'disconnected' | 'connecting' | 'connected' }))</code></b>\n  <dd>Receive updates about the current connection status.</dd>\n  <b><code>wsProvider.on('connection-close', function(WSClosedEvent))</code></b>\n  <dd>Fires when the underlying websocket connection is closed. It forwards the websocket event to this event handler.</dd>\n  <b><code>wsProvider.on('connection-error', function(WSErrorEvent))</code></b>\n  <dd>Fires when the underlying websocket connection closes with an error. It forwards the websocket event to this event handler.</dd>\n</dl>\n\n## Websocket Server\n\nStart a y-websocket server:\n\n```sh\nHOST=localhost PORT=1234 npx y-websocket\n```\n\nSince npm symlinks the `y-websocket` executable from your local `./node_modules/.bin` folder, you can simply run npx. The `PORT` environment variable already defaults to 1234, and `HOST` defaults to `localhost`.\n\n### Websocket Server with Persistence\n\nPersist document updates in a LevelDB database.\n\nSee [LevelDB Persistence](https://github.com/yjs/y-leveldb) for more info.\n\n```sh\nHOST=localhost PORT=1234 YPERSISTENCE=./dbDir node ./node_modules/y-websocket/bin/server.js\n```\n\n### Websocket Server with HTTP callback\n\nSend a debounced callback to an HTTP server (`POST`) on document update. Note that this implementation doesn't implement a retry logic in case the `CALLBACK_URL` does not work.\n\nCan take the following ENV variables:\n\n* `CALLBACK_URL` : Callback server URL\n* `CALLBACK_DEBOUNCE_WAIT` : Debounce time between callbacks (in ms). Defaults to 2000 ms\n* `CALLBACK_DEBOUNCE_MAXWAIT` : Maximum time to wait before callback. Defaults to 10 seconds\n* `CALLBACK_TIMEOUT` : Timeout for the HTTP call. Defaults to 5 seconds\n* `CALLBACK_OBJECTS` : JSON of shared objects to get data (`'{\"SHARED_OBJECT_NAME\":\"SHARED_OBJECT_TYPE}'`)\n\n```sh\nCALLBACK_URL=http://localhost:3000/ CALLBACK_OBJECTS='{\"prosemirror\":\"XmlFragment\"}' npm start\n```\nThis sends a debounced callback to `localhost:3000` 2 seconds after receiving an update (default `DEBOUNCE_WAIT`) with the data of an XmlFragment named `\"prosemirror\"` in the body.\n\n## License\n\n[The MIT License](./LICENSE) © Kevin Jahns\n","readmeFilename":"README.md"}