@hex1b/web-terminal 0.1.0 → 0.166.0
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/README.md +314 -11
- package/dist/backend-selection.d.ts +7 -0
- package/dist/backend-selection.d.ts.map +1 -0
- package/dist/backend-selection.js +23 -0
- package/dist/backend-selection.js.map +1 -0
- package/dist/hyperlinks.d.ts +10 -0
- package/dist/hyperlinks.d.ts.map +1 -0
- package/dist/hyperlinks.js +28 -0
- package/dist/hyperlinks.js.map +1 -0
- package/dist/mouse-input.d.ts +3 -0
- package/dist/mouse-input.d.ts.map +1 -1
- package/dist/mouse-input.js +69 -2
- package/dist/mouse-input.js.map +1 -1
- package/dist/protocol.d.ts +1 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +40 -0
- package/dist/protocol.js.map +1 -1
- package/dist/render-backend.d.ts +31 -0
- package/dist/render-backend.d.ts.map +1 -0
- package/dist/render-backend.js +5 -0
- package/dist/render-backend.js.map +1 -0
- package/dist/renderer-options.d.ts +3 -0
- package/dist/renderer-options.d.ts.map +1 -0
- package/dist/renderer-options.js +6 -0
- package/dist/renderer-options.js.map +1 -0
- package/dist/renderer.d.ts +12 -24
- package/dist/renderer.d.ts.map +1 -1
- package/dist/renderer.js +35 -173
- package/dist/renderer.js.map +1 -1
- package/dist/terminal-worker.js +18 -10
- package/dist/terminal-worker.js.map +1 -1
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/web-terminal.d.ts +8 -1
- package/dist/web-terminal.d.ts.map +1 -1
- package/dist/web-terminal.js +130 -17
- package/dist/web-terminal.js.map +1 -1
- package/dist/webgl2-backend.d.ts +38 -0
- package/dist/webgl2-backend.d.ts.map +1 -0
- package/dist/webgl2-backend.js +456 -0
- package/dist/webgl2-backend.js.map +1 -0
- package/dist/webgpu-backend.d.ts +24 -0
- package/dist/webgpu-backend.d.ts.map +1 -0
- package/dist/webgpu-backend.js +234 -0
- package/dist/webgpu-backend.js.map +1 -0
- package/dist/wire-types.d.ts +20 -2
- package/dist/wire-types.d.ts.map +1 -1
- package/dist/wire-types.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { QUAD_STRIDE, RendererUnavailableError } from "./render-backend.js";
|
|
2
|
+
const shader = /* wgsl */ `
|
|
3
|
+
struct Viewport { size: vec2f, padding: vec2f }
|
|
4
|
+
@group(0) @binding(0) var<uniform> viewport: Viewport;
|
|
5
|
+
@group(0) @binding(1) var image: texture_2d<f32>;
|
|
6
|
+
@group(0) @binding(2) var imageSampler: sampler;
|
|
7
|
+
|
|
8
|
+
struct VertexOut {
|
|
9
|
+
@builtin(position) position: vec4f,
|
|
10
|
+
@location(0) uv: vec2f,
|
|
11
|
+
@location(1) color: vec4f,
|
|
12
|
+
@location(2) @interpolate(flat) mode: f32,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@vertex fn vertex(
|
|
16
|
+
@builtin(vertex_index) index: u32,
|
|
17
|
+
@location(0) rect: vec4f,
|
|
18
|
+
@location(1) uvRect: vec4f,
|
|
19
|
+
@location(2) color: vec4f,
|
|
20
|
+
@location(3) mode: f32,
|
|
21
|
+
) -> VertexOut {
|
|
22
|
+
let corners = array<vec2f, 6>(
|
|
23
|
+
vec2f(0, 0), vec2f(1, 0), vec2f(0, 1),
|
|
24
|
+
vec2f(0, 1), vec2f(1, 0), vec2f(1, 1)
|
|
25
|
+
);
|
|
26
|
+
let corner = corners[index];
|
|
27
|
+
let position = rect.xy + corner * rect.zw;
|
|
28
|
+
var out: VertexOut;
|
|
29
|
+
out.position = vec4f(position / viewport.size * vec2f(2, -2) + vec2f(-1, 1), 0, 1);
|
|
30
|
+
out.uv = mix(uvRect.xy, uvRect.zw, corner);
|
|
31
|
+
out.color = color;
|
|
32
|
+
out.mode = mode;
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@fragment fn fragment(in: VertexOut) -> @location(0) vec4f {
|
|
37
|
+
// Explicit LOD avoids derivative-uniformity requirements across solid/mask/image batches.
|
|
38
|
+
let texel = textureSampleLevel(image, imageSampler, in.uv, 0);
|
|
39
|
+
if (in.mode < 0.5) { return in.color; }
|
|
40
|
+
if (in.mode < 1.5) { return vec4f(in.color.rgb, in.color.a * texel.a); }
|
|
41
|
+
return texel * in.color;
|
|
42
|
+
}`;
|
|
43
|
+
class WebGpuTexture {
|
|
44
|
+
device;
|
|
45
|
+
texture;
|
|
46
|
+
bindGroup;
|
|
47
|
+
width;
|
|
48
|
+
height;
|
|
49
|
+
constructor(device, texture, bindGroup, width, height) {
|
|
50
|
+
this.device = device;
|
|
51
|
+
this.texture = texture;
|
|
52
|
+
this.bindGroup = bindGroup;
|
|
53
|
+
this.width = width;
|
|
54
|
+
this.height = height;
|
|
55
|
+
}
|
|
56
|
+
writePixels(pixels, width, height, x = 0, y = 0) {
|
|
57
|
+
this.device.queue.writeTexture({ texture: this.texture, origin: [x, y] }, pixels, { bytesPerRow: width * 4, rowsPerImage: height }, [width, height]);
|
|
58
|
+
}
|
|
59
|
+
writeBitmap(bitmap) {
|
|
60
|
+
this.device.queue.copyExternalImageToTexture({ source: bitmap }, { texture: this.texture, premultipliedAlpha: false }, [this.width, this.height]);
|
|
61
|
+
}
|
|
62
|
+
destroy() { this.texture.destroy(); }
|
|
63
|
+
}
|
|
64
|
+
export class WebGpuBackend {
|
|
65
|
+
device;
|
|
66
|
+
kind = "webgpu";
|
|
67
|
+
instanceBufferBytes = 0;
|
|
68
|
+
instanceBuffer;
|
|
69
|
+
disposed = false;
|
|
70
|
+
context;
|
|
71
|
+
format;
|
|
72
|
+
uniform;
|
|
73
|
+
sampler;
|
|
74
|
+
pipeline;
|
|
75
|
+
static async create(canvas, onFatal) {
|
|
76
|
+
if (!globalThis.isSecureContext)
|
|
77
|
+
throw new RendererUnavailableError("WebGPU requires HTTPS or localhost");
|
|
78
|
+
if (!navigator.gpu)
|
|
79
|
+
throw new RendererUnavailableError("WebGPU is unavailable in this browser worker");
|
|
80
|
+
const adapter = await navigator.gpu.requestAdapter();
|
|
81
|
+
if (!adapter)
|
|
82
|
+
throw new RendererUnavailableError("No WebGPU adapter is available");
|
|
83
|
+
let device;
|
|
84
|
+
try {
|
|
85
|
+
device = await adapter.requestDevice();
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof DOMException && error.name === "OperationError") {
|
|
89
|
+
throw new RendererUnavailableError(`Could not acquire a WebGPU device: ${error.message}`, { cause: error });
|
|
90
|
+
}
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
let backend;
|
|
94
|
+
try {
|
|
95
|
+
backend = new WebGpuBackend(device);
|
|
96
|
+
const active = backend;
|
|
97
|
+
device.lost.then(info => {
|
|
98
|
+
if (!active.disposed)
|
|
99
|
+
onFatal(new Error(`WebGPU device lost: ${info.message || info.reason}`));
|
|
100
|
+
});
|
|
101
|
+
device.addEventListener("uncapturederror", event => {
|
|
102
|
+
if (!active.disposed)
|
|
103
|
+
onFatal(new Error(`WebGPU error: ${event.error.message}`));
|
|
104
|
+
});
|
|
105
|
+
await backend.initialize(canvas);
|
|
106
|
+
return backend;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (backend)
|
|
110
|
+
backend.dispose();
|
|
111
|
+
else
|
|
112
|
+
device.destroy();
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
constructor(device) {
|
|
117
|
+
this.device = device;
|
|
118
|
+
this.format = navigator.gpu.getPreferredCanvasFormat();
|
|
119
|
+
this.uniform = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
|
|
120
|
+
this.sampler = device.createSampler({ minFilter: "linear", magFilter: "linear" });
|
|
121
|
+
}
|
|
122
|
+
get maxTextureDimension2D() { return this.device.limits.maxTextureDimension2D; }
|
|
123
|
+
get maxCanvasDimension2D() { return this.maxTextureDimension2D; }
|
|
124
|
+
async initialize(canvas) {
|
|
125
|
+
const module = this.device.createShaderModule({ code: shader });
|
|
126
|
+
this.pipeline = await this.device.createRenderPipelineAsync({
|
|
127
|
+
layout: "auto",
|
|
128
|
+
vertex: {
|
|
129
|
+
module,
|
|
130
|
+
entryPoint: "vertex",
|
|
131
|
+
buffers: [{
|
|
132
|
+
arrayStride: QUAD_STRIDE * 4,
|
|
133
|
+
stepMode: "instance",
|
|
134
|
+
attributes: [
|
|
135
|
+
{ shaderLocation: 0, offset: 0, format: "float32x4" },
|
|
136
|
+
{ shaderLocation: 1, offset: 16, format: "float32x4" },
|
|
137
|
+
{ shaderLocation: 2, offset: 32, format: "float32x4" },
|
|
138
|
+
{ shaderLocation: 3, offset: 48, format: "float32" },
|
|
139
|
+
],
|
|
140
|
+
}],
|
|
141
|
+
},
|
|
142
|
+
fragment: {
|
|
143
|
+
module,
|
|
144
|
+
entryPoint: "fragment",
|
|
145
|
+
targets: [{
|
|
146
|
+
format: this.format,
|
|
147
|
+
blend: {
|
|
148
|
+
color: { srcFactor: "src-alpha", dstFactor: "one-minus-src-alpha" },
|
|
149
|
+
alpha: { srcFactor: "one", dstFactor: "one-minus-src-alpha" },
|
|
150
|
+
},
|
|
151
|
+
}],
|
|
152
|
+
},
|
|
153
|
+
primitive: { topology: "triangle-list" },
|
|
154
|
+
});
|
|
155
|
+
// Acquire the presentation surface last. A null context leaves it usable by WebGL2.
|
|
156
|
+
const context = canvas.getContext("webgpu");
|
|
157
|
+
if (!context)
|
|
158
|
+
throw new RendererUnavailableError("Could not create an OffscreenCanvas WebGPU context");
|
|
159
|
+
this.context = context;
|
|
160
|
+
context.configure({ device: this.device, format: this.format, alphaMode: "opaque" });
|
|
161
|
+
}
|
|
162
|
+
createTexture(width, height, label) {
|
|
163
|
+
if (width > this.maxTextureDimension2D || height > this.maxTextureDimension2D) {
|
|
164
|
+
throw new Error(`${label} exceeds the GPU texture dimension limit`);
|
|
165
|
+
}
|
|
166
|
+
if (!this.pipeline)
|
|
167
|
+
throw new Error("WebGPU backend is not initialized");
|
|
168
|
+
const texture = this.device.createTexture({
|
|
169
|
+
label, size: [width, height], format: "rgba8unorm",
|
|
170
|
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,
|
|
171
|
+
});
|
|
172
|
+
try {
|
|
173
|
+
const bindGroup = this.device.createBindGroup({
|
|
174
|
+
layout: this.pipeline.getBindGroupLayout(0),
|
|
175
|
+
entries: [
|
|
176
|
+
{ binding: 0, resource: { buffer: this.uniform } },
|
|
177
|
+
{ binding: 1, resource: texture.createView() },
|
|
178
|
+
{ binding: 2, resource: this.sampler },
|
|
179
|
+
],
|
|
180
|
+
});
|
|
181
|
+
return new WebGpuTexture(this.device, texture, bindGroup, width, height);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
texture.destroy();
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
resize(width, height) {
|
|
189
|
+
this.device.queue.writeBuffer(this.uniform, 0, new Float32Array([width, height, 0, 0]));
|
|
190
|
+
}
|
|
191
|
+
submit(instances, quadCount, batches, background) {
|
|
192
|
+
if (this.disposed || !this.context || !this.pipeline)
|
|
193
|
+
throw new Error("WebGPU backend is not initialized");
|
|
194
|
+
const usedBytes = quadCount * QUAD_STRIDE * 4;
|
|
195
|
+
if (!this.instanceBuffer || usedBytes > this.instanceBufferBytes) {
|
|
196
|
+
this.instanceBuffer?.destroy();
|
|
197
|
+
this.instanceBufferBytes = Math.max(256, instances.byteLength);
|
|
198
|
+
this.instanceBuffer = this.device.createBuffer({
|
|
199
|
+
size: this.instanceBufferBytes, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
if (usedBytes)
|
|
203
|
+
this.device.queue.writeBuffer(this.instanceBuffer, 0, instances, 0, quadCount * QUAD_STRIDE);
|
|
204
|
+
const encoder = this.device.createCommandEncoder();
|
|
205
|
+
const pass = encoder.beginRenderPass({
|
|
206
|
+
colorAttachments: [{
|
|
207
|
+
view: this.context.getCurrentTexture().createView(),
|
|
208
|
+
clearValue: { r: background[0], g: background[1], b: background[2], a: 1 },
|
|
209
|
+
loadOp: "clear", storeOp: "store",
|
|
210
|
+
}],
|
|
211
|
+
});
|
|
212
|
+
pass.setPipeline(this.pipeline);
|
|
213
|
+
pass.setVertexBuffer(0, this.instanceBuffer);
|
|
214
|
+
for (const batch of batches) {
|
|
215
|
+
if (!(batch.resource instanceof WebGpuTexture))
|
|
216
|
+
throw new Error("Texture belongs to a different rendering backend");
|
|
217
|
+
pass.setBindGroup(0, batch.resource.bindGroup);
|
|
218
|
+
pass.draw(6, batch.count, 0, batch.start);
|
|
219
|
+
}
|
|
220
|
+
pass.end();
|
|
221
|
+
this.device.queue.submit([encoder.finish()]);
|
|
222
|
+
}
|
|
223
|
+
async idle() { await this.device.queue.onSubmittedWorkDone(); }
|
|
224
|
+
dispose() {
|
|
225
|
+
if (this.disposed)
|
|
226
|
+
return;
|
|
227
|
+
this.disposed = true;
|
|
228
|
+
this.instanceBuffer?.destroy();
|
|
229
|
+
this.uniform.destroy();
|
|
230
|
+
this.context?.unconfigure();
|
|
231
|
+
this.device.destroy();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=webgpu-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgpu-backend.js","sourceRoot":"","sources":["../src/webgpu-backend.ts"],"names":[],"mappings":"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","sourcesContent":["import { QUAD_STRIDE, RendererUnavailableError } from \"./render-backend.js\";\nimport type { RenderBackend, RenderBatch, RenderColor, RenderPixels, RenderTexture } from \"./render-backend.js\";\n\nconst shader = /* wgsl */ `\nstruct Viewport { size: vec2f, padding: vec2f }\n@group(0) @binding(0) var<uniform> viewport: Viewport;\n@group(0) @binding(1) var image: texture_2d<f32>;\n@group(0) @binding(2) var imageSampler: sampler;\n\nstruct VertexOut {\n @builtin(position) position: vec4f,\n @location(0) uv: vec2f,\n @location(1) color: vec4f,\n @location(2) @interpolate(flat) mode: f32,\n}\n\n@vertex fn vertex(\n @builtin(vertex_index) index: u32,\n @location(0) rect: vec4f,\n @location(1) uvRect: vec4f,\n @location(2) color: vec4f,\n @location(3) mode: f32,\n) -> VertexOut {\n let corners = array<vec2f, 6>(\n vec2f(0, 0), vec2f(1, 0), vec2f(0, 1),\n vec2f(0, 1), vec2f(1, 0), vec2f(1, 1)\n );\n let corner = corners[index];\n let position = rect.xy + corner * rect.zw;\n var out: VertexOut;\n out.position = vec4f(position / viewport.size * vec2f(2, -2) + vec2f(-1, 1), 0, 1);\n out.uv = mix(uvRect.xy, uvRect.zw, corner);\n out.color = color;\n out.mode = mode;\n return out;\n}\n\n@fragment fn fragment(in: VertexOut) -> @location(0) vec4f {\n // Explicit LOD avoids derivative-uniformity requirements across solid/mask/image batches.\n let texel = textureSampleLevel(image, imageSampler, in.uv, 0);\n if (in.mode < 0.5) { return in.color; }\n if (in.mode < 1.5) { return vec4f(in.color.rgb, in.color.a * texel.a); }\n return texel * in.color;\n}`;\n\nclass WebGpuTexture implements RenderTexture {\n constructor(readonly device: GPUDevice, readonly texture: GPUTexture, readonly bindGroup: GPUBindGroup,\n readonly width: number, readonly height: number) {}\n\n writePixels(pixels: RenderPixels, width: number, height: number, x = 0, y = 0): void {\n this.device.queue.writeTexture({ texture: this.texture, origin: [x, y] }, pixels,\n { bytesPerRow: width * 4, rowsPerImage: height }, [width, height]);\n }\n\n writeBitmap(bitmap: ImageBitmap): void {\n this.device.queue.copyExternalImageToTexture({ source: bitmap },\n { texture: this.texture, premultipliedAlpha: false }, [this.width, this.height]);\n }\n\n destroy(): void { this.texture.destroy(); }\n}\n\nexport class WebGpuBackend implements RenderBackend {\n readonly kind = \"webgpu\";\n instanceBufferBytes = 0;\n instanceBuffer: GPUBuffer | undefined;\n disposed = false;\n context?: GPUCanvasContext;\n format: GPUTextureFormat;\n uniform: GPUBuffer;\n sampler: GPUSampler;\n pipeline?: GPURenderPipeline;\n\n static async create(canvas: OffscreenCanvas, onFatal: (error: Error) => void): Promise<WebGpuBackend> {\n if (!globalThis.isSecureContext) throw new RendererUnavailableError(\"WebGPU requires HTTPS or localhost\");\n if (!navigator.gpu) throw new RendererUnavailableError(\"WebGPU is unavailable in this browser worker\");\n const adapter = await navigator.gpu.requestAdapter();\n if (!adapter) throw new RendererUnavailableError(\"No WebGPU adapter is available\");\n let device: GPUDevice;\n try {\n device = await adapter.requestDevice();\n } catch (error) {\n if (error instanceof DOMException && error.name === \"OperationError\") {\n throw new RendererUnavailableError(`Could not acquire a WebGPU device: ${error.message}`, { cause: error });\n }\n throw error;\n }\n let backend: WebGpuBackend | undefined;\n try {\n backend = new WebGpuBackend(device);\n const active = backend;\n device.lost.then(info => {\n if (!active.disposed) onFatal(new Error(`WebGPU device lost: ${info.message || info.reason}`));\n });\n device.addEventListener(\"uncapturederror\", event => {\n if (!active.disposed) onFatal(new Error(`WebGPU error: ${event.error.message}`));\n });\n await backend.initialize(canvas);\n return backend;\n } catch (error) {\n if (backend) backend.dispose();\n else device.destroy();\n throw error;\n }\n }\n\n constructor(readonly device: GPUDevice) {\n this.format = navigator.gpu.getPreferredCanvasFormat();\n this.uniform = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });\n this.sampler = device.createSampler({ minFilter: \"linear\", magFilter: \"linear\" });\n }\n\n get maxTextureDimension2D(): number { return this.device.limits.maxTextureDimension2D; }\n get maxCanvasDimension2D(): number { return this.maxTextureDimension2D; }\n\n async initialize(canvas: OffscreenCanvas): Promise<void> {\n const module = this.device.createShaderModule({ code: shader });\n this.pipeline = await this.device.createRenderPipelineAsync({\n layout: \"auto\",\n vertex: {\n module,\n entryPoint: \"vertex\",\n buffers: [{\n arrayStride: QUAD_STRIDE * 4,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x4\" },\n { shaderLocation: 1, offset: 16, format: \"float32x4\" },\n { shaderLocation: 2, offset: 32, format: \"float32x4\" },\n { shaderLocation: 3, offset: 48, format: \"float32\" },\n ],\n }],\n },\n fragment: {\n module,\n entryPoint: \"fragment\",\n targets: [{\n format: this.format,\n blend: {\n color: { srcFactor: \"src-alpha\", dstFactor: \"one-minus-src-alpha\" },\n alpha: { srcFactor: \"one\", dstFactor: \"one-minus-src-alpha\" },\n },\n }],\n },\n primitive: { topology: \"triangle-list\" },\n });\n // Acquire the presentation surface last. A null context leaves it usable by WebGL2.\n const context = canvas.getContext(\"webgpu\");\n if (!context) throw new RendererUnavailableError(\"Could not create an OffscreenCanvas WebGPU context\");\n this.context = context;\n context.configure({ device: this.device, format: this.format, alphaMode: \"opaque\" });\n }\n\n createTexture(width: number, height: number, label: string): RenderTexture {\n if (width > this.maxTextureDimension2D || height > this.maxTextureDimension2D) {\n throw new Error(`${label} exceeds the GPU texture dimension limit`);\n }\n if (!this.pipeline) throw new Error(\"WebGPU backend is not initialized\");\n const texture = this.device.createTexture({\n label, size: [width, height], format: \"rgba8unorm\",\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT,\n });\n try {\n const bindGroup = this.device.createBindGroup({\n layout: this.pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: this.uniform } },\n { binding: 1, resource: texture.createView() },\n { binding: 2, resource: this.sampler },\n ],\n });\n return new WebGpuTexture(this.device, texture, bindGroup, width, height);\n } catch (error) {\n texture.destroy();\n throw error;\n }\n }\n\n resize(width: number, height: number): void {\n this.device.queue.writeBuffer(this.uniform, 0, new Float32Array([width, height, 0, 0]));\n }\n\n submit(instances: Float32Array<ArrayBuffer>, quadCount: number, batches: readonly RenderBatch[],\n background: RenderColor): void {\n if (this.disposed || !this.context || !this.pipeline) throw new Error(\"WebGPU backend is not initialized\");\n const usedBytes = quadCount * QUAD_STRIDE * 4;\n if (!this.instanceBuffer || usedBytes > this.instanceBufferBytes) {\n this.instanceBuffer?.destroy();\n this.instanceBufferBytes = Math.max(256, instances.byteLength);\n this.instanceBuffer = this.device.createBuffer({\n size: this.instanceBufferBytes, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n });\n }\n if (usedBytes) this.device.queue.writeBuffer(this.instanceBuffer, 0, instances, 0, quadCount * QUAD_STRIDE);\n const encoder = this.device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [{\n view: this.context.getCurrentTexture().createView(),\n clearValue: { r: background[0], g: background[1], b: background[2], a: 1 },\n loadOp: \"clear\", storeOp: \"store\",\n }],\n });\n pass.setPipeline(this.pipeline);\n pass.setVertexBuffer(0, this.instanceBuffer);\n for (const batch of batches) {\n if (!(batch.resource instanceof WebGpuTexture)) throw new Error(\"Texture belongs to a different rendering backend\");\n pass.setBindGroup(0, batch.resource.bindGroup);\n pass.draw(6, batch.count, 0, batch.start);\n }\n pass.end();\n this.device.queue.submit([encoder.finish()]);\n }\n\n async idle(): Promise<void> { await this.device.queue.onSubmittedWorkDone(); }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.instanceBuffer?.destroy();\n this.uniform.destroy();\n this.context?.unconfigure();\n this.device.destroy();\n }\n}\n"]}
|
package/dist/wire-types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InputModifiers, PointerButton, SelectionMode, SelectionRange, TerminalBuffer, TerminalFont, TerminalGeometry, TerminalPeer, TerminalSize, TerminalStats, TerminalStatusLevel } from "./types.js";
|
|
1
|
+
import type { InputModifiers, PointerButton, SelectionMode, SelectionRange, TerminalBuffer, TerminalFont, TerminalGeometry, TerminalPeer, TerminalSize, TerminalStats, TerminalRendererPreference, TerminalStatusLevel, TerminalProgress, TerminalShellIntegration, TerminalCloseDetails } from "./types.js";
|
|
2
2
|
export type SelectionText = {
|
|
3
3
|
status: "valid";
|
|
4
4
|
text: string;
|
|
@@ -35,6 +35,12 @@ export interface TerminalCell {
|
|
|
35
35
|
underlineStyle: number;
|
|
36
36
|
text: string;
|
|
37
37
|
}
|
|
38
|
+
export interface HyperlinkRange {
|
|
39
|
+
row: number;
|
|
40
|
+
startColumn: number;
|
|
41
|
+
endColumn: number;
|
|
42
|
+
uri: string;
|
|
43
|
+
}
|
|
38
44
|
export interface ImageMetadata {
|
|
39
45
|
key: string;
|
|
40
46
|
width: number;
|
|
@@ -69,6 +75,9 @@ export interface FrameMetadata extends TerminalGeometry {
|
|
|
69
75
|
baseRevision: number;
|
|
70
76
|
peer: TerminalPeer;
|
|
71
77
|
history: HistoryMetadata | null;
|
|
78
|
+
title: string;
|
|
79
|
+
progress: TerminalProgress;
|
|
80
|
+
shellIntegration: TerminalShellIntegration;
|
|
72
81
|
defaultBackground?: number;
|
|
73
82
|
defaultForeground?: number;
|
|
74
83
|
cursor: {
|
|
@@ -81,6 +90,7 @@ export interface FrameMetadata extends TerminalGeometry {
|
|
|
81
90
|
retainedImages: string[];
|
|
82
91
|
placements: ImagePlacement[];
|
|
83
92
|
warnings: string[];
|
|
93
|
+
hyperlinks: HyperlinkRange[];
|
|
84
94
|
stats: {
|
|
85
95
|
workloadBytes: number;
|
|
86
96
|
outputBatches: number;
|
|
@@ -156,6 +166,7 @@ export type WorkerInputMessage = {
|
|
|
156
166
|
url: string;
|
|
157
167
|
scale: number;
|
|
158
168
|
font: TerminalFont;
|
|
169
|
+
renderer: TerminalRendererPreference;
|
|
159
170
|
} | ({
|
|
160
171
|
type: "viewport";
|
|
161
172
|
} & TerminalSize) | {
|
|
@@ -194,7 +205,10 @@ export interface WorkerStats extends TerminalStats {
|
|
|
194
205
|
history?: HistoryMetadata | null;
|
|
195
206
|
}
|
|
196
207
|
export type WorkerOutputMessage = {
|
|
197
|
-
type: "connected"
|
|
208
|
+
type: "connected";
|
|
209
|
+
} | {
|
|
210
|
+
type: "closed";
|
|
211
|
+
details: TerminalCloseDetails;
|
|
198
212
|
} | {
|
|
199
213
|
type: "status";
|
|
200
214
|
message: string;
|
|
@@ -204,7 +218,11 @@ export type WorkerOutputMessage = {
|
|
|
204
218
|
peer: TerminalPeer;
|
|
205
219
|
history: HistoryMetadata | null;
|
|
206
220
|
revision: number;
|
|
221
|
+
title: string;
|
|
222
|
+
progress: TerminalProgress;
|
|
223
|
+
shellIntegration: TerminalShellIntegration;
|
|
207
224
|
text: string;
|
|
225
|
+
hyperlinks: HyperlinkRange[];
|
|
208
226
|
} & TerminalGeometry) | {
|
|
209
227
|
type: "history";
|
|
210
228
|
history: HistoryMetadata | null;
|
package/dist/wire-types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-types.d.ts","sourceRoot":"","sources":["../src/wire-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EACxE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EACzF,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"wire-types.d.ts","sourceRoot":"","sources":["../src/wire-types.ts"],"names":[],"mappings":"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"}
|
package/dist/wire-types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-types.js","sourceRoot":"","sources":["../src/wire-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { InputModifiers, PointerButton, SelectionMode, SelectionRange,\n TerminalBuffer, TerminalFont, TerminalGeometry, TerminalPeer, TerminalSize, TerminalStats,\n TerminalStatusLevel } from \"./types.js\";\n\nexport type SelectionText =\n | { status: \"valid\"; text: string }\n | { status: \"none\" | \"invalidated\"; text: null };\nexport type HistorySelection = SelectionText & {\n requestId: number; mode: SelectionMode; ranges: SelectionRange[];\n};\nexport interface HistoryMetadata {\n generation: string; buffer: TerminalBuffer; totalRows: number; liveTop: number; top: number;\n following: boolean; requestId: number; rowIds: string[];\n selection: HistorySelection;\n copy: (SelectionText & { requestId: number }) | null;\n}\nexport interface TerminalCell {\n index: number; foreground: number; background: number; underlineColor: number;\n attributes: number; width: number; underlineStyle: number; text: string;\n}\nexport interface ImageMetadata {\n key: string; width: number; height: number; byteLength: number; format: \"rgba\" | \"png\";\n}\nexport interface FrameImage extends ImageMetadata { bytes: Uint8Array<ArrayBuffer> }\nexport interface ImagePlacement {\n key: string; kind: \"kgp\" | \"sixel\";\n x: number; y: number; width: number; height: number;\n sourceX: number; sourceY: number; sourceWidth: number; sourceHeight: number;\n clipX: number; clipY: number; clipWidth: number; clipHeight: number; z: number;\n}\nexport interface FrameMetadata extends TerminalGeometry {\n version: 1; full: boolean; revision: number; baseRevision: number;\n peer: TerminalPeer; history: HistoryMetadata | null;\n defaultBackground?: number; defaultForeground?: number;\n cursor: { visible: boolean; x: number; y: number; shape: number };\n images: ImageMetadata[]; retainedImages: string[]; placements: ImagePlacement[]; warnings: string[];\n stats: { workloadBytes: number; outputBatches: number; captureMs: number; elapsedMs: number };\n}\nexport interface TerminalFrame { metadata: FrameMetadata; cells: TerminalCell[]; images: FrameImage[] }\nexport type CellPosition = { x: number; y: number } & Partial<Pick<InputModifiers, \"ctrl\" | \"alt\" | \"shift\">>;\nexport type MouseButton = PointerButton | \"none\" | \"wheelUp\" | \"wheelDown\" | \"wheelLeft\" | \"wheelRight\";\nexport type MouseCommand = {\n type: \"mouse\"; action: \"down\" | \"up\" | \"move\" | \"wheel\"; button: MouseButton; count?: number;\n} & CellPosition;\nexport type InputCommand =\n | { type: \"input\" | \"paste\"; text: string }\n | { type: \"key\"; key: string; ctrl: boolean; alt: boolean; shift: boolean }\n | MouseCommand;\nexport type TerminalCommand = InputCommand\n | { type: \"viewport\"; requestId: number; delta?: number; live?: boolean;\n extend?: { row: number; column: number } }\n | { type: \"selection\"; action: \"clear\"; requestId: number }\n | { type: \"selection\"; action: \"start\" | \"extend\"; mode: SelectionMode;\n requestId: number; generation: string; rowId: string; column: number }\n | { type: \"copy\"; requestId: number; selectionRequestId: number; generation: string }\n | { type: \"resize\" | \"requestPrimary\"; columns: number; rows: number }\n | { type: \"resync\" }\n | { type: \"ack\"; revision: number };\nexport type WorkerInputMessage =\n | { type: \"init\"; canvas: OffscreenCanvas; url: string; scale: number; font: TerminalFont }\n | ({ type: \"viewport\" } & TerminalSize)\n | { type: \"command\"; command: TerminalCommand }\n | { type: \"stop\" };\nexport interface WorkerStats extends TerminalStats {\n revision: number; fullFrames: number; frames: number; presentations: number;\n changedCells: number; lastChangedCells: number; discardedFrames: number;\n imageCount: number; textureBytes: number; atlasGlyphs: number; atlasBytes: number;\n bytesReceived: number; imageUploadBytes: number; imagePayloadBytes: number;\n gpu: \"initializing\" | \"ready\" | \"error\" | \"stopped\"; connected: boolean; warnings: string[];\n fps: number; receivedKBps: number; workloadMBps: number;\n captureMs: number; rendererCpuMs: number; preparationCpuMs: number;\n workloadBytes: number; outputBatches: number; serverElapsedMs: number;\n history?: HistoryMetadata | null;\n}\nexport type WorkerOutputMessage =\n | { type: \"connected\" | \"
|
|
1
|
+
{"version":3,"file":"wire-types.js","sourceRoot":"","sources":["../src/wire-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { InputModifiers, PointerButton, SelectionMode, SelectionRange,\n TerminalBuffer, TerminalFont, TerminalGeometry, TerminalPeer, TerminalSize, TerminalStats,\n TerminalRendererPreference, TerminalStatusLevel, TerminalProgress, TerminalShellIntegration,\n TerminalCloseDetails } from \"./types.js\";\n\nexport type SelectionText =\n | { status: \"valid\"; text: string }\n | { status: \"none\" | \"invalidated\"; text: null };\nexport type HistorySelection = SelectionText & {\n requestId: number; mode: SelectionMode; ranges: SelectionRange[];\n};\nexport interface HistoryMetadata {\n generation: string; buffer: TerminalBuffer; totalRows: number; liveTop: number; top: number;\n following: boolean; requestId: number; rowIds: string[];\n selection: HistorySelection;\n copy: (SelectionText & { requestId: number }) | null;\n}\nexport interface TerminalCell {\n index: number; foreground: number; background: number; underlineColor: number;\n attributes: number; width: number; underlineStyle: number; text: string;\n}\nexport interface HyperlinkRange {\n row: number; startColumn: number; endColumn: number; uri: string;\n}\nexport interface ImageMetadata {\n key: string; width: number; height: number; byteLength: number; format: \"rgba\" | \"png\";\n}\nexport interface FrameImage extends ImageMetadata { bytes: Uint8Array<ArrayBuffer> }\nexport interface ImagePlacement {\n key: string; kind: \"kgp\" | \"sixel\";\n x: number; y: number; width: number; height: number;\n sourceX: number; sourceY: number; sourceWidth: number; sourceHeight: number;\n clipX: number; clipY: number; clipWidth: number; clipHeight: number; z: number;\n}\nexport interface FrameMetadata extends TerminalGeometry {\n version: 1; full: boolean; revision: number; baseRevision: number;\n peer: TerminalPeer; history: HistoryMetadata | null;\n title: string;\n progress: TerminalProgress;\n shellIntegration: TerminalShellIntegration;\n defaultBackground?: number; defaultForeground?: number;\n cursor: { visible: boolean; x: number; y: number; shape: number };\n images: ImageMetadata[]; retainedImages: string[]; placements: ImagePlacement[]; warnings: string[];\n hyperlinks: HyperlinkRange[];\n stats: { workloadBytes: number; outputBatches: number; captureMs: number; elapsedMs: number };\n}\nexport interface TerminalFrame { metadata: FrameMetadata; cells: TerminalCell[]; images: FrameImage[] }\nexport type CellPosition = { x: number; y: number } & Partial<Pick<InputModifiers, \"ctrl\" | \"alt\" | \"shift\">>;\nexport type MouseButton = PointerButton | \"none\" | \"wheelUp\" | \"wheelDown\" | \"wheelLeft\" | \"wheelRight\";\nexport type MouseCommand = {\n type: \"mouse\"; action: \"down\" | \"up\" | \"move\" | \"wheel\"; button: MouseButton; count?: number;\n} & CellPosition;\nexport type InputCommand =\n | { type: \"input\" | \"paste\"; text: string }\n | { type: \"key\"; key: string; ctrl: boolean; alt: boolean; shift: boolean }\n | MouseCommand;\nexport type TerminalCommand = InputCommand\n | { type: \"viewport\"; requestId: number; delta?: number; live?: boolean;\n extend?: { row: number; column: number } }\n | { type: \"selection\"; action: \"clear\"; requestId: number }\n | { type: \"selection\"; action: \"start\" | \"extend\"; mode: SelectionMode;\n requestId: number; generation: string; rowId: string; column: number }\n | { type: \"copy\"; requestId: number; selectionRequestId: number; generation: string }\n | { type: \"resize\" | \"requestPrimary\"; columns: number; rows: number }\n | { type: \"resync\" }\n | { type: \"ack\"; revision: number };\nexport type WorkerInputMessage =\n | { type: \"init\"; canvas: OffscreenCanvas; url: string; scale: number; font: TerminalFont;\n renderer: TerminalRendererPreference }\n | ({ type: \"viewport\" } & TerminalSize)\n | { type: \"command\"; command: TerminalCommand }\n | { type: \"stop\" };\nexport interface WorkerStats extends TerminalStats {\n revision: number; fullFrames: number; frames: number; presentations: number;\n changedCells: number; lastChangedCells: number; discardedFrames: number;\n imageCount: number; textureBytes: number; atlasGlyphs: number; atlasBytes: number;\n bytesReceived: number; imageUploadBytes: number; imagePayloadBytes: number;\n gpu: \"initializing\" | \"ready\" | \"error\" | \"stopped\"; connected: boolean; warnings: string[];\n fps: number; receivedKBps: number; workloadMBps: number;\n captureMs: number; rendererCpuMs: number; preparationCpuMs: number;\n workloadBytes: number; outputBatches: number; serverElapsedMs: number;\n history?: HistoryMetadata | null;\n}\nexport type WorkerOutputMessage =\n | { type: \"connected\" }\n | { type: \"closed\"; details: TerminalCloseDetails }\n | { type: \"status\"; message: string; level: TerminalStatusLevel }\n | ({ type: \"geometry\"; peer: TerminalPeer; history: HistoryMetadata | null;\n revision: number; title: string; progress: TerminalProgress; shellIntegration: TerminalShellIntegration;\n text: string; hyperlinks: HyperlinkRange[] } & TerminalGeometry)\n | { type: \"history\"; history: HistoryMetadata | null; revision: number; text: string }\n | { type: \"stats\"; stats: WorkerStats; text?: string };\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hex1b/web-terminal",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "First-party WebGPU browser terminal for Hex1b",
|
|
3
|
+
"version": "0.166.0",
|
|
4
|
+
"description": "First-party WebGPU and WebGL2 browser terminal for Hex1b",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|