@ibgib/space-gib 0.0.3 → 0.0.4

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.
Files changed (62) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/IMPLEMENTATION.md +9 -13
  3. package/dist/client/bootstrap.mjs +1 -1
  4. package/dist/client/bootstrap.mjs.map +1 -1
  5. package/dist/client/chunk-NCXKCVYS.mjs +42 -0
  6. package/dist/client/chunk-NCXKCVYS.mjs.map +7 -0
  7. package/dist/client/chunk-ZUEU37Z5.mjs +1920 -0
  8. package/dist/client/chunk-ZUEU37Z5.mjs.map +7 -0
  9. package/dist/client/index.html +103 -5
  10. package/dist/client/index.mjs +1 -1
  11. package/dist/client/script.mjs +1 -1
  12. package/dist/client/style.css +466 -61
  13. package/dist/respec-gib.node.mjs +5 -0
  14. package/dist/server/server.mjs +294 -225
  15. package/dist/server/server.mjs.map +2 -2
  16. package/package.json +6 -6
  17. package/src/client/AUTO-GENERATED-version.mts +1 -1
  18. package/src/client/components/identity-header/IMPLEMENTATION.md +45 -0
  19. package/src/client/components/identity-header/identity-header.css +74 -0
  20. package/src/client/components/identity-header/identity-header.html +10 -0
  21. package/src/client/components/identity-header/identity-header.mts +361 -0
  22. package/src/client/components/identity-manager/IMPLEMENTATION.md +100 -0
  23. package/src/client/components/identity-manager/identity-manager.css +467 -0
  24. package/src/client/components/identity-manager/identity-manager.html +113 -0
  25. package/src/client/components/identity-manager/identity-manager.mts +767 -0
  26. package/src/client/components/keystone-creator/keystone-creator.css +2 -76
  27. package/src/client/components/keystone-creator/keystone-creator.html +41 -26
  28. package/src/client/components/keystone-creator/keystone-creator.mts +178 -41
  29. package/src/client/dev-tools/base-tools.mts +252 -0
  30. package/src/client/dev-tools/common.mts +217 -0
  31. package/src/client/dev-tools/phase-1.mts +156 -0
  32. package/src/client/dev-tools/phase-2.mts +143 -0
  33. package/src/client/dev-tools/phase-3.mts +189 -0
  34. package/src/client/dev-tools/phase-4-1.mts +197 -0
  35. package/src/client/dev-tools/phase-4-10.mts +884 -0
  36. package/src/client/dev-tools/phase-4-2.mts +388 -0
  37. package/src/client/dev-tools/phase-4-3.mts +391 -0
  38. package/src/client/dev-tools/phase-4-4.mts +374 -0
  39. package/src/client/dev-tools/phase-4-5.mts +376 -0
  40. package/src/client/dev-tools/phase-4-6.mts +273 -0
  41. package/src/client/dev-tools/phase-4-7.mts +399 -0
  42. package/src/client/dev-tools/phase-4-8.mts +430 -0
  43. package/src/client/dev-tools/phase-4-9.mts +398 -0
  44. package/src/client/dev-tools/phase-4.mts +1302 -0
  45. package/src/client/dev-tools.mts +52 -1194
  46. package/src/client/index.html +103 -5
  47. package/src/client/style.css +466 -61
  48. package/src/client/ui/shell/space-gib-shell-constants.mts +0 -2
  49. package/src/client/ui/shell/space-gib-shell-service.mts +82 -10
  50. package/src/common/common-constants.mts +0 -0
  51. package/src/common/keystone-policies.json +40 -43
  52. package/src/common/keystone-policies.mts +3 -5
  53. package/src/server/path-helper.respec.mts +99 -94
  54. package/src/server/serve-gib/README.md +9 -0
  55. package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +1 -1
  56. package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +1 -1
  57. package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +31 -3
  58. package/src/server/serve-gib/handlers/ws/ws-helper.mts +73 -45
  59. package/dist/client/chunk-2KJC5XKE.mjs +0 -31
  60. package/dist/client/chunk-2KJC5XKE.mjs.map +0 -7
  61. package/dist/client/chunk-QNIXTRFO.mjs +0 -235
  62. 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 frame from the accumulated buffer.
127
+ * Parses the next complete text message, assembling fragments if necessary.
127
128
  * Returns:
128
- * - `string` if a complete text frame was decoded successfully (and consumes those bytes).
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
- if (this.buffer.length < 2) {
134
- return null;
135
- }
134
+ while (true) {
135
+ if (this.buffer.length < 2) {
136
+ return null;
137
+ }
136
138
 
137
- const opcode = this.buffer[0] & 0x0f;
138
- if (opcode === 0x8) {
139
- throw new Error('Close frame received');
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
- const secondByte = this.buffer[1];
146
- const masked = (secondByte & 0x80) !== 0;
147
- let payloadLen = secondByte & 0x7f;
148
- let headerLen = 2;
143
+ if (opcode === 0x8) {
144
+ throw new Error('Close frame received');
145
+ }
149
146
 
150
- if (payloadLen === 126) {
151
- if (this.buffer.length < 4) {
152
- return null;
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
- payloadLen = this.buffer.readUInt16BE(2);
155
- headerLen = 4;
156
- } else if (payloadLen === 127) {
157
- if (this.buffer.length < 10) {
158
- return null;
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
- const maskLen = masked ? 4 : 0;
165
- const totalFrameLen = headerLen + maskLen + payloadLen;
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
- if (this.buffer.length < totalFrameLen) {
168
- return null;
169
- }
181
+ const maskLen = masked ? 4 : 0;
182
+ const totalFrameLen = headerLen + maskLen + payloadLen;
170
183
 
171
- const frameData = this.buffer.subarray(0, totalFrameLen);
172
- this.buffer = this.buffer.subarray(totalFrameLen);
184
+ if (this.buffer.length < totalFrameLen) {
185
+ return null;
186
+ }
173
187
 
174
- let payloadStart = headerLen;
175
- if (masked) {
176
- const mask = frameData.subarray(payloadStart, payloadStart + 4);
177
- payloadStart += 4;
178
- const payload = Buffer.from(frameData.subarray(payloadStart));
179
- for (let i = 0; i < payload.length; i++) {
180
- payload[i] ^= mask[i % 4];
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
- return payload.toString('utf-8');
183
- } else {
184
- const payload = frameData.subarray(payloadStart);
185
- return payload.toString('utf-8');
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
  }