magic-transport

Transport for iframes

Usage no npm install needed!

<script type="module">
  import magicTransport from 'https://cdn.skypack.dev/magic-transport';
</script>

README

Magic transport

Библиотека для транспорта между iframe и родительским окном.

Установка

npm install --save magic-transport

Использование

На стороне страницы, на которой вставлен iframe (это страница Provider), вставьте следующий код:

import { Provider } from 'magic-transport'

const iframeOrigin = '*'
const sharedObject = {
  hello: {
    from: {
      provider: function () {
        return 'hello from provider'
      }
    }
  }
}
const transport = new Provider('YOUR_UNIQ_ID_HERE', iframeOrigin, sharedObject)

transport.once('ready', function () {
  const consumer = transport.consumer
  consumer.hello.from.consumer().then(result => {
    console.log(result === 'hello from provider') // true
  })
  consumer.mySetTimeout(function (result) {
    console.log(result === 'hello from consumer') // true
  }, 1000)
  consumer.on('my_event', function (result) {
    console.log(result.foo === 'bar')
  })
  console.log(transport.connectedOrigin) // origin присоединенного документа
})



На стороне страницы, загруженной внутри iframe (это страница Consumer), вставьте следующий код:

import { Consumer } from 'magic-transport'

const parentOrigin = '*'
const sharedObject = {
  hello: {
    from: {
      consumer: function () {
        return transport.provider.hello.from.provider()
      }
    }
  },
  mySetTimeout: function (callback, timeout) {
    setTimeout(function () { callback('hello from consumer') }, timeout)
  }
}

const transport = new Consumer('YOUR_UNIQ_ID_HERE', parentOrigin, sharedObject)
transport.once('ready', function () {
  setTimeout(function () {
    transport.consumer.emit('my_event', { foo: 'bar' })
  }, 1000)
  console.log(transport.connectedOrigin) // origin присоединенного документа
})



Таким образом любые интерфейсы Consumer и Provider могут возвращать любые значения, они будут отрезолвлены как Promise. Переданные функции будут так же вызваны.

Так же Consumer и Provider наследуют интерфейс EventEmitter.



Присоединение к произвольному окну/iframe

import { Provider } from 'magic-transport'

const iframeOrigin = '*'
const sharedObject = {
  hello: {
    from: {
      provider: function () {
        return 'hello from provider'
      }
    }
  }
}

const iframe = document.createElement('iframe')
iframe.src = 'https://weather.rambler.ru'
document.body.appendChild(iframe)

const transport = new Provider(
  'YOUR_UNIQ_ID_HERE', 
  iframeOrigin, 
  iframe.contentWindow, 
  sharedObject
)

TODO

  • Написать тесты.