Skip to content

Commit e99217e

Browse files
committed
fix implementation
1 parent db615dc commit e99217e

File tree

6 files changed

+69
-53
lines changed

6 files changed

+69
-53
lines changed

engine/debug.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
export var dStoreEnabled=false;
2+
export const setDStoreEnabled=b=>dStoreEnabled=b;
3+
export const dStore:Record<string,Array<any>>={};
4+
export function store(name:string,value:any):void{
5+
if(!dStoreEnabled)return;
6+
if(dStore[name])dStore[name].push(value);
7+
else dStore[name]=[value];
8+
};
9+
110
export const libOpt = {
211
debug: false,
312
eventDbg: false,

engine/http2-socket.ts

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import "./lib.deno.d.ts";
22
import "./lib.engine.d.ts";
33
import { Eventable as StandardMethods } from "./standard.ts";
4-
import { libOpt } from "./debug.ts";
4+
import { libOpt, store } from "./debug.ts";
55
import { ByteLib } from "./buffer.ts";
66

77
import * as compress from "jsr:@deno-library/compress";
@@ -152,56 +152,58 @@ export class Http2Socket extends StandardMethods {
152152
try {
153153
for (const fr of frames) {
154154
//console.log(fr.type, fr); // :REMOVE:
155-
if(!fr||!fr?.raw){
156-
this.emit("error",[new Error("no frame data"),fr]);
157-
continue;
158-
if(false)break loop;
159-
};
160-
if (libOpt.debug) console.log(fr.type, fr);
161-
if (!this.#usedSids.includes(fr.streamId)) this.#usedSids.push(fr.streamId);
162-
if (fr.streamId != 0 && !flow[fr.streamId]) this.#flowInit(fr.streamId);//flow[fr.streamId]=setting[4];
163-
if (fr.raw.type == 4 && fr.raw.flags == 0) {
164-
//settings.push(fr);
165-
if (fr.streamId == 0) for (let si in fr.settings.int) this.#setting[si] = fr.settings.int[si];
166-
else for (let si in fr.settings.int) {
167-
if (!settings[fr.streamId]) settings[fr.streamId] = { ...setting, ...fr.settings.int };
168-
else for (let si in fr.settings.int) settings[fr.streamId][si] = fr.settings.int[si];
155+
store("http2frame",fr); // :DEBUG:
156+
if(fr.readSuccess){
157+
if (libOpt.debug) console.log(fr.type, fr);
158+
if (!this.#usedSids.includes(fr.streamId)) this.#usedSids.push(fr.streamId);
159+
if (fr.streamId != 0 && !flow[fr.streamId]) this.#flowInit(fr.streamId);//flow[fr.streamId]=setting[4];
160+
if (fr.raw.type == 4 && fr.raw.flags == 0) {
161+
//settings.push(fr);
162+
if (fr.streamId == 0) for (let si in fr.settings.int) this.#setting[si] = fr.settings.int[si];
163+
else for (let si in fr.settings.int) {
164+
if (!settings[fr.streamId]) settings[fr.streamId] = { ...setting, ...fr.settings.int };
165+
else for (let si in fr.settings.int) settings[fr.streamId][si] = fr.settings.int[si];
166+
};
167+
if (fr.settings.int[4]) flow[fr.streamId] = fr.settings.int[4];
168+
const nf = await this.#frame(fr.streamId, 4, { flags: ["ack"] });
169+
//console.log("setting acknowledgement",nf); // :REMOVE:
170+
let r = await this.#tcp.write(nf.buffer).catch(e => e);
171+
//console.log("write result",r); // :REMOVE:
172+
} else if (fr.raw.type == 8) {
173+
let wu = fr.buffer;
174+
//if(!flow[fr.streamId])flow[fr.streamId]=flow[0];
175+
let awu = [...wu];
176+
this.#flow[fr.streamId] += parseInt(awu.map(v => ("00" + v.toString(16)).substring(v.toString(16).length)).join(''), 16);
177+
} else if (fr.raw.type == 1) {
178+
if (!headersBuff[fr.streamId]) headersBuff[fr.streamId] = [];
179+
if (!headers[fr.streamId]) headers[fr.streamId] = {};
180+
headers[fr.streamId] = { ...headers[fr.streamId], ...fr.headers };
181+
headersBuff[fr.streamId].push(...fr.raw.payload);
182+
183+
if (fr.flags.includes("end_stream")) {
184+
this.#respond(fr.streamId, headers, bodies, headersBuff);
185+
}
186+
} else if (fr.raw.type == 0) {
187+
if (!bodies[fr.streamId]) bodies[fr.streamId] = [];
188+
bodies[fr.streamId].push(...fr.buffer);
189+
190+
if (fr.flags.includes("end_stream")) {
191+
this.#respond(fr.streamId, headers, bodies, headersBuff);
192+
}
193+
} else if (fr.raw.type == 7) {
194+
await this.#tcp.write((await this.#frame(fr.streamId, 7, { flags: ["ack"] })).buffer).catch(e => e);
195+
this.emit("close", fr);
196+
this.#tcp.close();
197+
} else if (fr.raw.type == 3) {
198+
flow[fr.streamId] = flow[0];
199+
this.#usedSids.splice(this.#usedSids.indexOf(fr.streamId), 1);
200+
} else if (fr.raw.type == 6) {
201+
await this.#tcp.write((await this.#frame(fr.streamId, 6, { flags: ["ack"], data: fr.buffer })).buffer).catch(e => e);
169202
};
170-
if (fr.settings.int[4]) flow[fr.streamId] = fr.settings.int[4];
171-
const nf = await this.#frame(fr.streamId, 4, { flags: ["ack"] });
172-
//console.log("setting acknowledgement",nf); // :REMOVE:
173-
let r = await this.#tcp.write(nf.buffer).catch(e => e);
174-
//console.log("write result",r); // :REMOVE:
175-
} else if (fr.raw.type == 8) {
176-
let wu = fr.buffer;
177-
//if(!flow[fr.streamId])flow[fr.streamId]=flow[0];
178-
let awu = [...wu];
179-
this.#flow[fr.streamId] += parseInt(awu.map(v => ("00" + v.toString(16)).substring(v.toString(16).length)).join(''), 16);
180-
} else if (fr.raw.type == 1) {
181-
if (!headersBuff[fr.streamId]) headersBuff[fr.streamId] = [];
182-
if (!headers[fr.streamId]) headers[fr.streamId] = {};
183-
headers[fr.streamId] = { ...headers[fr.streamId], ...fr.headers };
184-
headersBuff[fr.streamId].push(...fr.raw.payload);
185-
186-
if (fr.flags.includes("end_stream")) {
187-
this.#respond(fr.streamId, headers, bodies, headersBuff);
188-
}
189-
} else if (fr.raw.type == 0) {
190-
if (!bodies[fr.streamId]) bodies[fr.streamId] = [];
191-
bodies[fr.streamId].push(...fr.buffer);
192-
193-
if (fr.flags.includes("end_stream")) {
194-
this.#respond(fr.streamId, headers, bodies, headersBuff);
195-
}
196-
} else if (fr.raw.type == 7) {
197-
await this.#tcp.write((await this.#frame(fr.streamId, 7, { flags: ["ack"] })).buffer).catch(e => e);
198-
this.emit("close", fr);
199-
this.#tcp.close();
200-
} else if (fr.raw.type == 3) {
201-
flow[fr.streamId] = flow[0];
202-
this.#usedSids.splice(this.#usedSids.indexOf(fr.streamId), 1);
203-
} else if (fr.raw.type == 6) {
204-
await this.#tcp.write((await this.#frame(fr.streamId, 6, { flags: ["ack"], data: fr.buffer })).buffer).catch(e => e);
203+
}else/*(!fr.readSuccess)*/{
204+
this.emit("error",[new Error("frame read unsuccessfull"),fr]);
205+
//continue;
206+
if(false)break loop;
205207
};
206208
};
207209

engine/library.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,10 @@ declare namespace Engine {
528528
*/
529529
readonly settings:{readonly str:Record<string,number>,readonly int:Record<number,number>},
530530

531+
/**
532+
* Indicitates whether the Http2Frame contains data or just default values
533+
*/
534+
readonly readSuccess: boolean;
531535
/**
532536
*
533537
*/

engine/mixer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@
88

99
export * from "./engine.ts";
1010
//export * as Engine from "./engine.ts";
11-
export { libOpt, setOpt } from "./debug.ts";
11+
//export { libOpt, setOpt } from "./debug.ts";
1212
export * from "./http2-socket.ts";
1313
export * from "./http-socket.ts";
1414
export * from "./websocket.ts";
1515
export * from "./standard.ts";
16+
export * from "./debug.ts";
1617

1718
// */

engine/mod.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ export * as EngineLib from "./mixer.ts";
44

55
// declerations
66

7-
export * from "./library.d.ts";
7+
//export * from "./library.d.ts";

last-pid.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
12048
1+
15356

0 commit comments

Comments
 (0)