Skip to content

Commit 7075530

Browse files
committed
closes #87
1 parent c340e34 commit 7075530

6 files changed

Lines changed: 193 additions & 10 deletions

File tree

examples/test-unix-socket-peer.js

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
const Path = require('path')
2+
const debug = require('debug')('test.server-db')
3+
const Dataparty = require('../src')
4+
const dataparty_crypto = require('@dataparty/crypto')
5+
6+
class ExampleService extends Dataparty.IService {
7+
constructor(opts){
8+
super(opts)
9+
10+
this.addMiddleware(Dataparty.middleware_paths.pre.decrypt)
11+
this.addMiddleware(Dataparty.middleware_paths.pre.validate)
12+
13+
this.addMiddleware(Dataparty.middleware_paths.post.validate)
14+
this.addMiddleware(Dataparty.middleware_paths.post.encrypt)
15+
16+
this.addEndpoint(Dataparty.endpoint_paths.echo)
17+
this.addEndpoint(Dataparty.endpoint_paths.secureecho)
18+
this.addEndpoint(Dataparty.endpoint_paths.identity)
19+
this.addEndpoint(Dataparty.endpoint_paths.version)
20+
21+
this.addSchema(Path.join(__dirname, './party/schema/basic_types.js'))
22+
this.addSchema(Path.join(__dirname, './party/schema/user.js'))
23+
}
24+
25+
}
26+
27+
async function main(){
28+
29+
const socketFilePath = '/tmp/party.sock'
30+
31+
32+
const service = new ExampleService({ name: '@dataparty/example', version: '0.0.1' })
33+
const build = await service.compile(Path.join(__dirname,'/dataparty'), true)
34+
35+
const serviceName = build.package.name
36+
const basePath = '/data/dataparty/'
37+
const servicePath = Path.join(basePath, serviceName.replace('/','-'))
38+
39+
let config = new Dataparty.Config.JsonFileConfig({ basePath: servicePath })
40+
config.touchDir('/tingo')
41+
42+
const dbPath = Path.join(servicePath, '/tingo')
43+
44+
let party = new Dataparty.TingoParty({
45+
config,
46+
path: dbPath,
47+
model: build
48+
})
49+
50+
const live = new Dataparty.IService(build.package, build)
51+
52+
53+
const runner = new Dataparty.ServiceRunnerNode({
54+
party,
55+
service: live,
56+
sendFullErrors: false,
57+
useNative: false
58+
})
59+
60+
const runnerRouter = new Dataparty.RunnerRouter(runner)
61+
62+
63+
const host = new Dataparty.ServiceHost({
64+
runner: runnerRouter,
65+
trust_proxy: true,
66+
wsEnabled: true,
67+
listenUri: 'file://'+socketFilePath,
68+
wsUpgradePath: '/'
69+
})
70+
71+
debug(runner.party.identity)
72+
await party.start()
73+
await runnerRouter.start()
74+
await host.start()
75+
76+
console.log('started')
77+
78+
79+
const remoteIdentity = party.identity
80+
81+
debug('remoteIdentity', remoteIdentity)
82+
83+
let clientParty = new Dataparty.PeerParty({
84+
comms: new Dataparty.Comms.WebsocketComms({
85+
uri: 'ws+unix://'+socketFilePath,
86+
remoteIdentity,
87+
session: 'foobar'
88+
}),
89+
model: build,
90+
config: new Dataparty.Config.MemoryConfig()
91+
})
92+
93+
async function exitHandler(){
94+
95+
//! We must explictly stop server to clean up socket file
96+
97+
await clientParty.stop()
98+
99+
await host.stop()
100+
process.exit()
101+
}
102+
103+
process.on('exit', exitHandler)
104+
process.on('SIGINT', exitHandler)
105+
106+
107+
108+
await clientParty.start()
109+
110+
debug('client waiting for auth')
111+
await clientParty.comms.authorized()
112+
debug('client authorized')
113+
114+
const remoteVersion = await clientParty.comms.call('version')
115+
const remoteId = await clientParty.comms.call('identity')
116+
117+
debug('version', remoteVersion)
118+
debug('identity', remoteId)
119+
120+
let user = (await clientParty.find()
121+
.type('user')
122+
.where('name').equals('tester')
123+
.exec())[0]
124+
125+
126+
if(!user){
127+
debug('client creating document')
128+
user = await clientParty.createDocument('user', {name: 'tester', created: (new Date()).toISOString() })
129+
}
130+
else{
131+
debug('client loaded document')
132+
}
133+
134+
console.log(user.data)
135+
136+
user.on('change', (obj)=>{ console.log('client remote event [document.on(change)]', obj.operationType ) })
137+
user.on('update', (obj)=>{ console.log('client event [document.on(update)]')})
138+
user.on('value', (doc)=>{ console.log('client event [document.on(value)]') })
139+
user.on('remove', (obj)=>{ console.log('client event [document.on(remove)]') })
140+
141+
await user.watch()
142+
143+
let localUser = (await party.find()
144+
.type('user')
145+
.where('name').equals('tester')
146+
.exec())[0]
147+
148+
console.log('\nserver changing document field')
149+
localUser.data.name = 'renamed-tester'
150+
await localUser.save()
151+
152+
console.log(localUser.data)
153+
console.log('hash',localUser.hash)
154+
155+
await localUser.remove()
156+
}
157+
158+
159+
160+
main().catch(err=>{
161+
console.error(err)
162+
})

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"dom-storage": "^2.1.0",
7777
"eventemitter3": "^4.0.7",
7878
"express": "^4.17.1",
79-
"express-list-routes": "^0.1.4",
79+
"express-list-routes": "^1.1.9",
8080
"git-repo-info": "^2.1.1",
8181
"joi": "^17.9.1",
8282
"joi-objectid": "^4.0.2",

src/comms/isocket-comms.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const IParty = require('../party/iparty')
2222
*/
2323

2424
class ISocketComms extends EventEmitter {
25-
constructor({session, party, remoteIdentity, discoverRemoteIdentity}){
25+
constructor({session, uri, party, remoteIdentity, discoverRemoteIdentity}){
2626
super()
2727
this.uri = uri
2828
this.session = session

src/comms/websocket-shim.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
const debug = require('debug')('dataparty.comms.websocket-shim')
33
const EventEmitter = require('eventemitter3')
44

5+
const WebSocket = global.WebSocket ? global.WebSocket : require('ws')
6+
57
class WebsocketShim extends EventEmitter {
68
constructor(conn){
79
super()

src/party/iparty.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ class IParty {
7070
debug('\tDocument Classes', this.factory.getTypes())
7171
}
7272

73+
async stop(){
74+
this.comms.close()
75+
}
76+
7377
/**
7478
* @async
7579
* @method module:Party.IParty.createDocument

src/service/service-host.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ const reach = require('../utils/reach')
1212

1313
const ServiceHostWebsocket = require('./service-host-websocket')
1414

15-
const Pify = async (p)=>{
16-
return await p
15+
const Pify = (p)=>{
16+
return new Promise((resolve,reject)=>{
17+
p(resolve)
18+
})
1719
}
1820

1921
class ServiceHost {
@@ -140,24 +142,31 @@ class ServiceHost {
140142
//Setup router
141143
this.apiApp.use(this.runner.onRequest.bind(this.runner))
142144

143-
if(debug.enabled){ expressListRoutes('API:', this.router ) }
145+
if(debug.enabled){ expressListRoutes(this.router ) }
144146
}
145147

148+
let backlog = 511
146149
let listenPort = this.apiServerUri.port
147150
let listenHost = this.apiServerUri.hostname
148151

149152
if(this.apiServerUri.protocol == 'http:'){
150153

154+
debug('http server')
155+
151156
//! Handle http
152157
this.apiServer = http.createServer(this.apiApp)
153158

154159
} else if(this.apiServerUri.protocol == 'https:'){
155160

161+
debug('http server')
162+
156163
//! Handle https
157164
this.apiServer = https.createServer(this.apiApp)
158165

159166
} else if(this.apiServerUri.protocol == 'file:'){
160167

168+
debug('unix socket server')
169+
161170
//! Handle unix socket
162171
listenHost = null
163172
listenPort = this.apiServerUri.pathname
@@ -167,7 +176,10 @@ class ServiceHost {
167176

168177

169178
await new Promise((resolve,reject)=>{
170-
this.apiServer.listen(listenPort, listenHost, resolve)
179+
180+
debug('listening', this.apiServerUri.toString())
181+
182+
this.apiServer.listen(listenPort, listenHost==null ? backlog : listenHost, resolve)
171183
})
172184

173185
clearTimeout(this.errorHandlerTimer)
@@ -217,16 +229,19 @@ class ServiceHost {
217229
* @async
218230
*/
219231
async stop(){
220-
debug('stopping server')
221-
232+
222233
if(!this.apiServer || !this.apiServer.listening){
223234
return
224235
}
225-
236+
237+
debug('stopping server')
238+
226239
clearTimeout(this.errorHandlerTimer)
227240
this.errorHandlerTimer = null
228241

229-
await (Pify(this.apiServer.close)())
242+
await new Promise((resolve,reject)=>{
243+
this.apiServer.close(resolve)
244+
})
230245

231246
debug('stopped server')
232247
}

0 commit comments

Comments
 (0)