From 2c72a023e281e79207918f7ee1d010fb3af294dd Mon Sep 17 00:00:00 2001 From: cha0s Date: Wed, 27 Jan 2021 16:28:47 -0600 Subject: [PATCH] feat: sync --- packages/json/package.json | 3 ++ packages/json/src/index.js | 9 ++++++ packages/json/src/server/index.js | 9 ++++++ .../src/server/packets/decorators/action.js | 31 +++++++++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 packages/json/src/server/index.js create mode 100644 packages/json/src/server/packets/decorators/action.js diff --git a/packages/json/package.json b/packages/json/package.json index 6528148..4ea70b6 100644 --- a/packages/json/package.json +++ b/packages/json/package.json @@ -14,11 +14,14 @@ "files": [ "index.js", "index.js.map", + "server.js", + "server.js.map", "test.js", "test.js.map" ], "dependencies": { "@avocado/resource": "^2.0.0", + "@latus/core": "^2.0.0", "@latus/react": "^2.0.0", "@persea/core": "^1.0.0", "autoprefixer": "^9.8.6", diff --git a/packages/json/src/index.js b/packages/json/src/index.js index 4fc0fc7..57e4f19 100644 --- a/packages/json/src/index.js +++ b/packages/json/src/index.js @@ -1,4 +1,5 @@ import JsonResourceController from './resource-controllers/json'; +import {patchJsonResource} from './state/json'; import reducer from './state/reducer'; export {default as useJsonPatcher} from './hooks/use-json-patcher'; @@ -8,6 +9,14 @@ export {JsonResourceController}; export default { hooks: { + '@latus/redux/effects': (latus) => { + const withSocket = (fn) => (...args) => fn(...args.concat(latus.get('%socket'))); + return { + [patchJsonResource]: withSocket((store, action, socket) => { + socket.send(['Action', action]); + }), + }; + }, '@latus/redux/reducers': () => reducer, '@persea/core/resource-controllers': () => [ JsonResourceController, diff --git a/packages/json/src/server/index.js b/packages/json/src/server/index.js new file mode 100644 index 0000000..5bf241a --- /dev/null +++ b/packages/json/src/server/index.js @@ -0,0 +1,9 @@ +import {decorateWithLatus} from '@latus/core'; + +export default { + hooks: { + '@latus/socket/packets.decorate': decorateWithLatus( + require.context('./packets/decorators', false, /\.js$/), + ), + }, +}; diff --git a/packages/json/src/server/packets/decorators/action.js b/packages/json/src/server/packets/decorators/action.js new file mode 100644 index 0000000..0608283 --- /dev/null +++ b/packages/json/src/server/packets/decorators/action.js @@ -0,0 +1,31 @@ +import fs from 'fs'; +import {join} from 'path'; +import {promisify} from 'util'; + +import {applyPatch} from 'fast-json-patch'; + +import {patchJsonResource} from '../../../state/json'; + +const readFile = promisify(fs.readFile); +const writeFile = promisify(fs.writeFile); + +export default (Action) => class ProjectAction extends Action { + + static async respond(packet, socket) { + const {data: {type, payload}} = packet; + switch (type) { + case patchJsonResource.toString(): { + const {patch, project, uri} = payload; + const path = join(process.cwd(), 'projects', project, uri); + const buffer = await readFile(path); + const json = JSON.parse(buffer.toString('utf8')); + applyPatch(json, patch); + writeFile(path, JSON.stringify(json, null, 2)); + break; + } + default: + } + return super.respond(packet, socket); + } + +};