PHP rocks! wünscht allen Mitgliedern einen guten Rutsch ins neue Jahr 2017 !!!
Hinweis: Das Forum zieht um! Um keine Datenverluste zu haben, schalten wir zwecks Übernahme der Daten das Forum am Sonntag, den 24.04.2016 um ca. 21:00 Uhr offline und passen anschliessend die DNS-Einträge an.
www.php-rocks.de wird euch dann nach den Aktualisierungen der DNS-Server wieder wie gewohnt uneingeschränkt zur Verfügung stehen.
Danke für euer Verständnis!

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Filesystem API, eval + function serialization
#1
Hallo,
bei einer Funktionalität welche essentiel(!) ist komme ich nicht weiter und ärgere mich seit einigen Stunden schwarz, wäre also wirklich sehr, sehr dankbar wenn mir jemand helfen könnte!

Ich habe ein "require shim", ähnlich der node module/require Funktion, bzw. in Verwendung mit und ohne node.js.
https://github.com/frdl/webfan-require
Das funktioniert soweit.

Für offlinecache und performance möchte ich nun den require cache clientseitig speichern, dazu verwende ich Filer, eine Art polyfill für die HTML5 filesystem API.
Das Serialisieren der Objekte klappt nicht so ganz, weshalb ich mich zunächst der Einfachheit halber auf das Speichern des source codes beschränke (welchen ich beim laden eval).

Und hier hakt es:
Beim Ausführen des codes aus dem cache wird irgendwie nur das boot/main require-modul ausgeführt, dann stockt es "irgebndwie". Ich bekomme danach auch keine Meldung mehr von der Console welche mir weiterhelfen könnte, <boot>.complete() bzw. 'LINQ AS "scope.SQL";' ist die letzte Meldung.

Zum de-/aktivieren der cache funktion kann folgendes ein-/ bzw. auskommentiert werden:
Code:
/* */        
                console.deprecated('Cache buggy, skipped!');
                return;

Wie gesagt wäre ich seeehr dankbar, und würde bei Bedarf auch die Helfer als Authoren einfügen oder auch anderweitig vergüten, bzw. vielleicht hat aber jemand auch schon sowas/eine bessere Funktion!?

http://api.webfan.de/api-d/4/js-api/library.js
bzw.
https://github.com/frdl/-Flow/blob/master/api-d/4/js-api/library.js/core/plugin.core.js
Antworten
#2
Ich habs nun ganz einfach gelöst indem ich den XMLHttpRequest getrennt vom require-cache speichere!
Der Cache Lesevorgang erfolgt asynchron zum Http Request und bricht diesen ggf. ab:
https://github.com/frdl/-Flow/commit/9c77e25e089e95b8bf622a7b50d91a7c90bc2ec2
Code:
        function require(identifier, callback, compiler)
        {
      
              if('undefined' === typeof module){
                        if(identifier === __MAINMODULE__){
                           var module = (true === this instanceof TModule) ? this : new TModule(__MAINMODULE__ );
                      }else{
                           var module = (true === this instanceof TModule) ? this : new TModule(resolve(identifier, true));
                      }
                    
              }
            
                  if('undefined' === typeof module.parent){
                      module.parent = (      true === this instanceof TModule
                                          && true === this.parent instanceof TModule
                                      )
                                    ? this.parent
                                    : parent;
                  }else{
                      module.parent = module.parent;
                  }            
                        
                  module.resolve = resolve;
                  module.require = require;    
                  
                  
            if (identifier instanceof Array && 'undefined' === typeof identifier.descriptor && 'undefined' === typeof identifier.parent)
            {
                var modules = new Array();
                var modcount = identifier.length;
                for (var index = 0; index < identifier.length; index++)
                {
                    (function(id, i)
                        {
                            modules.push(require(id, callback&&function(mod)
                                    {
                                        modules[i] = mod;
                                        (--modcount==0) && callback(modules);
                                    }, compiler));
                        })(identifier[index], index);
                }
                return modules;
            }else if ('string' === typeof identifier){
                 module.descriptor = module.resolve(identifier, true);
                 return  module.require(module, callback, compiler);                     
            }else  if(true === identifier instanceof TModule) {
                    module = identifier;
                }else{
                    console.fatal('TypeError (ToDo) identifier !instanceof TModule');
                    
                    return undefined;
                }
                


            var descriptor = module.descriptor;
            var cacheid = cacheID(descriptor.id);



            if ( /* 'undefined' !== typeof require.cache()[cacheid] */
                'function'===typeof require.cache().hasOwnProperty &&  require.cache().hasOwnProperty(cacheid)
                && (
                    true !== navigator.onLine
                    ||
                    (true === version('compare')(require.meta().version, version('name'))
                        && 'undefined' !== typeof require.meta('$$'+descriptor.id)
                        && ('undefined' !== typeof require.meta('$$'+descriptor.id).lt) &&  parseInt(require.meta('$$'+descriptor.id).lt) > new Date().getTime()
                        && ('undefined' !== typeof require.meta('$$'+descriptor.id).t) &&  parseInt(require.meta('$$'+descriptor.id).t) > new Date().getTime() - parseInt(require.meta('$$'+descriptor.id).lim)
                        && true !== require.meta('$$'+descriptor.id).forceRefresh
                        && true === version('compare')(require.meta('$$'+descriptor.id).version.name, version('name'))
                        && -1 !== parseInt(require.meta('$$'+descriptor.id).lim)
                    )

                )
                && 'undefined' !== typeof require.cache()[cacheid]
                && 'string' === typeof require.cache()[cacheid].source
            )
            {
                
                
                var exports = load(require.cache()[cacheid], require.cache(), pwd, require.cache()[cacheid].source);
                console.dir(require.cache()[cacheid]);
                callback && callback(require.cache()[cacheid]);    
                return require.cache()[cacheid];        

            }


            if(window.XMLHttpRequest)
            {
                var request = new XMLHttpRequest();
            } else if(window.ActiveXObject)
            {
                var request = new ActiveXObject('Microsoft.XMLHTTP');
            }


            var txt = {
                   i : false,
                   t : '',
                   mime : ('undefined' !== typeof require.meta('$$'+id))?require.meta('$$'+id).mime:'application/javascript',
                   state : new EventEmitter()
                };

            txt.state.once('cache match', function(txt){
                try{
                        request.abort();
                }catch(err){}
                descriptor.mime = txt.mime;
                module = load(descriptor, require.cache(), pwd, txt.t);
                callback && callback(require.cache()[cacheid]);    
                console.log('FS.shim Cache> '+cacheid);                   
            });
            txt = require.readText(cacheid, txt);




            if(true === descriptor.nw)
            {
                require.cache()[cacheid] = global.window.top.__nw_require(descriptor.location.url);
                module = load(descriptor, require.cache(), pwd, require.cache()[cacheid]);
                callback && webfan.$Async(function(){callback(require.cache()[cacheid])}, 1);
                return require.cache()[cacheid];
            }


            callback && (request[request.onload===null?'onload':'onreadystatechange'] = onLoad);
            var scheme = explode(':', descriptor.location.url)[0];
            if(true !== r.nw && 'http' !== scheme && 'https' !== scheme
              && 'web+fan' !== scheme && 'webfan' !== scheme
              && 'web+intent' !== scheme && 'frdl' !== scheme
            ){
                if('undefined' !== typeof frdl.url){
                  var u = frdl.url.parse(descriptor.location.url);
                  u.protocol = location.protocol;
                  descriptor.location.url = u.format();                    
                }else{
                    descriptor.location.url = str_replace(scheme+'://', location.protocol+ '//', descriptor.location.url);
                }

             }
            
            try
            {

                request.open('GET', descriptor.location.url, !!callback);
                request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');


                if(!callback)
                {
                    console.deprecated('Warning: Synced thread: '+descriptor.uri);
                }
            }catch(err)
            {
                console.warn(err);
            }

            lock[cacheid] = lock[cacheid]++||1;
            request.send();
            lock[cacheid]--;
            !callback && onLoad();



            return require.cache()[cacheid];

            function onLoad()
            {
            
                if (request.readyState !== 4)
                return;


                if (request.status !== 200)
                {


                    throw new SmoothieError("unable to load "+descriptor.id+" ("+request.status+" "+request.statusText+")");
                }
                if (lock[cacheid])
                {
                    if('undefined'!==typeof console)console.warn("module locked: "+descriptor.uri);
                    callback && setTimeout(onLoad, 0);
                    return;
                }


                txt.mime = explode(';', request.getResponseHeader("Content-Type"))[0];
                txt.t = request.responseText;
                txt.i = true;
                txt.state.emit('cache match', txt);
                require.saveText(descriptor.id, txt.t);
            }
        }
Antworten


Gehe zu: