All Projects → raido → ember-window-messenger

raido / ember-window-messenger

Licence: MIT license
This aims to be an simple window postMessage services provider.

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language
HTML
75241 projects
Handlebars
879 projects
CSS
56736 projects

Projects that are alternatives of or similar to ember-window-messenger

Ember Attacher
Native tooltips and popovers for Ember.js
Stars: ✭ 69 (+305.88%)
Mutual labels:  ember, addon
chronosjs
JS Channels (Events / Commands / Reqest-Response / Courier) Mechanism
Stars: ✭ 35 (+105.88%)
Mutual labels:  communication, postmessage
Ember Socket Guru
Addon for easy integration with Pusher.js, ActionCable, Socket.io and Phoenix Channels
Stars: ✭ 119 (+600%)
Mutual labels:  ember, addon
Ember Can
Simple authorisation addon for Ember apps
Stars: ✭ 262 (+1441.18%)
Mutual labels:  ember, addon
Ember Page Title
Page title management for Ember.js Apps
Stars: ✭ 177 (+941.18%)
Mutual labels:  ember, addon
Ember Cli Updater
ember-cli addon to help you update your ember-cli application or addon.
Stars: ✭ 32 (+88.24%)
Mutual labels:  ember, addon
Ember Basic Dropdown
The basic dropdown you ember app needs
Stars: ✭ 140 (+723.53%)
Mutual labels:  ember, addon
ember-formly
JavaScript powered forms for Ember
Stars: ✭ 24 (+41.18%)
Mutual labels:  ember, addon
Ember File Upload
HTML5 file uploads for Ember apps
Stars: ✭ 172 (+911.76%)
Mutual labels:  ember, addon
Ember Pikaday
A datepicker component for Ember CLI projects.
Stars: ✭ 151 (+788.24%)
Mutual labels:  ember, addon
ember-eui
Ember Components for Elastic Eui
Stars: ✭ 22 (+29.41%)
Mutual labels:  ember, addon
Ember Font Awesome
ember-cli addon for using Font Awesome icons in Ember apps
Stars: ✭ 225 (+1223.53%)
Mutual labels:  ember, addon
ember-links-with-follower
Render a set of links with a "follower" line underneath. The follower moves to the active link, matching size and position on the page.
Stars: ✭ 43 (+152.94%)
Mutual labels:  ember, addon
Ember Searchable Select
Data-down, actions up select-like menu with searching and tagging capabilities.
Stars: ✭ 38 (+123.53%)
Mutual labels:  ember, addon
ember-cli-daterangepicker
Just a simple component to use bootstrap-daterangepicker.
Stars: ✭ 32 (+88.24%)
Mutual labels:  ember, addon
Ember Data Url Templates
an ember-addon to allow building urls with url templates instead of defining buildURL
Stars: ✭ 130 (+664.71%)
Mutual labels:  ember, addon
ember-legit-forms
Component for creating flexible forms along with validations.
Stars: ✭ 41 (+141.18%)
Mutual labels:  ember, addon
ember-app-scheduler
An Ember addon to schedule work until after the initial render.
Stars: ✭ 67 (+294.12%)
Mutual labels:  ember, addon
Ember Web App
NOTICE: official repository moved to https://github.com/zonkyio/ember-web-app
Stars: ✭ 143 (+741.18%)
Mutual labels:  ember, addon
Ember Power Calendar
Powerful and customizable calendar component for Ember
Stars: ✭ 200 (+1076.47%)
Mutual labels:  ember, addon

ember-window-messenger

CI npm version

This Ember addon is a lightweight postMessage client/server implementation. It is built on promises so the fetch and rpc methods can be used directly in your route model() hooks.

For changelog see CHANGELOG.md

It supports JSON only messages for now

Compatibility

  • Ember.js v3.20 or above
  • Ember CLI v3.20 or above
  • Node.js v12 or above

Usage

ember install ember-window-messenger

Configuration

Add target:origin map to your config/environment.js. This effectively defines which targets (windows, frames) is your app communicating with.

APP: {
  // Here you can pass flags/options to your application instance
  // when it is created
  'ember-window-messenger': {
    'parent': 'http://localhost:4200',
    'target-1': 'http://localhost:4200',
    'target-2': 'http://localhost:4200',
    'popup': 'http://localhost:4200'
  }
}

This list is also used for validation, to check if message comes from an allowed origin.

Examples

If you dare, fire up the dummy app in this addon and test it out. Below are the basic examples, see dummy app for more.

Setup server on parent

// app/service/your-server.js
import Service, { inject as service } from '@ember/service';

export default class YourServerService extends Service {
  @service('window-messenger-server');
  server;

  setup() {
    this.server.on('demo-data', this.onDemoDataRequest);
  }

  teardown() {
    this.server.off('demo-data', this.onDemoDataRequest);
  }

  onDemoDataRequest = (resolve, reject, query) => {
    resolve('Some data');
  }
}

// app/routes/your-route.js
import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class YourRoute extends Route {
  @service('your-server');
  yourServer;

  activate() {
    super.activate();
    this.yourServer.setup();
  }

  deactivate() {
    super.deactivate();
    this.yourServer.teardown();
  }
}

Fetch from parent

import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class YourRoute extends Route {
  @service('window-messenger-client')
  client;

  model() {
    return this.client.fetch('demo-data');
  }
}

Fetch from a specific target

This can be used from parent window to frames/tabs communication.

import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class YourRoute extends Route {
  @service('window-messenger-client')
  client;

  model() {
    return this.client.fetch('popup:demo-data');
  }
}

Execute RPC call

Internally it is the same as fetch, but provides semantic sugar to your app code.

import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';

export default class YourController extends Controller {
  @service('window-messenger-client')
  client;

  @action
  runMe() {
    this.client.rpc('start-worker').then((response) => {
      // handle response here
    });
  }
}

iFrames, popup windows

If you want to communicate with an iframe or a popup window opened with window.open, then you have to register your window instance on the client with matching target name from config/environment map.

iFrame

// app/components/x-frame.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';

export default class XFrameComponent extends Component {
  @service('window-messenger-client')
  client;

  register(frameElement) {
    this.client.addTarget(this.args.target, frameElement.contentWindow);
  },

  unregister() {
    this.client.removeTarget(this.args.target);
  }
}
<!-- app/components/x-frame.hbs -->
<!-- Install ember-render-modifiers for did-insert/will-destory modifiers -->
<iframe 
  ...attributes
  {{did-insert this.register}}
  {{will-destory this.unregister}}
></iframe>

<!-- app/templates/your-route.hbs -->
<XFrame src="<url>" @target="target-1"/>

Popup with window.open

// app/controller/your-controller.js
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';
import { tracked } from '@glimmer/tracking';

export default class YourController extends Controller {
  @service('window-messenger-client')
  client;

  @tracked
  model = null;

  @action
  openPopup() {
    let win = window.open('/some/path', 'Example popup', 'toolbar=no,resizable=no,width=400,height=400');
    this.client.addTarget('popup', win);
  }

  @action
  fetchFromPopup() {
    this.client.fetch('popup:some-data').then((name) => {
      this.model = name;
    });
  }
}

Open popup if it isn't already open, or has been closed by the user

// app/controller/your-controller.js
import Controller from '@ember/controller';
import { inject as service } from '@ember/service';
import { action } from '@ember/object';

export default class YourController extends Controller {
  @service('window-messenger-client')
  client;

  @action
  openPopup() {
    if (!this.client.hasTarget('popup')) {
      let win = window.open('/some/path', 'Example popup', 'toolbar=no,resizable=no,width=400,height=400');
      this.client.addTarget('popup', win);
    }
  }
}

License

This project is licensed under the MIT License.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].