diff --git a/CHANGELOG.txt b/CHANGELOG.txt new file mode 100644 index 0000000..366c349 --- /dev/null +++ b/CHANGELOG.txt @@ -0,0 +1,6 @@ +[1.0.2] +- moved to typescript +- authorizer adapter added + +[1.0.0] +- basic CRDT server \ No newline at end of file diff --git a/Procfile b/Procfile deleted file mode 100644 index 572b477..0000000 --- a/Procfile +++ /dev/null @@ -1,2 +0,0 @@ -web: npm start - diff --git a/README.md b/README.md new file mode 100644 index 0000000..dd73336 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +## Editing Server + +It uses [ueberdosis/hocuspocus](https://github.com/ueberdosis/hocuspocus) under the hood, enjoy it's simplicity :) \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 98154ff..0000000 --- a/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import { Server } from "@hocuspocus/server"; - -const server = Server.configure({ - port: 4242, -}); - -server.listen(); \ No newline at end of file diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..2b90122 --- /dev/null +++ b/index.ts @@ -0,0 +1,39 @@ +import { Server, onAuthenticatePayload } from "@hocuspocus/server"; +import { ApiResponse, Authorizer, ConfigType, ValidateJWTTokenInput, ValidateJWTTokenResponse } from '@authorizerdev/authorizer-js'; + +const authorizer = new Authorizer({ + clientID: process.env.AUTHORIZER_CLIENT_ID, + authorizerURL: 'https://auth.discours.io', + redirectURL: 'https://testing.discours.io' +} as ConfigType); + + +const server = await Server.configure({ + port: 4242, + async onConnect({ connection }) { + connection.requiresAuthentication = false; // FIXME + }, + async onAuthenticate(data: onAuthenticatePayload) { + // Danger! This won’t be called for that connection attempt. + + if (data.requestHeaders) { + const params: ValidateJWTTokenInput = { + token_type: 'access_token', + token: data.requestHeaders['authorization'] || '', + } + if (params.token) { + // NOTE: ожидаем, что клиент отправит токен + const response: ApiResponse = await authorizer.validateJWTToken(params) + if(response?.data?.is_valid) { + const { sub: user, allowed_roles: roles } = response.data.claims + console.debug(`user_id: ${user} roles: ${roles}`) + } else { + console.debug('no valid auth token presented') + } + } + } + + }, +}).listen(); + +server.listen(); diff --git a/package-lock.json b/package-lock.json index 4f02216..91f7192 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,22 @@ "version": "1.0.0", "license": "MIT", "dependencies": { - "@hocuspocus/server": "^2.0.1" + "@authorizerdev/authorizer-js": "2.0.0", + "@hocuspocus/server": "2.0.1" + } + }, + "node_modules/@authorizerdev/authorizer-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@authorizerdev/authorizer-js/-/authorizer-js-2.0.0.tgz", + "integrity": "sha512-PTVuCrCkZkVPoo+l0+9PVFyP9frLp/L3FUtQDtAaN+ERuqx97DNF20tIH8khSvnXrkKv3lTJ/5iFWddy+dTAwg==", + "dependencies": { + "cross-fetch": "^3.1.5" }, - "devDependencies": { - "@hocuspocus/provider": "^2.0.1" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/authorizerdev" } }, "node_modules/@hocuspocus/common": { @@ -23,43 +35,6 @@ "lib0": "^0.2.47" } }, - "node_modules/@hocuspocus/provider": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-2.0.1.tgz", - "integrity": "sha512-3IFn8oFlGEPQhzswiCrMjuBa1+qKPphr2In8iSgkjZFfMiSDobAfYvQj281dZf7vuKZZ1rFn/s55TAWhDCAy0w==", - "dev": true, - "dependencies": { - "@hocuspocus/common": "^2.0.1", - "@lifeomic/attempt": "^3.0.2", - "lib0": "^0.2.47", - "ws": "^7.5.9" - }, - "peerDependencies": { - "y-protocols": "^1.0.5", - "yjs": "^13.5.29" - } - }, - "node_modules/@hocuspocus/provider/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@hocuspocus/server": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@hocuspocus/server/-/server-2.0.1.tgz", @@ -80,12 +55,6 @@ "yjs": "^13.5.29" } }, - "node_modules/@lifeomic/attempt": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.0.3.tgz", - "integrity": "sha512-GlM2AbzrErd/TmLL3E8hAHmb5Q7VhDJp35vIbyPVA5Rz55LZuRr8pwL3qrwwkVNo05gMX1J44gURKb4MHQZo7w==", - "dev": true - }, "node_modules/@types/async-lock": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@types/async-lock/-/async-lock-1.4.0.tgz", @@ -114,6 +83,14 @@ "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==" }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/isomorphic.js": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", @@ -150,6 +127,30 @@ "url": "https://github.com/sponsors/dmonad" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -158,6 +159,20 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", diff --git a/package.json b/package.json index e138fed..af6e281 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { "name": "discours-hocuspocus", - "version": "1.0.0", + "version": "1.0.2", "description": "", - "main": "index.js", + "main": "index.ts", "type": "module", "scripts": { - "start": "node index.js" + "start": "node index.ts" }, "repository": { "type": "git", - "url": "git+https://gitlab.com/discoursio/hocuspocus.git" + "url": "git+https://dev.discours.io/discours.io/editing-server.git" }, "author": "Discours Dev Team", "license": "MIT", @@ -18,6 +18,7 @@ }, "homepage": "https://gitlab.com/discoursio/hocuspocus#readme", "dependencies": { + "@authorizerdev/authorizer-js": "2.0.0", "@hocuspocus/server": "2.0.1" } }