jurkust / cross-domain-local-storage

A neet solution for cross domain local storage using invisible iframe and post messages

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Cross Domain Local Storage

  1. Problem
  2. Solution
  3. Why not use cookies?
  4. Installation
  5. Usage
  6. API
  7. Angular Support
  8. Demo
  9. Tests

Problem

As for now, standard HTML5 Web Storage (a.k.a Local Storage) doesn't now allow cross domain data sharing. This may be a big problem in an organization which have a lot of sub domains and wants to share client data between them.

Solution

xdLocalStorage is a lightweight js library which implements LocalStorage interface and support cross domain storage by using iframe post message communication.

Why not use cookies?

Although cookies can be shared between sub domains, cookies have the overhead of being sent to the server on each request. They're also have a size limit (4K for all cookies together)

Installation

Download latest release from here or use bower (recommended)

bower install xdLocalStorage --save

Usage

  • Create an empty html with the following content:
<!DOCTYPE html>
<html>
<head>
    <script src="xdLocalStoragePostMessageApi.min.js"></script>
</head>
<body>
    This is the magical iframe
</body>
</html>
  • On your client page (the page you will read/store your data from) add:
 <!-- if you use angular continue reading.. there's angular support -->
 <script src="scripts/xdLocalStorage.min.js"></script>
  • Init xdLocalStorage
    xdLocalStorage.init(
        {
            /* required */
            iframeUrl:'path to your html from step 1',
            //an option function to be called right after the iframe was loaded and ready for action
            initCallback: function () {
                console.log('Got iframe ready');
            }
            //an option function to be called right after LocalStorage was updated on other tab/window
            updateCallback: function (data) {
                console.log('LocalStorage was updated, new data:', data);
            }
        }
    );

API

    // Store
    xdLocalStorage.setItem(key, value, function (data) { /* callback */ });

    // Retrieve
    xdLocalStorage.getItem(key, function (data) { /* callback */ });

    // Remove
    xdLocalStorage.removeItem(key, function (data) { /* callback */ });

    // Key Name
    xdLocalStorage.key(index, function (data) { /* callback */ });

    // Clear All
    xdLocalStorage.clear(function (data) { /* callback */ });

Angular Support

UPDATE: Since version 2.0.0 the xdLocalStorage service supoprts promise interface hence no more annoying callbacks :)

  • import ng-xdLocalStorage.min.js instead of xdLocalStorage.min.js

  • include xdLocalStorage module and call init in a run block.

angular.module('yourModule', ['xdLocalStorage']).run(function (xdLocalStorage) {
    xdLocalStorage.init(
     {
        /* required */
        iframeUrl:'path to your html from step 1'
    }).then(function () {
        //an option function to be called once the iframe was loaded and ready for action
        console.log('Got iframe ready');
    });
});
  • inject xdLocalStorage where ever you want and use the API
angular.module('yourModule').run(function(xdLocalStorage) {
    xdLocalStorage.getItem(key).then(function (response) {
    	console.log(response.value);
    });
});

Demo

Here's the demo

Tests

I covered the basic API with tests here

About

A neet solution for cross domain local storage using invisible iframe and post messages

License:MIT License


Languages

Language:JavaScript 67.1%Language:HTML 31.6%Language:CSS 1.2%