• metamask-iframe-stream,没成功


    https://github.com/kumavis/iframe-stream/blob/master/test/rebundle.js

    iframe-stream-其实就是将iframe打包成流

    Create a stream around an iframe via post-message-stream

    const IframeStream = require('iframe-stream').IframeStream
     
    var iframe = createIframe()
    var iframeStream = IframeStream(iframe)

    Note

    • Setup the stream immediately, so we don't miss the iframe's load event.
    • The IframeStream will buffer all input until the childstream is ready.
    • This is an object stream, and buffers will not be handled gracefully.

    Example

    Here is an example using dnode to create a callback based API with a javascript context inside an iframe.

    Parent:

    const IframeStream = require('iframe-stream').IframeStream
    const Dnode = require('dnode')
     
    var iframe = createIframe()
    var iframeStream = IframeStream(iframe)
    var dnode = Dnode()
    dnode.on('remote', function(child){
      child.doAsyncSomething(function(){
        console.log('child finished doing the thing!')
      })
    })
     
    dnode.pipe(iframeStream).pipe(dnode)

    Child:

    const ParentStream = require('iframe-stream').ParentStream
    const Dnode = require('dnode')
     
    var parentStream = ParentStream(iframe)
    var dnode = Dnode({
      doAsyncSomething: function (cb) {
        console.log('doing something async...')
        cb()
      }
    })
     
    dnode.pipe(parentStream).pipe(dnode)

     
    源码实现:
    var PostMessageStream = require('post-message-stream')
    
    /*
      IframeStream starts corked until it gets a message from the iframe
      ParentStream starts uncorked
    */
    
    module.exports = {
      IframeStream: IframeStream,
      ParentStream: ParentStream,
    }
    
    function IframeStream(iframe) {
      if (this instanceof IframeStream) throw Error('IframeStream - Dont construct via the "new" keyword.')
      return new PostMessageStream({
        name: 'iframe-parent',
        target: 'iframe-child',
        targetWindow: iframe.contentWindow,
      })
    }
    
    //
    // Parent Stream
    //
    
    
    function ParentStream() {
      if (this instanceof ParentStream) throw Error('ParentStream - Dont construct via the "new" keyword.')
      return new PostMessageStream({
        name: 'iframe-child',
        target: 'iframe-parent',
        targetWindow: frames.parent,
      })
    }
     
    下面实例实现:
    先将插件安装下来:
    npm install iframe --save
    npm install iframe-stream --save
    npm install dnode --save
     
    index.js
    const test = require('tape')
    const Iframe = require('iframe')
    const from = require('from')
    const pipe = require('mississippi').pipe
    const IframeStream = require('../').IframeStream
    const rebundle = require('./rebundle')
    const htmlWrap = require('./htmlWrap')
    const iframeContent = htmlWrap(rebundle(require('./frame')))
    
    
    
    // setup iframe
    var iframe = Iframe({
      body: iframeContent,
      container: document.body,
    }).iframe
    var iframeStream = IframeStream(iframe)
    
    
    test(function(t) {
      var data = [1, 2, 3, 4, 50, 1000, 256, 19, 12]
    
      t.plan(data.length)
    
      pipe(
        from(data),
        iframeStream
      )
    
      // create a test for each datum
      // this is because these streams never close
      eachOutput(iframeStream, data.map(function(datum){
        return function onResult(result){ t.equal(result, datum * 2, 'datum was doubled correctly') }
      }), function onDone(){
        t.end()
      })
    
    })
    
    function eachOutput(stream, handlers, cb) {
      var index = 0
      if (!handlers.length) return cb()
      stream.once('data', handleChunk)
      function handleChunk(data){
        var fn = handlers[index]
        fn(data)
        index++
        if (!handlers[index]) return cb()
        stream.once('data', handleChunk)
      }
    }

    htmlWrap.js

    module.exports = htmlWrap
    
    function htmlWrap(src){
      return '<'+'script type="text/javascript"'+'>'+src+'<'+'/script'+'>'  
    }

    rebundle.js

    // 
    // Extraced from WebWorkify
    // https://github.com/substack/webworkify/blob/master/index.js
    // 
    
    var bundleFn = arguments[3];
    var sources = arguments[4];
    var cache = arguments[5];
    
    var stringify = JSON.stringify;
    
    module.exports = function (fn, options) {
      var wkey;
      var cacheKeys = Object.keys(cache);
    
      for (var i = 0, l = cacheKeys.length; i < l; i++) {
          var key = cacheKeys[i];
          var exp = cache[key].exports;
          // Using babel as a transpiler to use esmodule, the export will always
          // be an object with the default export as a property of it. To ensure
          // the existing api and babel esmodule exports are both supported we
          // check for both
          if (exp === fn || exp && exp.default === fn) {
              wkey = key;
              break;
          }
      }
    
      if (!wkey) {
          wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
          var wcache = {};
          for (var i = 0, l = cacheKeys.length; i < l; i++) {
              var key = cacheKeys[i];
              wcache[key] = key;
          }
          sources[wkey] = [
              Function(['require','module','exports'], '(' + fn + ')(self)'),
              wcache
          ];
      }
      var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
    
      var scache = {}; scache[wkey] = wkey;
      sources[skey] = [
          Function(['require'], (
              // try to call default if defined to also support babel esmodule
              // exports
              'var f = require(' + stringify(wkey) + ');' +
              '(f.default ? f.default : f)(self);'
          )),
          scache
      ];
    
      var workerSources = {};
      resolveSources(skey);
    
      function resolveSources(key) {
          workerSources[key] = true;
    
          for (var depPath in sources[key][1]) {
              var depKey = sources[key][1][depPath];
              if (!workerSources[depKey]) {
                  resolveSources(depKey);
              }
          }
      }
    
      var src = '(' + bundleFn + ')({'
          + Object.keys(workerSources).map(function (key) {
              return stringify(key) + ':['
                  + sources[key][0]
                  + ',' + stringify(sources[key][1]) + ']'
              ;
          }).join(',')
          + '},{},[' + stringify(skey) + '])'
      ;
    
      return src
    }

    frame.js

    const BrowserStdout = require('browser-stdout')
    const ParentStream = require('../index.js').ParentStream
    const transform = require('mississippi').through
    const pipe = require('mississippi').pipe
    
    module.exports = setupStream
    
    
    setupStream()
    
    function setupStream(opts) {
      var iframeStream = ParentStream()
      pipe(
        iframeStream,
        transform({ objectMode: true }, doubleIt),
        iframeStream
      )
    }
    
    function doubleIt(chunk, encoding, cb){
      cb(null, chunk * 2)
    }

    上面的例子是iframe-stream作者写的一个测试test

  • 相关阅读:
    <h1><h6>,<head>,<header>,<hr>,<html>标签文档
    <datalist>,<dl>,<dt>,<dd>,<del>,<details>,<div>,<dfn>标签文档
    <fieldset>,<figcaption>, <figure>,<footer>,<form>标签文档
    <b>,<base>,<bdo>,<blockquote>,<body>,<br>,<button>标签文档
    css footer自适应布局
    scss 常用mixins
    <em>,<embed>标签文档
    <canvas>,<caption>,<cite>, <code>,<col>, <colgroup>标签文档
    <a>,<abbr>,<address>,<area>,<article>, <aside>, <audio>标签文档
    SAP:常用的Tcode
  • 原文地址:https://www.cnblogs.com/wanghui-garcia/p/9851080.html
Copyright © 2020-2023  润新知