@ibgib/space-gib 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/IMPLEMENTATION.md +9 -13
- package/README.md +7 -0
- package/dist/client/bootstrap.mjs +1 -1
- package/dist/client/bootstrap.mjs.map +1 -1
- package/dist/client/chunk-ANGVYAEK.mjs +42 -0
- package/dist/client/chunk-ANGVYAEK.mjs.map +7 -0
- package/dist/client/chunk-IRGFDQRD.mjs +1920 -0
- package/dist/client/chunk-IRGFDQRD.mjs.map +7 -0
- package/dist/client/index.html +103 -5
- package/dist/client/index.mjs +1 -1
- package/dist/client/script.mjs +1 -1
- package/dist/client/style.css +466 -61
- package/dist/respec-gib.node.mjs +5 -0
- package/dist/server/server.mjs +533 -233
- package/dist/server/server.mjs.map +2 -2
- package/package.json +6 -6
- package/src/client/AUTO-GENERATED-version.mts +1 -1
- package/src/client/components/identity-header/IMPLEMENTATION.md +45 -0
- package/src/client/components/identity-header/identity-header.css +74 -0
- package/src/client/components/identity-header/identity-header.html +10 -0
- package/src/client/components/identity-header/identity-header.mts +361 -0
- package/src/client/components/identity-manager/IMPLEMENTATION.md +100 -0
- package/src/client/components/identity-manager/identity-manager.css +467 -0
- package/src/client/components/identity-manager/identity-manager.html +113 -0
- package/src/client/components/identity-manager/identity-manager.mts +767 -0
- package/src/client/components/keystone-creator/keystone-creator.css +2 -76
- package/src/client/components/keystone-creator/keystone-creator.html +41 -26
- package/src/client/components/keystone-creator/keystone-creator.mts +178 -41
- package/src/client/dev-tools/base-tools.mts +252 -0
- package/src/client/dev-tools/common.mts +217 -0
- package/src/client/dev-tools/phase-1.mts +156 -0
- package/src/client/dev-tools/phase-2.mts +143 -0
- package/src/client/dev-tools/phase-3.mts +189 -0
- package/src/client/dev-tools/phase-4-1.mts +197 -0
- package/src/client/dev-tools/phase-4-10.mts +884 -0
- package/src/client/dev-tools/phase-4-2.mts +388 -0
- package/src/client/dev-tools/phase-4-3.mts +391 -0
- package/src/client/dev-tools/phase-4-4.mts +374 -0
- package/src/client/dev-tools/phase-4-5.mts +376 -0
- package/src/client/dev-tools/phase-4-6.mts +273 -0
- package/src/client/dev-tools/phase-4-7.mts +399 -0
- package/src/client/dev-tools/phase-4-8.mts +430 -0
- package/src/client/dev-tools/phase-4-9.mts +398 -0
- package/src/client/dev-tools/phase-4.mts +1302 -0
- package/src/client/dev-tools.mts +52 -1194
- package/src/client/index.html +103 -5
- package/src/client/style.css +466 -61
- package/src/client/ui/shell/space-gib-shell-constants.mts +0 -2
- package/src/client/ui/shell/space-gib-shell-service.mts +82 -10
- package/src/common/common-constants.mts +0 -0
- package/src/common/keystone-policies.json +40 -43
- package/src/common/keystone-policies.mts +3 -5
- package/src/server/path-helper.respec.mts +99 -94
- package/src/server/serve-gib/README.md +9 -0
- package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +1 -1
- package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +1 -1
- package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +31 -3
- package/src/server/serve-gib/handlers/ws/ws-helper.mts +73 -45
- package/dist/client/chunk-2KJC5XKE.mjs +0 -31
- package/dist/client/chunk-2KJC5XKE.mjs.map +0 -7
- package/dist/client/chunk-QNIXTRFO.mjs +0 -235
- package/dist/client/chunk-QNIXTRFO.mjs.map +0 -7
|
@@ -116,6 +116,7 @@ export function performConnect(req: IncomingMessage, socket: Socket): boolean {
|
|
|
116
116
|
*/
|
|
117
117
|
export class WebSocketFrameDecoder {
|
|
118
118
|
private buffer: Buffer = Buffer.alloc(0);
|
|
119
|
+
private fragments: Buffer[] = [];
|
|
119
120
|
|
|
120
121
|
/** Adds new data chunk from TCP socket. */
|
|
121
122
|
addChunk(chunk: Buffer): void {
|
|
@@ -123,66 +124,93 @@ export class WebSocketFrameDecoder {
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
/**
|
|
126
|
-
* Parses the next complete text
|
|
127
|
+
* Parses the next complete text message, assembling fragments if necessary.
|
|
127
128
|
* Returns:
|
|
128
|
-
* - `string` if a complete text
|
|
129
|
+
* - `string` if a complete text message was assembled/decoded (and consumes those bytes).
|
|
129
130
|
* - `null` if the buffer is incomplete or we need more data.
|
|
130
131
|
* - `throws Error` on protocol errors or close frames.
|
|
131
132
|
*/
|
|
132
133
|
nextFrame(): string | null {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
while (true) {
|
|
135
|
+
if (this.buffer.length < 2) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
136
138
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
if (opcode !== 0x1) {
|
|
142
|
-
throw new Error(`Unsupported WebSocket opcode: 0x${opcode.toString(16)}`);
|
|
143
|
-
}
|
|
139
|
+
const firstByte = this.buffer[0];
|
|
140
|
+
const fin = (firstByte & 0x80) !== 0;
|
|
141
|
+
const opcode = firstByte & 0x0f;
|
|
144
142
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
let headerLen = 2;
|
|
143
|
+
if (opcode === 0x8) {
|
|
144
|
+
throw new Error('Close frame received');
|
|
145
|
+
}
|
|
149
146
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
147
|
+
const isContinuation = opcode === 0x0;
|
|
148
|
+
const isText = opcode === 0x1;
|
|
149
|
+
|
|
150
|
+
if (!isContinuation && !isText) {
|
|
151
|
+
throw new Error(`Unsupported WebSocket opcode: 0x${opcode.toString(16)}`);
|
|
153
152
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
153
|
+
|
|
154
|
+
// Protocol checks
|
|
155
|
+
if (isContinuation && this.fragments.length === 0) {
|
|
156
|
+
throw new Error('Continuation frame received without an active message.');
|
|
157
|
+
}
|
|
158
|
+
if (isText && this.fragments.length > 0) {
|
|
159
|
+
throw new Error('New message frame received before previous one completed.');
|
|
159
160
|
}
|
|
160
|
-
payloadLen = Number(this.buffer.readBigUInt64BE(2));
|
|
161
|
-
headerLen = 10;
|
|
162
|
-
}
|
|
163
161
|
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
const secondByte = this.buffer[1];
|
|
163
|
+
const masked = (secondByte & 0x80) !== 0;
|
|
164
|
+
let payloadLen = secondByte & 0x7f;
|
|
165
|
+
let headerLen = 2;
|
|
166
|
+
|
|
167
|
+
if (payloadLen === 126) {
|
|
168
|
+
if (this.buffer.length < 4) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
payloadLen = this.buffer.readUInt16BE(2);
|
|
172
|
+
headerLen = 4;
|
|
173
|
+
} else if (payloadLen === 127) {
|
|
174
|
+
if (this.buffer.length < 10) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
payloadLen = Number(this.buffer.readBigUInt64BE(2));
|
|
178
|
+
headerLen = 10;
|
|
179
|
+
}
|
|
166
180
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
}
|
|
181
|
+
const maskLen = masked ? 4 : 0;
|
|
182
|
+
const totalFrameLen = headerLen + maskLen + payloadLen;
|
|
170
183
|
|
|
171
|
-
|
|
172
|
-
|
|
184
|
+
if (this.buffer.length < totalFrameLen) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
173
187
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
188
|
+
// Consume frame from buffer
|
|
189
|
+
const frameData = this.buffer.subarray(0, totalFrameLen);
|
|
190
|
+
this.buffer = this.buffer.subarray(totalFrameLen);
|
|
191
|
+
|
|
192
|
+
let payloadStart = headerLen;
|
|
193
|
+
let payload: Buffer;
|
|
194
|
+
if (masked) {
|
|
195
|
+
const mask = frameData.subarray(payloadStart, payloadStart + 4);
|
|
196
|
+
payloadStart += 4;
|
|
197
|
+
payload = Buffer.from(frameData.subarray(payloadStart));
|
|
198
|
+
for (let i = 0; i < payload.length; i++) {
|
|
199
|
+
payload[i] ^= mask[i % 4];
|
|
200
|
+
}
|
|
201
|
+
} else {
|
|
202
|
+
payload = Buffer.from(frameData.subarray(payloadStart));
|
|
181
203
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
204
|
+
|
|
205
|
+
this.fragments.push(payload);
|
|
206
|
+
|
|
207
|
+
if (fin) {
|
|
208
|
+
const completePayload = Buffer.concat(this.fragments);
|
|
209
|
+
this.fragments = [];
|
|
210
|
+
return completePayload.toString('utf-8');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Loop again to process any subsequent frames already inside the TCP buffer
|
|
186
214
|
}
|
|
187
215
|
}
|
|
188
216
|
}
|