Skip to content

Commit 648d35e

Browse files
authored
Merge pull request #87 from nemozak1/opeyII_integration
bugfix/remove potentially broken packages and redundancies
2 parents eec0b64 + cd13f05 commit 648d35e

File tree

7 files changed

+254
-1230
lines changed

7 files changed

+254
-1230
lines changed

babel.config.js

-6
This file was deleted.

package.json

+7-14
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
"version": "1.1.3",
44
"private": true,
55
"types": [
6-
"jest",
7-
"node"
6+
"jest"
87
],
98
"scripts": {
109
"dev": "vite & ts-node server/app.ts",
@@ -22,9 +21,8 @@
2221
"@element-plus/icons-vue": "^2.1.0",
2322
"@fontsource/roboto": "^5.0.0",
2423
"@highlightjs/vue-plugin": "^2.1.0",
25-
"@types/jest": "^29.5.14",
26-
"@types/supertest": "^6.0.2",
27-
"ai": "^4.1.11",
24+
"@types/node-fetch": "^2.6.12",
25+
"ai": "^4.1.43",
2826
"axios": "^1.7.4",
2927
"cheerio": "^1.0.0",
3028
"class-transformer": "^0.5.1",
@@ -34,12 +32,11 @@
3432
"element-plus": "^2.3.9",
3533
"express": "^4.21.0",
3634
"express-session": "^1.17.3",
37-
"got": "^14.4.5",
3835
"highlight.js": "^11.8.0",
3936
"json-editor-vue": "^0.17.3",
4037
"jsonwebtoken": "^9.0.2",
4138
"markdown-it": "^14.1.0",
42-
"node-fetch": "v2.6",
39+
"node-fetch": "^2.6.7",
4340
"oauth": "^0.10.0",
4441
"obp-typescript": "^1.0.36",
4542
"pinia": "^2.0.37",
@@ -49,7 +46,6 @@
4946
"routing-controllers": "^0.10.4",
5047
"socket.io": "^4.7.5",
5148
"socket.io-client": "^4.7.5",
52-
"supertest": "^7.0.0",
5349
"typedi": "^0.10.0",
5450
"uuid": "^9.0.1",
5551
"vanilla-jsoneditor": "^2.3.3",
@@ -60,22 +56,18 @@
6056
"ws": "^8.18.0"
6157
},
6258
"devDependencies": {
63-
"@babel/core": "^7.26.8",
64-
"@babel/preset-env": "^7.26.8",
65-
"@babel/preset-typescript": "^7.26.0",
6659
"@rushstack/eslint-patch": "^1.4.0",
67-
"@types/express": "^5.0.0",
60+
"@types/jest": "^29.5.14",
6861
"@types/jsdom": "^21.1.7",
6962
"@types/jsonwebtoken": "^9.0.6",
7063
"@types/markdown-it": "^14.1.1",
71-
"@types/node": "^22.13.4",
64+
"@types/node": "^20.5.7",
7265
"@vitejs/plugin-vue": "^4.3.0",
7366
"@vitejs/plugin-vue-jsx": "^3.1.0",
7467
"@vue/eslint-config-prettier": "^9.0.0",
7568
"@vue/eslint-config-typescript": "^14.0.0",
7669
"@vue/test-utils": "^2.4.0",
7770
"@vue/tsconfig": "^0.1.3",
78-
"babel-jest": "^29.7.0",
7971
"eslint": "^9.15.0",
8072
"eslint-plugin-vue": "^9.12.0",
8173
"jest": "^29.7.0",
@@ -84,6 +76,7 @@
8476
"npm-run-all2": "^7.0.1",
8577
"prettier": "^3.0.1",
8678
"superagent": "^9.0.0",
79+
"supertest": "^7.0.0",
8780
"ts-jest": "^29.2.5",
8881
"ts-node": "^10.9.1",
8982
"typescript": "~5.2.2",

server/controllers/OpeyIIController.ts

+29-52
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import { streamText } from 'ai'
2-
import axios from 'axios'
31
import { Controller, Session, Req, Res, Post, Get } from 'routing-controllers'
42
import { Request, Response } from 'express'
3+
import { pipeline } from "node:stream/promises"
54
import { Service } from 'typedi'
65
import OBPClientService from '../services/OBPClientService'
76
import OpeyClientService from '../services/OpeyClientService'
8-
import { v6 as uuid6 } from 'uuid';
9-
import { Transform } from 'stream'
7+
108
import { UserInput } from '../schema/OpeySchema'
119

1210
@Service()
@@ -41,7 +39,7 @@ export class OpeyController {
4139
async streamOpey(
4240
@Session() session: any,
4341
@Req() request: Request,
44-
@Res() response: Response
42+
@Res() response: Response,
4543
) {
4644

4745
let user_input: UserInput
@@ -59,67 +57,46 @@ export class OpeyController {
5957

6058
console.log("Calling OpeyClientService.stream")
6159

62-
const streamMiddlewareTransform = new Transform({
63-
transform(chunk, encoding, callback) {
64-
console.log(`Logged Chunk: ${chunk}`)
65-
this.push(chunk);
60+
// const streamMiddlewareTransform = new Transform({
61+
// transform(chunk, encoding, callback) {
62+
// console.log(`Logged Chunk: ${chunk}`)
63+
// this.push(chunk);
6664

67-
callback();
68-
}
69-
})
65+
// callback();
66+
// }
67+
// })
7068

71-
let nodeStream: NodeJS.ReadableStream | null = null
69+
let stream: NodeJS.ReadableStream | null = null
7270

7371
try {
7472
// Read stream from OpeyClientService
75-
nodeStream = await this.opeyClientService.stream(user_input)
76-
console.debug(`Stream received readable: ${nodeStream.readable}`)
73+
stream = await this.opeyClientService.stream(user_input)
74+
console.debug(`Stream received readable: ${stream?.readable}`)
7775

7876
} catch (error) {
7977
console.error("Error reading stream: ", error)
80-
response.status(500).json({ error: 'Internal Server Error' })
81-
return
78+
return response.status(500).json({ error: 'Internal Server Error' })
8279
}
8380

84-
if (!nodeStream || !nodeStream.readable) {
85-
console.error("Stream is not readable")
86-
response.status(500).json({ error: 'Internal Server Error' })
87-
return
81+
if (!stream || !stream.readable) {
82+
console.error("Stream is not recieved or not readable")
83+
return response.status(500).json({ error: 'Internal Server Error' })
8884
}
8985

90-
try {
91-
// response.writeHead(200, {
92-
// 'Content-Type': "text/event-stream",
93-
// 'Cache-Control': "no-cache",
94-
// 'Connection': "keep-alive"
95-
// });
96-
97-
response.setHeader('Content-Type', 'text/event-stream')
98-
response.setHeader('Cache-Control', 'no-cache')
99-
response.setHeader('Connection', 'keep-alive')
100-
101-
let data: any[] = []
102-
103-
nodeStream.on('data', (chunk) => {
104-
const bufferChunk = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
105-
data.push(bufferChunk);
106-
response.write(`data: ${chunk.toString()}\n\n`)
86+
return new Promise<Response>((resolve, reject) => {
87+
stream.pipe(response)
88+
stream.on('end', () => {
89+
response.status(200)
90+
resolve(response)
10791
})
108-
nodeStream.on('end', () => {
109-
//console.log('Stream ended')
110-
const totalData = Buffer.concat(data)
111-
response.write(totalData)
112-
response.end()
92+
stream.on('error', (error) => {
93+
console.error("Error piping stream: ", error)
94+
reject(error)
11395
})
114-
nodeStream.on('error', (error) => {
115-
console.error(error)
116-
response.write(`data: Error reading stream\n\n`)
117-
response.end()
118-
})
119-
} catch (error) {
120-
console.error("Error writing data: ", error)
121-
response.status(500).json({ error: 'Internal Server Error' })
122-
}
96+
97+
})
98+
99+
123100
}
124101

125102
@Post('/invoke')

server/services/OpeyClientService.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Service } from 'typedi'
22
import { UserInput, StreamInput, OpeyConfig, AuthConfig } from '../schema/OpeySchema'
3-
import fetch from 'node-fetch';
3+
import { Readable } from "stream"
4+
import fetch from 'node-fetch'
45

56
@Service()
67
export default class OpeyClientService {
@@ -47,7 +48,7 @@ export default class OpeyClientService {
4748
}
4849
}
4950

50-
async stream(user_input: UserInput): Promise<NodeJS.ReadableStream> {
51+
async stream(user_input: UserInput): Promise<any> {
5152
// Endpoint to post a message to Opey and stream the response tokens/messages
5253
try {
5354

@@ -69,7 +70,10 @@ export default class OpeyClientService {
6970
if (!response.body) {
7071
throw new Error("No response body")
7172
}
72-
return response.body as NodeJS.ReadableStream
73+
74+
console.log("Got response body: ", response.body) //DEBUG
75+
76+
return response.body
7377
}
7478
catch (error) {
7579
throw new Error(`Error streaming from Opey: ${error}`)

tests/opey-unit.test.ts renamed to tests/opey-controller.test.ts

+26-21
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,15 @@ describe('OpeyController', () => {
111111
expect(res.statusCode).toBe(200);
112112
})
113113

114-
it('streamOpey', () => {
114+
it('streamOpey', async () => {
115115

116116
const _eventEmitter = new EventEmitter();
117117
_eventEmitter.addListener('data', () => {
118118
console.log('Data received')
119119
})
120120
// The default event emitter does nothing, so replace
121-
const res = httpMocks.createResponse({
122-
eventEmitter: _eventEmitter,
121+
const res = await httpMocks.createResponse({
122+
eventEmitter: EventEmitter,
123123
writableStream: Stream.Writable
124124
});
125125

@@ -132,27 +132,32 @@ describe('OpeyController', () => {
132132
} as unknown as Request;
133133

134134
// Define handelrs for events
135-
res.on('end', () => {
136-
console.log('Stream ended')
137-
console.log(res._getData())
138-
expect(res.statusCode).toBe(200);
139-
})
135+
140136

137+
141138
let chunks: any[] = [];
142-
res.on('data', (chunk) => {
143-
console.log(chunk)
144-
chunks.push(chunk);
145-
expect(chunk).toBeDefined();
146-
})
147-
148-
opeyController.streamOpey({}, req, res)
149-
.then((res) => {
150-
console.log(res)
151-
})
139+
try {
140+
const response = await opeyController.streamOpey({}, req, res)
141+
142+
response.on('end', async () => {
143+
console.log('Stream ended')
144+
console.log(res._getData())
145+
await expect(res.statusCode).toBe(200);
146+
})
147+
148+
response.on('data', async (chunk) => {
149+
console.log(chunk)
150+
await chunks.push(chunk);
151+
await expect(chunk).toBeDefined();
152+
})
153+
} catch (error) {
154+
console.error(error)
155+
}
156+
152157

153-
expect(chunks.length).toBe(10);
154-
expect(MockOpeyClientService.stream).toHaveBeenCalled();
155-
expect(res).toBeDefined();
158+
await expect(chunks.length).toBe(10);
159+
await expect(MockOpeyClientService.stream).toHaveBeenCalled();
160+
await expect(res).toBeDefined();
156161

157162
})
158163
})

0 commit comments

Comments
 (0)