npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@art-suite/web-worker

v1.0.0

Published

- `isBrowser` true/false - `isWebWorker` true/false - `startWorkerFromJsString(workerSourceJs)` - `startWorkerFromFunction(workerFunction)` - `echoWebWorker` sample workerSourceJs

Downloads

13

Readme

WebWorker

  • isBrowser true/false
  • isWebWorker true/false
  • startWorkerFromJsString(workerSourceJs)
  • startWorkerFromFunction(workerFunction)
  • echoWebWorker sample workerSourceJs

WorkerRpc

WorkerRPC has two modes: singleton and instanced.

Singleton

Including WorkerRPC automatically creates the singleton instance. In a worker, the singleton automatically binds to the worker's self.onmessage and starts listening. In workers or the browser, any handler registered with the singleton will be available to respond to any message received by the singleton OR ANY OTHER INSTANCE of WorkerRPC in that thread. You can think of the singleton as the global registry for handlers.

  • In practice:
    • In browser:

      # to register all your handlers, call this one or more times:
      WorkerRpc.register ...
      
      # Call for each each worker you want to listen for RPC calls from,
      # and bind any remote procedures you want to be able to invoke on
      # that specific worker-thread.
      aBoundWorker = new WorkerRpc worker,
        bind: ...
        bindWithPromises: ...
      
      # to make remote-procedure-calls to the worker:
      # NOTE: if registered with bindWithPromises, will return a promise for the RPC's result.
      aBoundWorker.MyWorkerNamespace.myWorkerFunction ...
    • In worker:

      # to register all your handlers, call this one or more times:
      WorkerRpc.register ...
      
      # bind any remote procedures you want to be able to invoke on the browser-thread
      WorkerRpc.bind ...
      WorkerRpc.bindWithPromises ...

NOTES: registered functions are invoked with @/this set to the namespace. That way you can invoke callback functions you previously bound back to the specific worker that invoked the function with: @MyWorkerNamespace.myWorkerFunction()

Real world example

Suppose you want to access the localStorage object on the browser thread from your worker. The 6 lines of code below create the 'self.asyncLocalStorage' object which works just like 'localStorage' except it returns Art.Foundation.Promises for the function results.

browser: (before starting the worker)

{WorkerRpc} = Art.Foundation
WorkerRpc.register localStorage: localStorage
new WorkerRpc workerSourcePath

worker:

{workerRpc} = Art.Foundation.WorkerRpc
workerRpc.bindWithPromises localStorage: ["getItem", "setItem", "removeItem", "clear"]
self.asyncLocalStorage = workerRpc.localStorage

SBD: Isn't that nice! So streamlined!

General Examples

Usage with no return value expected:

  • browser thread:

    new WorkerRpc (new Worker workerUrl),
      register:
        MyMainNamespace:
          doWork: (a) -> ...
  • worker thread:

    {MyMainNamespace} = new WorkerRpc self,
      bind:
        MyMainNamespace: ["doWork"]
    
    MyMainNamespace.doWork myStructuredData

Usage with promises:

  • browser thread:

    new WorkerRpc (new Worker workerUrl),
      register:
        MyMainNamespace:
          concatStrings: (a, b) ->
            a + b
            # equivelent to: Promise.resolve a + b
            # if the result is not a Promse, Promise.resolve(result) is automatically applied
  • worker thread:

    {MyMainNamespace} = new WorkerRpc self,
      bindWithPromises:
        MyMainNamespace: ["concatStrings"]
    
    MyMainNamespace.concatStrings "hi ", "Shane"
    .then (result) ->
      # result == "hi Shane"

Usage with arbitrary response messages:

Sometimes you want a handle to the workerRpc instance for the thread that just send you the message inside your registered response functions. You can access that via the global: WorkerRpc.lastMessageReceivedFrom.

  • browser thread:

    new WorkerRpc (new Worker workerUrl),
      register:
        MyMainNamespace:
          doWorkAndRespond: (key) ->
            count == 0
            invokeThreeTimes =>
              count++
              WorkerRpc.lastMessageReceivedFrom.MyWorkerNamespace.respond key, count
  • worker thread:

    {MyMainNamespace} = new WorkerRpc self,
      register:
        MyWorkerNamespace:
          respond: (key, count) -> console.log "MyWorkerNamespace#respond: #{key} #{count}"
      bind:
        MyMainNamespace: ["doWorkAndRespond"]
    
    MyMainNamespace.doWorkAndRespond "myKey"

Usage - add to global registery:

WorkerRpc.register
  MyGlobalClass:
    doSomethingNoMatterWhoCalls: ->
      ...