fix phoenix WINSZ handling

This commit is contained in:
KernelDeimos 2024-09-03 18:59:56 -04:00
parent 7139d29749
commit a33d721e21
5 changed files with 52 additions and 14 deletions

View File

@ -91,7 +91,10 @@ export class ANSIShell extends EventTarget {
}) })
Object.defineProperty(this.env, 'COLS', { Object.defineProperty(this.env, 'COLS', {
enumerable: true, enumerable: true,
get: () => this.variables.size?.cols ?? 0 get: () => {
const v = this.variables.size?.cols ?? 0
return v;
}
}) })
this.export_('LANG', 'en_US.UTF-8'); this.export_('LANG', 'en_US.UTF-8');

View File

@ -30,10 +30,11 @@ window.main_shell = async () => {
.entries() .entries()
); );
let resolveConfigured = null; // let resolveConfigured = null;
const configured_ = new Promise(rslv => { // const configured_ = new Promise(rslv => {
resolveConfigured = rslv; // resolveConfigured = rslv;
}); // });
const puterSDK = globalThis.puter;
const terminal = puter.ui.parentApp(); const terminal = puter.ui.parentApp();
if (!terminal) { if (!terminal) {
@ -45,9 +46,10 @@ window.main_shell = async () => {
if (message.$ === 'config') { if (message.$ === 'config') {
const configValues = { ...message }; const configValues = { ...message };
// Only copy the config that we actually need // Only copy the config that we actually need
config['puter.auth.username'] = configValues['puter.auth.username']; // config['puter.auth.username'] = configValues['puter.auth.username'];
config['puter.auth.token'] = configValues['puter.auth.token']; config['puter.auth.token'] = configValues['puter.auth.token'];
resolveConfigured(); // console.log('set!');
// resolveConfigured();
} }
}); });
terminal.on('close', () => { terminal.on('close', () => {
@ -59,14 +61,17 @@ window.main_shell = async () => {
terminal.postMessage({ $: 'ready' }); terminal.postMessage({ $: 'ready' });
await configured_;
const puterSDK = globalThis.puter;
if ( config['puter.auth.token'] ) {
await puterSDK.setAuthToken(config['puter.auth.token']);
}
const ptt = new XDocumentPTT(terminal); const ptt = new XDocumentPTT(terminal);
// await configured_;
const user = await puterSDK.auth.getUser();
config['puter.auth.username'] = user.username;
// await new Promise(rslv => setTimeout(rslv, 0));
// if ( config['puter.auth.token'] ) {
// await puterSDK.setAuthToken(config['puter.auth.token']);
// }
await launchPuterShell(new Context({ await launchPuterShell(new Context({
ptt, ptt,
config, puterSDK, config, puterSDK,

View File

@ -21,7 +21,26 @@ import { BetterReader } from "dev-pty";
const encoder = new TextEncoder(); const encoder = new TextEncoder();
export class XDocumentPTT { export class XDocumentPTT {
static IOCTL = {
TIOCGWINSZ: {
id: 104,
},
}
constructor(terminalConnection) { constructor(terminalConnection) {
for ( const k in XDocumentPTT.IOCTL ) {
this[k] = async () => {
return await new Promise((resolve, reject) => {
terminalConnection.postMessage({
$: 'ioctl.request',
requestCode: XDocumentPTT.IOCTL[k].id,
});
this.once('ioctl.set', evt => {
resolve(evt);
});
});
};
}
this.ioctl_listeners = {}; this.ioctl_listeners = {};
this.readableStream = new ReadableStream({ this.readableStream = new ReadableStream({

View File

@ -136,6 +136,9 @@ export const launchPuterShell = async (ctx) => {
})); }));
}); });
// NEXT
ptt.TIOCGWINSZ();
const fire = (text) => { const fire = (text) => {
// Define fire-like colors (ANSI 256-color codes) // Define fire-like colors (ANSI 256-color codes)
const fireColors = [202, 208, 166]; const fireColors = [202, 208, 166];

View File

@ -29,6 +29,14 @@ export class XDocumentANSIShell {
shell.on('message', message => { shell.on('message', message => {
// When the shell reports it's ready, send configuration // When the shell reports it's ready, send configuration
if (message.$ === 'ioctl.request') {
if (message.requestCode === 104) {
shell.postMessage({
$: 'ioctl.set',
windowSize: this.internal_.windowSize,
});
}
}
if (message.$ === 'ready') { if (message.$ === 'ready') {
const params = Object.fromEntries( const params = Object.fromEntries(
new URLSearchParams(window.location.search) new URLSearchParams(window.location.search)