Skip to content

vardius/peer-cdn

Folders and files

NameName
Last commit message
Last commit date
Jun 27, 2020
Jun 28, 2020
Jun 28, 2020
Jun 28, 2020
Jan 29, 2018
Jun 28, 2020
Jun 14, 2020
Jun 12, 2017
Jan 17, 2018
Jun 12, 2017
Jun 14, 2020
Jun 12, 2017
Jun 15, 2017
Jan 18, 2018
Jun 12, 2017
Jun 28, 2020
Jan 19, 2018
Jun 28, 2020
Jun 28, 2020
Jul 20, 2022

Repository files navigation

peer-cdn

Build Status codecov npm version npm downloads license

logo

Lightweight library providing peer to peer CDN functionality

๐Ÿ“– ABOUT

Contributors:

Want to contribute ? Feel free to send pull requests!

Have problems, bugs, feature ideas? We are using the github issue tracker to manage them.

๐Ÿ“š Documentation

For documentation (including examples), visit rafallorenz.com/peer-cdn

๐Ÿš HOW TO USE

Installation

$ npm install peer-cdn

Basic example

main.js

"use strict";

import { PeerPlugin } from "peer-cdn";

if ("serviceWorker" in navigator) {
  // since sw does not support WebRTC yet
  // this is workaround to use it
  // we use PeerPlugin on client side
  const peerPlugin = new PeerPlugin({
    cacheName: CachePlugin.peerFetch + 1,
    timeoutAfter: 3000,
    servers: {
      iceServers: [
        {
          url: "stun:74.125.142.127:19302",
        },
      ],
    },
    constraints: {
      ordered: true,
    },
  });

  // Set up a listener for messages posted from the service worker.
  // The service worker is set to post a message to specific client only
  // so you should see this message event fire once.
  // You can force it to fire again by visiting this page in an Incognito window.
  navigator.serviceWorker.addEventListener("message", function (event) {
    const request = new Request(event.data.url);
    // mock sw event wrapping request with object
    const middleware = peerPlugin.getMiddleware({ request });

    // run get method of a created middleware
    middleware
      .get()
      .then(function (response) {
        // return response to a service worker
        event.ports[0].postMessage(response);
      })
      .catch(function (error) {
        // return response to a service worker
        event.ports[0].postMessage(null);
      });
  });

  navigator.serviceWorker
    .register("sw.js")
    .then(function (registration) {
      // Registration was successful
      console.log(
        "ServiceWorker registration successful with scope: ",
        registration.scope
      );
    })
    .catch(function (error) {
      console.error("Service Worker Error", error);
    });
}

sw.js

// import peer-cdn into service worker
self.importScripts("https://github.com/vardius/peer-cdn/blob/v1.0.5-beta/dist/index.js");

const { CachePlugin, DelegatePlugin, NetworkPlugin, strategies: { ordered }} = PeerCDN;

const cachePlugin = new CachePlugin({ version: 1 });
// since sw does not support WebRTC yet we use PeerPlugin on client side 
// and we delegate request to it with DelegatePlugin
const delegatePlugin = new DelegatePlugin({ timeoutAfter: 5000 });
const networkPlugin = new NetworkPlugin();

const cdn = new PeerCDN();

cdn.GET("/css/main.css", ordered,
    cachePlugin.getMiddleware,
    delegatePlugin.getMiddleware,
    networkPlugin.getMiddleware
);

// We need to register service worker events
// cdn.register() will add listeners for install, activate and fetch
// gaining required control
cdn.register();

๐Ÿ“œ License

This package is released under the MIT license. See the complete license in the package