Compare commits

..

4 Commits

Author SHA1 Message Date
Leon van Kammen 88c4b21818 added custom keymappings for VT100
/ mirror_to_github (push) Successful in 18s Details
/ test (push) Successful in 4s Details
2024-11-21 11:28:31 +00:00
Leon van Kammen d93401e572 add class to window.js
/ mirror_to_github (push) Successful in 20s Details
/ test (push) Successful in 4s Details
2024-11-20 11:03:44 +00:00
Leon van Kammen dcade45f82 finetuned httpfs.js
/ mirror_to_github (push) Successful in 18s Details
/ test (push) Successful in 4s Details
2024-11-19 16:00:49 +00:00
Leon van Kammen b8e6428611 added httpfs [webrequest to filesystem]
/ mirror_to_github (push) Successful in 20s Details
/ test (push) Successful in 4s Details
2024-11-18 20:18:33 +00:00
7 changed files with 99 additions and 8 deletions

View File

@ -205,6 +205,7 @@ if( typeof AFRAME != 'undefined '){
indexjs: "com/isoterminal/feat/index.js.js", indexjs: "com/isoterminal/feat/index.js.js",
autorestore: "com/isoterminal/feat/autorestore.js", autorestore: "com/isoterminal/feat/autorestore.js",
pastedropFeat: "com/isoterminal/feat/pastedrop.js", pastedropFeat: "com/isoterminal/feat/pastedrop.js",
httpfs: "com/isoterminal/feat/httpfs.js",
}) })
this.el.setAttribute("selfcontainer","") this.el.setAttribute("selfcontainer","")
@ -233,7 +234,7 @@ if( typeof AFRAME != 'undefined '){
},100) },100)
//instance.winbox.resize(720,380) //instance.winbox.resize(720,380)
let size = `width: ${this.data.width}; height: ${this.data.height}` let size = `width: ${this.data.width}; height: ${this.data.height}`
instance.setAttribute("window", `title: xrsh.iso; uid: ${instance.uid}; attach: #overlay; dom: #${instance.dom.id}; ${size}; min: ${this.data.minimized}; max: ${this.data.maximized}`) instance.setAttribute("window", `title: xrsh.iso; uid: ${instance.uid}; attach: #overlay; dom: #${instance.dom.id}; ${size}; min: ${this.data.minimized}; max: ${this.data.maximized}; class: no-full, no-resize, no-move`)
}) })
instance.addEventListener('window.oncreate', (e) => { instance.addEventListener('window.oncreate', (e) => {
@ -313,7 +314,11 @@ if( typeof AFRAME != 'undefined '){
max_scroll_lines: this.rows, max_scroll_lines: this.rows,
nodim: true, nodim: true,
rainbow: [VT100.COLOR_MAGENTA, VT100.COLOR_CYAN ], rainbow: [VT100.COLOR_MAGENTA, VT100.COLOR_CYAN ],
xr: AFRAME.scenes[0].renderer.xr xr: AFRAME.scenes[0].renderer.xr,
map: {
'ArrowRight': { ch: false, ctrl: '\x1b\x66' }, // this triggers ash-shell forward-word
'ArrowLeft': { ch: false, ctrl: '\x1b\x62' } // backward-word
}
} }
this.term.emit('initVT100',this) this.term.emit('initVT100',this)
this.vt100 = new VT100( this.term.opts.vt100 ) this.vt100 = new VT100( this.term.opts.vt100 )

View File

@ -266,6 +266,9 @@ VT100.handle_onkeypress_ = function VT100_handle_onkeypress(event,cb)
return true return true
break; break;
} }
// custom map override
if( vt.opts.map[ event.code ].ch ) ch = vt.opts.map[ event.code ].ch
if( vt.opts.map[ event.code ].ctrl && event.ctrlKey ) ch = vt.opts.map[ event.code ].ctrl
} }
// Workaround: top the event from doing anything else. // Workaround: top the event from doing anything else.

View File

@ -49,3 +49,47 @@ emulator.fs9p.append_file = async function(file,data){
} }
emulator.fs9p.read_file_world = async function(file){
const p = this.SearchPath(file);
if(p.id === -1)
{
return Promise.resolve(null);
}
const inode = this.GetInode(p.id);
const perms = this.parseFilePermissions(inode.mode)
if( !perms.world.read ){
return Promise.resolve(null);
}
return this.Read(p.id, 0, inode.size);
}
emulator.fs9p.parseFilePermissions = function(permissionInt) {
// Convert the permission integer to octal
const octalPermissions = permissionInt.toString(8);
// Extract the permission bits (last 3 digits in octal)
const permissionBits = octalPermissions.slice(-3);
function parsePermission(digit) {
const num = parseInt(digit, 10);
return {
read: Boolean(num & 4), // 4 = read
write: Boolean(num & 2), // 2 = write
execute: Boolean(num & 1) // 1 = execute
};
}
// Decode the permissions
const permissions = {
owner: parsePermission(permissionBits[0]),
group: parsePermission(permissionBits[1]),
world: parsePermission(permissionBits[2]),
};
return permissions;
}

View File

@ -0,0 +1,30 @@
if( typeof emulator != 'undefined' ){
}else{
ISOTerminal.addEventListener('ready', function(e){
// listen for http request to the filesystem ( file://host/path )
xhook.before( (request,callback) => {
if (request.url.match(/^file:\/\/xrsh\/mnt\/.*/) ){
let response
let file = request.url.replace(/^file:\/\/xrsh\/mnt\//,'')
this.worker.read_file_world(file)
.then( (data) => {
response = new Response( new Blob( [data] ) ) // wrap Uint8Array into array
response.status = 200
callback(response)
})
.catch( (e) => {
response = new Response()
response.status = 404
callback(response)
})
return
}
callback()
})
})
}

View File

@ -44,6 +44,7 @@ this.runISO = function(opts){
*/ */
this.create_file = async function(){ return emulator.create_file.apply(emulator, arguments[0]) } this.create_file = async function(){ return emulator.create_file.apply(emulator, arguments[0]) }
this.read_file = async function(){ return emulator.read_file.apply(emulator, arguments[0]) } this.read_file = async function(){ return emulator.read_file.apply(emulator, arguments[0]) }
this.read_file_world = async function(){ return emulator.fs9p.read_file_world.apply(emulator.fs9p, arguments[0]) }
this.append_file = async function(){ emulator.fs9p.append_file.apply(emulator.fs9p, arguments[0]) } this.append_file = async function(){ emulator.fs9p.append_file.apply(emulator.fs9p, arguments[0]) }
this.update_file = async function(){ emulator.fs9p.update_file.apply(emulator.fs9p, arguments[0]) } this.update_file = async function(){ emulator.fs9p.update_file.apply(emulator.fs9p, arguments[0]) }

View File

@ -34,16 +34,22 @@ AFRAME.registerComponent('selfcontainer', {
installProxyServer: function(){ installProxyServer: function(){
if( !window.store ) window.store = {} if( !window.store ) window.store = {}
// selfcontain every webrequest to store (and serve if stored) // selfcontain every webrequest to store (and serve if stored)
let curry = function(me){ let curry = function(me){
return function(request, response, cb){ return function(request, response, cb){
let data = request ? window.store[ request.url ] || false : false let data = request ? window.store[ request.url ] || false : false
if( data ){ // return inline version if( data ){ // return inline version
console.log('selfcontained cache: '+request.url) console.log('selfcontainer.js: serving '+request.url+' from cache')
let res = new Response() let res = new Response()
res[ data.binary ? 'data' : 'text' ] = data.binary ? () => me.convert.base64ToArrayBuffer(data.text) : data.text res[ data.binary ? 'data' : 'text' ] = data.binary ? () => me.convert.base64ToArrayBuffer(data.text) : data.text
cb(res) cb(res)
}else{ }else{
if( request.url.match(/(^file:\/\/xrsh)/) ) return cb(response)
console.log("selfcontainer.js: caching "+request.url)
if( response.text ){ if( response.text ){
data = {text: response.text} data = {text: response.text}
}else{ }else{

View File

@ -9,7 +9,8 @@ AFRAME.registerComponent('window', {
max: {type:'boolean',"default":false}, max: {type:'boolean',"default":false},
min: {type:'boolean',"default":false}, min: {type:'boolean',"default":false},
x: {type:'string',"default":"center"}, x: {type:'string',"default":"center"},
y: {type:'string',"default":"center"} y: {type:'string',"default":"center"},
"class": {type:'array',"default":[]},
}, },
dependencies:{ dependencies:{
@ -28,6 +29,7 @@ AFRAME.registerComponent('window', {
this.el.dom.style.display = 'none' this.el.dom.style.display = 'none'
let winbox = this.el.winbox = new WinBox( this.data.title, { let winbox = this.el.winbox = new WinBox( this.data.title, {
class: this.data.class,
height:this.data.height, height:this.data.height,
width:this.data.width, width:this.data.width,
x: this.data.x, x: this.data.x,