Skip to content

Commit c8f48fa

Browse files
authored
testkit-backend: extract request handlers to a separated file (#636)
1 parent c39b35c commit c8f48fa

File tree

2 files changed

+206
-229
lines changed

2 files changed

+206
-229
lines changed

testkit-backend/main.js

+12-229
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
import neo4j from 'neo4j-driver'
21
import net from 'net'
32
import readline from 'readline'
43
import Context from './context.js'
5-
import ResultObserver from './result-observer.js'
6-
import { nativeToCypher, cypherToNative } from './cypher-native-binders.js'
4+
import * as requestHandlers from './request-handlers.js'
75

86
class Backend {
97
constructor ({ writer }) {
@@ -50,234 +48,19 @@ class Backend {
5048
request = JSON.parse(request)
5149
const { name, data } = request
5250
console.log('> Got request ' + name, data)
53-
switch (name) {
54-
case 'NewDriver':
55-
{
56-
const {
57-
uri,
58-
authorizationToken: { data: authToken },
59-
userAgent
60-
} = data
61-
const driver = neo4j.driver(uri, authToken, { userAgent })
62-
const id = this._context.addDriver(driver)
63-
this._writeResponse('Driver', { id })
64-
}
65-
break
66-
67-
case 'DriverClose':
68-
{
69-
const { driverId } = data
70-
const driver = this._context.getDriver(driverId)
71-
driver
72-
.close()
73-
.then(() => {
74-
this._writeResponse('Driver', { id: driverId })
75-
})
76-
.catch(err => this._writeError(err))
77-
this._context.removeDriver(driverId)
78-
}
79-
break
80-
81-
case 'NewSession':
82-
{
83-
let { driverId, accessMode, bookmarks, database, fetchSize } = data
84-
switch (accessMode) {
85-
case 'r':
86-
accessMode = neo4j.session.READ
87-
break
88-
case 'w':
89-
accessMode = neo4j.session.WRITE
90-
break
91-
default:
92-
this._writeBackendError('Unknown accessmode: ' + accessMode)
93-
return
94-
}
95-
const driver = this._context.getDriver(driverId)
96-
const session = driver.session({
97-
defaultAccessMode: accessMode,
98-
bookmarks,
99-
database,
100-
fetchSize
101-
})
102-
const id = this._context.addSession(session)
103-
this._writeResponse('Session', { id })
104-
}
105-
break
106-
107-
case 'SessionClose':
108-
{
109-
const { sessionId } = data
110-
const session = this._context.getSession(sessionId)
111-
session
112-
.close()
113-
.then(() => {
114-
this._writeResponse('Session', { id: sessionId })
115-
})
116-
.catch(err => this._writeError(err))
117-
this._context.removeSession(sessionId)
118-
}
119-
break
120-
121-
case 'SessionRun':
122-
{
123-
const { sessionId, cypher, params, txMeta: metadata, timeout } = data
124-
const session = this._context.getSession(sessionId)
125-
if (params) {
126-
for (const [key, value] of Object.entries(params)) {
127-
params[key] = cypherToNative(value)
128-
}
129-
}
13051

131-
const observers = this._context.getResultObserversBySessionId(
132-
sessionId
133-
)
134-
135-
Promise.all(observers.map(obs => obs.completitionPromise()))
136-
.catch(_ => null)
137-
.then(_ => {
138-
const result = session.run(cypher, params, { metadata, timeout })
139-
const resultObserver = new ResultObserver({ sessionId })
140-
result.subscribe(resultObserver)
141-
const id = this._context.addResultObserver(resultObserver)
142-
this._writeResponse('Result', { id })
143-
})
144-
}
145-
break
146-
147-
case 'ResultNext':
148-
{
149-
const { resultId } = data
150-
const resultObserver = this._context.getResultObserver(resultId)
151-
const nextPromise = resultObserver.next()
152-
nextPromise
153-
.then(rec => {
154-
if (rec) {
155-
const values = Array.from(rec.values()).map(nativeToCypher)
156-
this._writeResponse('Record', {
157-
values: values
158-
})
159-
} else {
160-
this._writeResponse('NullRecord', null)
161-
}
162-
})
163-
.catch(e => {
164-
console.log('got some err: ' + JSON.stringify(e))
165-
this._writeError(e)
166-
})
167-
}
168-
break
169-
170-
case 'SessionReadTransaction':
171-
{
172-
const { sessionId } = data
173-
const session = this._context.getSession(sessionId)
174-
session
175-
.readTransaction(
176-
tx =>
177-
new Promise((resolve, reject) => {
178-
const id = this._context.addTx(tx, sessionId, resolve, reject)
179-
this._writeResponse('RetryableTry', { id })
180-
})
181-
)
182-
.then(_ => this._writeResponse('RetryableDone', null))
183-
.catch(error => this._writeError(error))
184-
}
185-
break
186-
187-
case 'TransactionRun':
188-
{
189-
const { txId, cypher, params } = data
190-
const tx = this._context.getTx(txId)
191-
if (params) {
192-
for (const [key, value] of Object.entries(params)) {
193-
params[key] = cypherToNative(value)
194-
}
195-
}
196-
const result = tx.tx.run(cypher, params)
197-
const resultObserver = new ResultObserver({})
198-
result.subscribe(resultObserver)
199-
const id = this._context.addResultObserver(resultObserver)
200-
this._writeResponse('Result', { id })
201-
}
202-
break
203-
204-
case 'RetryablePositive':
205-
{
206-
const { sessionId } = data
207-
this._context.getTxsBySessionId(sessionId).forEach(tx => {
208-
tx.resolve()
209-
this._context.removeTx(tx.id)
210-
})
211-
}
212-
break
213-
214-
case 'RetryableNegative':
215-
{
216-
const { sessionId, errorId } = data
217-
const error =
218-
this._context.getError(errorId) || new Error('Client error')
219-
this._context.getTxsBySessionId(sessionId).forEach(tx => {
220-
tx.reject(error)
221-
this._context.removeTx(tx.id)
222-
})
223-
}
224-
break
225-
226-
case 'SessionBeginTransaction':
227-
{
228-
const { sessionId, txMeta: metadata, timeout } = data
229-
const session = this._context.getSession(sessionId)
230-
const tx = session.beginTransaction({ metadata, timeout })
231-
const id = this._context.addTx(tx, sessionId)
232-
this._writeResponse('Transaction', { id })
233-
}
234-
break
235-
236-
case 'TransactionCommit':
237-
{
238-
const { txId: id } = data
239-
const { tx } = this._context.getTx(id)
240-
tx.commit()
241-
.then(() => this._writeResponse('Transaction', { id }))
242-
.catch(e => {
243-
console.log('got some err: ' + JSON.stringify(e))
244-
this._writeError(e)
245-
})
246-
this._context.removeTx(id)
247-
}
248-
break
249-
250-
case 'SessionLastBookmarks':
251-
{
252-
const { sessionId } = data
253-
const session = this._context.getSession(sessionId)
254-
const bookmarks = session.lastBookmark()
255-
this._writeResponse('Bookmarks', { bookmarks })
256-
}
257-
break
258-
259-
case 'SessionWriteTransaction':
260-
{
261-
const { sessionId } = data
262-
const session = this._context.getSession(sessionId)
263-
session
264-
.writeTransaction(
265-
tx =>
266-
new Promise((resolve, reject) => {
267-
const id = this._context.addTx(tx, sessionId, resolve, reject)
268-
this._writeResponse('RetryableTry', { id })
269-
})
270-
)
271-
.then(_ => this._writeResponse('RetryableDone', null))
272-
.catch(error => this._writeError(error))
273-
}
274-
break
275-
276-
default:
277-
this._writeBackendError('Unknown request: ' + name)
278-
console.log('Unknown request: ' + name)
279-
console.log(JSON.stringify(data))
52+
if (name in requestHandlers) {
53+
requestHandlers[name](this._context, data, {
54+
writeResponse: this._writeResponse.bind(this),
55+
writeError: this._writeError.bind(this),
56+
writeBackendError: this._writeBackendError.bind(this)
57+
})
58+
return
28059
}
60+
61+
this._writeBackendError('Unknown request: ' + name)
62+
console.log('Unknown request: ' + name)
63+
console.log(JSON.stringify(data))
28164
}
28265

28366
_writeResponse (name, data) {

0 commit comments

Comments
 (0)