GithubHelp home page GithubHelp logo

emitter-io / emitter Goto Github PK

View Code? Open in Web Editor NEW
3.7K 109.0 350.0 13.23 MB

High performance, distributed and low latency publish-subscribe platform.

Home Page: https://emitter.io

License: GNU Affero General Public License v3.0

Go 99.32% Batchfile 0.08% Dockerfile 0.12% HTML 0.48%
pubsub networking emitter mqtt mqtt-broker realtime high-performance low-latency golang go

emitter's Introduction

kelindar/column
Go Version Go Report Card Coverage Twitter

Emitter: Distributed Publish-Subscribe Platform

Emitter is a distributed, scalable and fault-tolerant publish-subscribe platform built with MQTT protocol and featuring message storage, security, monitoring and more:

  • Publish/Subscribe using MQTT over TCP or Websockets.
  • Resilient, highly available and partition tolerant (AP in CAP terms).
  • Able to handle 3+ million of messages/sec on a single broker.
  • Supports message storage with history and message-level expiry.
  • Provides secure channel keys with permissions and can face the internet.
  • Automatic TLS/SSL and encrypted inter-broker communication.
  • Built-in monitoring with Prometheus, StatsD and more.
  • Shared subscriptions, links and private links for channels.
  • Easy deployment with Docker and Kubernetes of production-ready clusters.

Emitter can be used for online gaming and mobile apps by satisfying the requirements for low latency, binary messaging and high throughput. It can also be used for the real-time web application such as dashboards or visual analytics or chat systems. Moreover, Emitter is perfect for the internet of things and allows sensors to be controlled and data gathered and analyzed.

Tutorials & Demos

The following video tutorials demonstrate various features of Emitter in action.

FOSDEM 2018 FOSDEM 2019 PubSub in Go Message Storage Using MQTTSpy ISS Tracking Self-Signed TLS Monitor with eTop StatsD and DataDog Links & Private Links Building a Client-Server app with Publish-Subscribe in Go Distributed Actor Model with Publish/Subscribe and Golang Online Multiplayer Platformer Game with Emitter Keeping one Last Message per Channel using MQTT Retain Load-balance Messages using Subscriber Groups

How to Deploy

Local Emitter Cluster K8s and DigitalOcean K8s and Google Cloud K8s and Azure

Quick Start

Run Server

The quick way to start an Emitter broker is by using docker run command as shown below.

Notice: You must use -e for docker environment.You could get it from your docker log.

docker run -d --name emitter -p 8080:8080 --restart=unless-stopped emitter/server

Alternatively, you might compile this repository and use go get command to rebuild and run from source.

go get -u github.com/emitter-io/emitter && emitter

Get License

Both commands above start a new server and if no configuration or environment variables were supplied, it will print out a message(or you could find it in the docker log) similar to the message below once the server has started :

[service] unable to find a license, make sure 'license' value is set in the config file or EMITTER_LICENSE environment variable
[service] generated new license: uppD0PFIcNK6VY-7PTo7uWH8EobaOGgRAAAAAAAAAAI
[service] generated new secret key: JUoOxjoXLc4muSxXynOpTc60nWtwUI3o

This message shows that a new security configuration was generated, you can then re-run EMITTER_LICENSE set to the specified value. Alternatively, you can set "license" property in the emitter.conf configuration file.

Re-Run Command

References are available. Please replace your EMITTER_LICENSE to it.

docker run -d --name emitter -p 8080:8080 -e EMITTER_LICENSE=uppD0PFIcNK6VY-7PTo7uWH8EobaOGgRAAAAAAAAAAI --restart=unless-stopped emitter/server

Generate Key

Finally, open a browser and navigate to http://127.0.0.1:8080/keygen in order to generate your key. Now you can use the secret key generated to create channel keys, which allow you to secure individual channels and start using emitter.

Warning: If you use upon command, you secret is JUoOxjoXLc4muSxXynOpTc60nWtwUI3o. And it's not safe!!!

Usage Example

The code below shows a small example of usage of emitter with the Javascript SDK. As you can see, the API exposes straightforward methods such as publish and subscribe which can take binary payload and are secured through channel keys.

// connect to emitter service
var connection = emitter.connect({ host: '127.0.0.1' });

// once we're connected, subscribe to the 'chat' channel
emitter.on('connect', function(){
    emitter.subscribe({
        key: "<channel key>",
        channel: "chat"
    });
});

// publish a message to the chat channel
emitter.publish({
    key: "<channel key>",
    channel: "chat/my_name",
    message: "hello, emitter!"
});

Further documentation, demos and language/platform SDKs are available in the develop section of our website. Make sure to check out the getting started tutorial which explains the basic usage of emitter and MQTT.

Command line arguments

The Emitter broker accepts command line arguments, allowing you to specify a configuration file, usage is shown below.

-config string
   The configuration file to use for the broker. (default "emitter.conf")

-help
   Shows the help and usage instead of running the broker.

Configuration File

The configuration file (defaulting to emitter.conf) is the main way of configuring the broker. The configuration file is however, not the only way of configuring it as it allows a multi-level override through environment variables and/or hashicorp Vault.

The configuration file is in JSON format, but you can override any value by providing an environment variable which follows a particular format, for example if you'd like to provide a license through environment variable, simply define EMITTER_LICENSE environment variable, similarly, if you want to specify a certificate, define EMITTER_TLS_CERTIFICATE environment variable. Example of configuration file:

{
    "listen": ":8080",
    "license": "/*The license*/",
    "tls": {
        "listen": ":443",
        "host": "example.com"
    },
    "cluster": {
        "listen": ":4000",
        "seed": " 192.168.0.2:4000",
        "advertise": "public:4000"
    },
    "storage": {
        "provider": "inmemory"
    }
}

The structure of the configuration is described below:

Property Env. Variable Description
license EMITTER_LICENSE The license file to use for the broker. This contains the encryption key.
listen EMITTER_LISTEN The API address used for TCP & Websocket communication, in IP:PORT format (e.g: :8080).
limit.messageSize EMITTER_LIMIT_MESSAGESIZE Maximum message size. Default is 64KB.
tls.listen EMITTER_TLS_LISTEN The API address used for Secure TCP & Websocket communication, in IP:PORT format (e.g: :443).
tls.host EMITTER_TLS_HOST The hostname to whitelist for the certificate.
tls.email EMITTER_TLS_EMAIL The email account to use for autocert.
vault.address EMITTER_VAULT_ADDRESS The Hashicorp Vault address to use to further override configuration.
vault.app EMITTER_VAULT_APP The Hashicorp Vault application ID to use.
cluster.name EMITTER_CLUSTER_NAME The name of this node. This must be unique in the cluster. If this is not set, Emitter will set it to the external IP address of the running machine.
cluster.listen EMITTER_CLUSTER_LISTEN The IP address and port that is used to bind the inter-node communication network. This is used for the actual binding of the port.
cluster.advertise EMITTER_CLUSTER_ADVERTISE The address and port to advertise inter-node communication network. This is used for nat traversal.
cluster.seed EMITTER_CLUSTER_SEED The seed address (or a domain name) for cluster join.
cluster.passphrase EMITTER_CLUSTER_PASSPHRASE Passphrase is used to initialize the primary encryption key in a keyring. This key is used for encrypting all the gossip messages (message-level encryption).
storage.provider EMITTER_STORAGE_PROVIDER This property represents the publishers publish message storage mode. there are two kinds of can use, they are respectively inmemory and ssd, defaults to the former.
storage.config.dir EMITTER_STORAGE_CONFIG If the storage mode is ssd, this property indicates where the messages are stored (emitter server nodes are not allowed to use the same directory within the same machine)

Building and Testing

The server requires Golang 1.9 to be installed. Once you have this installed, simply go get this repository and run the following commands to download the package and run the server.

go get -u github.com/emitter-io/emitter && emitter

If you want to run the tests, simply run go test command as demonstrated below.

go test ./...

Deploying as Docker Container

Docker Automated build Docker Pulls

Emitter is conveniently packaged as a docker container. To run the emitter service on a single server, use the command below. Once the server is started, it will generate a new security configuration, you can then re-run the same command with an additional environment variable -e EMITTER_LICENSE set to the provided value.

docker run -d -p 8080:8080 emitter/server

For the clustered (multi-server) mode, the container can be started using the simple docker run with 3 main parameters.

docker run -d -p 8080:8080 -p 4000:4000 -e EMITTER_LICENSE=[key] -e EMITTER_CLUSTER_SEED=[seed] -e EMITTER_CLUSTER_PASSPHRASE=[name] emitter/server

Support, Discussion, and Community

Join the chat at https://gitter.im/emitter-io/public

If you need any help with Emitter Server or any of our client SDKs, please join us at either our gitter chat where most of our team hangs out at or drop us an e-mail at [email protected].

Please submit any Emitter bugs, issues, and feature requests to emitter-io>emitter. If there are any security issues, please email [email protected] instead of posting an open issue in Github.

Contributing

If you'd like to contribute, please fork the repository and use a feature branch. Pull requests are warmly welcome.

Licensing

Copyright (c) 2009-2019 Misakai Ltd. This project is licensed under Affero General Public License v3.

Emitter offers support contracts and is now also offered via a commercial license. Please contact [email protected] for more information.

emitter's People

Contributors

abserari avatar ainilili avatar alaingilbert avatar alrs avatar cameronnemo avatar codelingobot avatar cravler avatar dtchanpura avatar florimond avatar kelindar avatar lzh2nix avatar makyo-dev avatar miaodadao avatar paralax avatar sarge avatar satishthakur avatar softkot avatar testwill avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

emitter's Issues

Channel key for multi level channel ?

I was wondering why when I create a channel key for let say a/b or /a/b or a/b/ or /a/b/.
I was not able to subscribe to the channel <channel key>/a/b/.
I need to create a key for: a, and then I can subscribe to <channl key>/a/b/.

Is this behavior intentional ? or is it a bug ? or incomplete feature ?
I think it would be nice to be able to create a key for a multi level channel such as a/b/c/d/ or a/b/*/ for example.


The code seems to only verify the first part of a channel.

if key.Target() != 0 && key.Target() != channel.Target() {

// Target returns the channel target (first element of the query, second element of an SSID)
func (c *Channel) Target() uint32 {
return c.Query[0]
}

Publish and Presence over HTTP

Right now, publishing of new messages requires the SDK which could be not-very-convenient when integrating with a website. For example, if one wants to track page views or connected users it would be easier to simply support Publish Over HTTP.

Similarly, we need to investigate getting the Presence over HTTP (just the status). Alongside, we should investigate the possibility and performance implications of Subscribe over HTTP.

js emitter.on( 'message', callback ) can not get topic

emitter.js
125 this._mqtt.on('message', function (topic, msg, packet) {
126 var message = new EmitterMessage(packet);
127 if (_this._startsWith(message.channel, 'emitter/keygen')) {
128 // This is keygen message.
129 _this._tryInvoke('keygen', message.asObject());
130 }
131 else if (_this._startsWith(message.channel, 'emitter/presence')) {
132 // This is presence message.
133 _this._tryInvoke('presence', message.asObject());
134 }
135 else if (_this._startsWith(message.channel, 'emitter/me')) {
136 // This is a message requesting info on the connection.
137 _this._tryInvoke('me', message.asObject());
138 }
139 else {
140 // Do we have a message callback
141 _this._tryInvoke('message', message);
142 }
143 });

in usage of on('message',callback) , callback can not receive "topic" args .

How can I know Where the message from , if there is no "topic" info ?

error during subscribe received

Hello,
I've been struggling with this, since morning. When I try subscribing to a channel, using a channel key, generated from the keygen, it displaying the following in the logs

2018/03/19 15:27:44 [conn] created (8491AD30)
2018/03/19 15:27:45 [conn] created (8591AD30)
2018/03/19 15:27:45 [conn] error during subscribe received (The security key provided is not authorized to perform this operation.)

Can anyone help me out?
Thanks

Max Limit for publishing Messages over emitter.publish()

Is there any Max threshold that I can hold the messages size while doing Publish through emitter broker? If it is re-sizable, then could you please suggest how to increase the size. Currently I am able to publish only 10kb of data in one publish call.

Doc: add nice search experience

๐Ÿ‘‹ team,

We spot you at FOSDEM 2018 and I couldn't help me providing a nice search experience for you good documentation, see below:
DocSearch Demo

If you set the id attribute of lvl1, you could also have a precise scroll thank to anchors.

Congratulations, your search is now ready!
I've successfully configured the underlying crawler and it will now run every 24h.

You're now a few steps away from having it working on your website:

  • Copy the following CSS/JS snippets and add them to your page
<!-- at the end of the HEAD -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
<!-- at the end of the BODY -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js"></script>
<script type="text/javascript"> docsearch({
  apiKey: 'b5934425f0b42e9596a041346e549520',
  indexName: 'emitter_io',
  inputSelector: '### REPLACE ME ####',
  debug: false // Set debug to true if you want to inspect the dropdown
});
</script>

Feel free to get back to us if you have any issues or questions regarding the integration.
We'd also be happy to get your feedback and thoughts about DocSearch - so we can continue to improve it.

Have a nice day :)

Emmiter service stops when running in windows

Operating System - Windows 10
Commdan - docker run -d --name emitter -p 8080:8080 --privileged --restart=unless-stopped emitter/server

The docker logs for the container -

  • exec emitter
    2017/12/21 14:30:12 [service] configured vault username (141-226-237-60)
    2017/12/21 14:30:12 [service] unable to find a license, make sure 'license' value is set in the config file or EMITTER_LICENSE environment variable
    2017/12/21 14:30:12 [service] generated new license: xO5qGA4_51ipcTwC5bEMZzyEEZdGnXloAAAAAAAAAAI
    2017/12/21 14:30:12 [service] generated new secret key: FdM9SngeP6AVNRWlWdICv6VhDGb_cC26
  • exec emitter
    2017/12/21 14:30:25 [service] configured vault username (141-226-237-60)
    2017/12/21 14:30:25 [service] unable to find a license, make sure 'license' value is set in the config file or EMITTER_LICENSE environment variable
    2017/12/21 14:30:25 [service] generated new license: Wwf6d0te6dBqhSEA_x0SJ_kfqJmDphC3AAAAAAAAAAI
    2017/12/21 14:30:25 [service] generated new secret key: R-YqI767_1YgAeQcEA-iJB6KQ-ibnNPZ
  • exec emitter
    2017/12/21 14:30:52 [service] configured vault username (141-226-237-60)
    2017/12/21 14:30:52 [service] unable to find a license, make sure 'license' value is set in the config file or EMITTER_LICENSE environment variable
    2017/12/21 14:30:52 [service] generated new license: TxTkcIWYRR3eBQ9C8eGac0qJ3Wb8YGZ1AAAAAAAAAAI
    2017/12/21 14:30:52 [service] generated new secret key: T5hRQioeUYodP77-NPaa1cKjpjKpSWLQ
    ...

As you can see the emitter service stops right after starting and the docker restarts it.

Subscribe not working as expected (subscribe multi level without asking for it)

Let say I subscribe to <channel key>/a/
I receive all messages for <CK>/a/b/, <CK>/a/b/c/ ... as well.
This behavior doesn't seems normal to me.


Here is a script to reproduce it:

package main

import (
  "fmt"
  "github.com/eclipse/paho.mqtt.golang"
  "time"
)

func onMessageReceived(client mqtt.Client, message mqtt.Message) {
  // Will never be executed.
}

func publishHandler(client mqtt.Client, message mqtt.Message) {
  fmt.Printf("message on topic: %s, Message: %s\n", message.Topic(), message.Payload())
}

func main() {
  rwKey := "bsol8lzYVW_Y_-CU4Mp2Be99WeWNpn6g"
  opts := mqtt.NewClientOptions()
  opts.AddBroker("tcp://127.0.0.1:8080")
  opts.SetDefaultPublishHandler(publishHandler)
  c := mqtt.NewClient(opts)
  token := c.Connect()
  token.Wait()
  token = c.Subscribe(rwKey+"/a/", 0, onMessageReceived)
  token.Wait()
  token = c.Publish(rwKey+"/a/b/c/d/e/f/", 2, false, "TEST")
  time.Sleep(1 * time.Second)
}
$ go run main.go
message on topic: a/b/c/d/e/f/, Message: TEST

Edit: According to the tests, this behavior seems to be expected:

testPopulateWithStrings(m, []string{
"a/",
"a/b/c/",
"a/+/c/",
"a/b/c/d/",
"a/+/c/+/",
"x/",
"x/y/",
"x/+/z",
})
// Tests to run
tests := []struct {
topic string
n int
}{
{topic: "a/", n: 1},
{topic: "a/1/", n: 1},
{topic: "a/2/", n: 1},
{topic: "a/1/2/", n: 1},
{topic: "a/1/2/3/", n: 1},
{topic: "a/x/y/c/", n: 1},
{topic: "a/x/c/", n: 2},
{topic: "a/b/c/", n: 3},
{topic: "a/b/c/d/", n: 5},
{topic: "a/b/c/e/", n: 4},
{topic: "x/y/c/e/", n: 2},

But it doesn't seems to follow the MQTT specification:
http://www.steves-internet-guide.com/understanding-mqtt-topics/

about cluster

Hi all:
I have two questions about cluster here:

A Cluster has two nodes: Aใ€B
1. If User X connected to A, Y connected to B, how does X and Y communicate?
2.If node C join the cluster, how does you migrate the persistent data for the hash

Channels and their keys

Hi, is there an easy way to pre-configure all channels and their keys.
It seems currently you have to go through the key-generator page?, or maybe i missed something?

Any help is awesome...

Android Platform Support

This is great project โค๏ธ, thanks for open sourcing it. I was trying to build something if this kind for my mobile application project. Is there any platform support for Android OS in the near future. As of now most the android developer have been using firebase for realtime communication, which is paid service. I see a great potential in this project and could be next big thing. Enabling android platform support would let may more developer build great app. Android platform support would be great feature of this project .I am very much interested in this project and want to develop Android Platform support tools for this project. Let me know is this could be great thing?

/go/bin/emitter.conf: bad file descriptor

Current version of emitter/server pulled from Docker Hub (Nov. 15th 2017) looks broken:

$ docker --version
Docker version 17.09.0-ce, build afdb6d4
$ docker run --name emitter -d -p8080:8080 --privileged emitter/server 
+ exec emitter
panic: Unable to parse configuration, due to write /go/bin/emitter.conf: bad file descriptor

goroutine 1 [running]:
main.main()
	/go/src/github.com/emitter-io/emitter/main.go:36 +0x6bd

About unsafe pointer

I think

rootPtr := (*unsafe.Pointer)(unsafe.Pointer(&c.root))
	root := (*iNode)(atomic.LoadPointer(rootPtr))

is equal to

root := c.root

But maybe there is something that i missed here,please tell me why :)

Link to Presence in Wiki is Incorrect

If I knew how to fork and submit a PR for the Wiki I would, but it's not immediately apparent to me, so I'll just create an issue instead...

Super minor, but the link to the Presence Wiki page is broken in the Getting Started page.

Here's the steps to fix:

  1. Go to https://github.com/emitter-io/emitter/wiki/1.-Getting-Started
  2. Search for "Presence" and find the link. It's presently resolving to https://github.com/develop/presence
  3. It should link instead to https://github.com/emitter-io/emitter/wiki/4.-Presence I believe the relative link could be 4.-Presence, thus this markdown: See [presence](4.-Presence) for more details.

https://stackoverflow.com/questions/6474045/linking-to-other-wiki-pages-on-github

Seed using a domain name

When seeding the cluster using a domain name instead of the IP address, we should join to all of the addresses resolved by the domain. This would simplify the process and resolve some failure conditions when restarting the cluster.

Puback is ignored

Hi all:
Why does emitter ignore puback packet?
If puback is not handled, the message will not be deleted. Maybe when a user get online, will he get all the messages which are not expired?

Typo in Wiki

In the docs referring to page https://github.com/emitter-io/emitter/wiki/3.-Storing-Messages there is typo in para below first code example, this might mislead.

In the above example the message 'Bitcoin value doubled in two months time' is stored in the Emitter broker for 10080 seconds (one week).
In the above para which is from the wiki
10080 minutes is equals to one week, not 10080 seconds
604800 seconds is equal to one week.

Emitter Publisher-Subscriber Matrix

Hi, I put together this Publisher-Subscriber Matrix to better understand how subscriptions and filtering work in Emitter.

First column is channel to publish to
First row is channel that subscriber is listening to
โœ”๏ธ Subscriber will receive the message
โŒ Subscriber won't receive the message

Publish to โฌ‡๏ธ / Subscriber โžก๏ธ C C/A C/+ C/A/B C/+/B C/D
C โœ”๏ธ โŒ โŒ โŒ โŒ โŒ
C/A โœ”๏ธ โœ”๏ธ โœ”๏ธ โŒ โŒ โŒ
C/A/B โœ”๏ธ โœ”๏ธ โŒ โœ”๏ธ โœ”๏ธ โŒ
C/D โœ”๏ธ โŒ โœ”๏ธ โŒ โŒ โœ”๏ธ
C/D/B โœ”๏ธ โŒ โŒ โŒ โœ”๏ธ โœ”๏ธ

Can you please verify if this is correct? It would be very helpful if we can add something like this to the documentation. Thanks!

Presence: Subscribe/unsubscribe happening multiple times

I am facing an issue with respect to Presence . Following is the scenario. Kindly help.

We have emitter broker ( c#) running under Mesh. and trying the client to subscribe or unsubscribe on particular topic ( ex: channel/topic/+) . We are observing a behavior where, whenever the client gets subscribed, the presence Json was getting displayed multiple times ( depends on number of servers under Mesh. In my case, 4 times).

We have no clue why on Mesh, the Presence logic is behaving like this. Any inputs on this are welcome.

LUID logged while connection is created but GUID when it's closed

Added following comment to commit 1e8b9e2 while ago, perhaps same ID could be logged ๐Ÿ˜„?

Hi,

idk if this is worth of creating an issue but i'm just curious - this was changed here from LUID to GUID but line 57, after connection creation,

logging.LogTarget("conn", "created", c.luid)
the LUID is still logged.

wouldn't it be neat to have same id referenced in log and maybe similar log entries could be matched?

2018/03/11 22:23:55 [conn] created (ACF98330)
2018/03/11 22:23:58 [conn] closed (R4KDCEQDRWNPC5SH7GCQRSSMQA)

Broker-assigned message ID for internal (storage) usage

Here's what I was thinking, we are going to generate a unique, 64-bit ID for each incoming message on the broker itself. The current proposal is to keep the ID to 64-bit thus allowing many future optimisations.

We would start this number with a timestamp in second, so a partition (location) can be easily inferred from the ID itself without the need to store any additional data. The node ID would ideally be negociated between brokers or can be a generated by using a hash function over an existing node ID, but we will need to check for collisions on this.

Bit Range Bit Size Description Variations
0-29 30 Unix timestamp in seconds after 2017 1,073,741,823
30-43 14 Node ID 16,383
44-63 20 Atomic Counter 1,048,575

The format above could allow for:

  • 30 years of data retention (will need to reset the offset after 30 years)
  • max cluster of 16383 brokers
  • just over 1M messages per second per broker

Can't access console after running docker image

screen shot 2016-12-24 at 11 45 39 pm
Hello,

I could able to build latest emitter locally for docker, but can't see the console or keygen in my browser accessing 127.0.0.1:8080/console, can you please let me know what's causing the issue.

emitter.conf documentation

I am facing issues to configure Emitter.Server over Ubuntu instance ... documentation about emitter.conf is very poor .

comparing "username/password" in connect stanza , what is advantage of channel key ?

I really don't unerstand channel key.
I only know it is allocated according master key and "permission request" , so , I think it is work of "administor " to allocate "channel key" for different clients . is it right ?
then, server can check permission according channel key ?
my question is why not use user name to represent "permssion" control info ?
thank you.
anyway, emitter-io is stable and serious job.

.net core 2.0 Migration

Team,
Recently Microsoft announced the latest version of .net core 2.0 on August 14th,2017. Currently my project is built upon .net core 1.1 and .netstandard 1.5. When I looked into emitter.server & emitter.runtime they both are under the v1.1 and standard 1.5 respectively. If I try to change the target framework to .netstandard2.0 & .netcore2.0 , emitter is getting failed with lots of errors related to dll references.

So, can i have a update from your team, Like Is there any plan to migrate your code src to latest .netcore 2.0? and when can we all expect these changes. Any ETA is appreciated.

Still having issues

#74 I would also want to add, that I can't access the keygen using the url http://localhost:8080/keygen and docker ps show there is no active emitter-io instance running.

Add expirable cache for the HTTP contract provider

Right now, the contract provider never re-fetches the contracts which might lead to inconsistencies. We need to make sure it refreshes the contracts either periodically or on expiration. This ideally should not slow down the request path.

Roadmap to ConsumerGroup

Concept borrowed from Kafka
Producer published [1,2,3,4,5,6,7,8,9]
ConsumerGroupMember01 subscribes and get [4,5,6]
ConsumerGroupMember02 subscribes and get [2,3]
ConsumerGroupMember03 subscribes and get [1,7,8,9]

Access to the path '/sys/class/net/lo/operstate' is denied.

Hi, I'm trying to install emitter-io on: openSUSE Leap 42.2, Docker version 1.12.6

$ docker run -d --name emitter -p 127.0.0.1:8888:8080 emitter/server

But have an error:

Warning: Configuration file 'emitter.conf' does not exist, using default configuration.
Error: No license was found, please provide a valid license key through the configuration file, an EMITTER_LICENSE environment variable or a valid vault key 'secrets/emitter/license'.
Warning: New license: *****
Warning: New secret key: *****
Warning: New license and secret key were generated, please store them in a secure location and restart the server with the license provided.

Unhandled Exception: System.UnauthorizedAccessException: Access to the path '/sys/class/net/lo/operstate' is denied. ---> System.IO.IOException: Permission denied
   --- End of inner exception stack trace ---
   at System.IO.UnixFileStream.CheckFileCall(Int64 result, Boolean ignoreNotSupported)
   at System.IO.UnixFileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)
   at System.IO.UnixFileSystem.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, FileStream parent)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
   at System.IO.File.InternalReadAllText(String path, Encoding encoding)
   at System.IO.File.ReadAllText(String path)
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetOperationalStatus(String name)
   at System.Net.NetworkInformation.LinuxNetworkInterface..ctor(String name)
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetOrCreate(Dictionary`2 interfaces, String name)
   at System.Net.NetworkInformation.LinuxNetworkInterface.<>c__DisplayClass5_0.<GetLinuxNetworkInterfaces>b__2(String name, LinkLayerAddressInfo* llAddr)
   at Interop.Sys.EnumerateInterfaceAddresses(IPv4AddressDiscoveredCallback ipv4Found, IPv6AddressDiscoveredCallback ipv6Found, LinkLayerAddressDiscoveredCallback linkLayerFound)
   at System.Net.NetworkInformation.LinuxNetworkInterface.GetLinuxNetworkInterfaces()
   at Emitter.Network.ServiceAddress.FromBinding(IBinding binding)
/deploy.sh: line 2:     7 Aborted                 (core dumped) dotnet Emitter.Server.dll
```

encounters stack overflow in trie goroutine

nohup: ignoring input
2017/10/18 20:46:45 [swarm] error during getting node name (invalid peer name format: "emitter1")
2017/10/18 20:46:45 [service] configured logging provider (stderr)
2017/10/18 20:46:45 [service] configured storage provider (inmemory)
2017/10/18 20:46:45 [service] configured metering provider (noop)
2017/10/18 20:46:45 [service] configured contracts provider (single)
2017/10/18 20:46:45 [service] configured external address (115.236.45.194)
2017/10/18 20:46:45 [service] configured node name (56:1b:6b:07:45:5e)
2017/10/18 20:46:45 [service] subscribe ([0 3939663052])
2017/10/18 20:46:45 [service] starting the listener (:8080)
2017/10/18 20:46:45 [service] error during setup of TLS/SSL listener (No certificate or private key configured)
2017/10/18 20:46:45 [service] service started
2017/10/18 20:46:49 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/18 20:46:49 [swarm] peer created (00:ff:22:29:e9:bc)
2017/10/18 20:46:49 [service] subscribe ([0 3939663052])
2017/10/18 20:46:49 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:46:49 [service] unsubscribe ([2469567783 2086528646])
2017/10/18 20:46:49 [service] subscribe ([0 3939663052])
2017/10/18 20:46:49 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:46:49 [swarm] peer created (56:00:8b:1e:67:ec)
2017/10/18 20:46:49 [service] subscribe ([0 3939663052])
2017/10/18 20:46:49 [service] unsubscribe ([2469567783 2086528646])
2017/10/18 20:46:49 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:46:49 [service] unsubscribe ([2469567783 2086528646])
2017/10/18 20:46:49 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:46:50 [conn] created (B6FE8A2A)
2017/10/18 20:46:50 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:47:18 [conn] closed (B6FE8A2A)
2017/10/18 20:47:18 [service] unsubscribe ([2469567783 2086528646])
2017/10/18 20:47:18 [conn] created (B7FE8A2A)
2017/10/18 20:47:18 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:47:20 [swarm] peer removed (56:00:8b:1e:67:ec)
2017/10/18 20:47:20 [service] unsubscribe ([0 3939663052])
2017/10/18 20:47:20 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/18 20:47:20 [service] unsubscribe ([0 3939663052])
2017/10/18 20:47:20 [service] unsubscribe ([2469567783 2086528646])
2017/10/18 20:47:48 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/18 20:47:48 [service] subscribe ([2469567783 2086528646])
2017/10/18 20:48:20 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/18 20:48:20 [service] unsubscribe ([2469567783 2086528646])
2017/10/18 20:50:45 [swarm] peer removed (00:ff:22:29:e9:bc)
2017/10/18 20:50:45 [service] unsubscribe ([0 3939663052])
2017/10/19 08:31:35 [conn] created (B8FE8A2A)
2017/10/19 08:31:35 [swarm] peer created (00:ff:22:29:e9:bc)
2017/10/19 08:31:35 [service] subscribe ([2469567783 2086528646])
2017/10/19 08:31:35 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 08:31:47 [service] subscribe ([2469567783 2086528646])
2017/10/19 08:32:05 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 08:32:05 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 08:34:29 [conn] closed (B8FE8A2A)
2017/10/19 08:34:29 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 08:34:47 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 08:35:20 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 09:03:46 [conn] created (B9FE8A2A)
2017/10/19 09:05:54 [conn] closed (B9FE8A2A)
2017/10/19 09:06:21 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:06:35 [conn] created (BAFE8A2A)
2017/10/19 09:07:09 [conn] closed (BAFE8A2A)
2017/10/19 09:07:09 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:09:40 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:09:51 [conn] created (BBFE8A2A)
2017/10/19 09:09:51 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:09:51 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 09:10:17 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:10:20 [conn] closed (BBFE8A2A)
2017/10/19 09:10:20 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:10:20 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:10:25 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 09:10:25 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:10:31 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:10:38 [conn] created (BCFE8A2A)
2017/10/19 09:10:38 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:10:38 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 09:10:47 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:11:08 [conn] closed (BCFE8A2A)
2017/10/19 09:11:08 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:11:10 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 09:11:10 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:11:16 [conn] created (BDFE8A2A)
2017/10/19 09:11:16 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:11:16 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 09:11:17 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:11:50 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 09:11:50 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:23:38 [swarm] peer created (56:00:8b:1e:67:ec)
2017/10/19 09:23:38 [service] subscribe ([0 3939663052])
2017/10/19 09:23:39 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:25:18 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:25:56 [conn] closed (B7FE8A2A)
2017/10/19 09:25:56 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:26:08 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 09:26:40 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 09:27:10 [service] subscribe ([2469567783 2086528646 4128252332])
2017/10/19 09:28:41 [conn] closed (BDFE8A2A)
2017/10/19 09:28:41 [service] unsubscribe ([2469567783 2086528646])
2017/10/19 09:28:50 [conn] created (BEFE8A2A)
2017/10/19 09:28:50 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:28:50 [swarm] peer created (56:1b:6b:07:45:5e)
2017/10/19 09:29:08 [service] subscribe ([2469567783 2086528646])
2017/10/19 09:29:11 [service] unsubscribe ([2469567783 2086528646 4128252332])
2017/10/19 09:29:20 [swarm] peer removed (56:1b:6b:07:45:5e)
2017/10/19 09:29:20 [service] unsubscribe ([2469567783 2086528646])
runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

runtime stack:
runtime.throw(0x8bcf44, 0xe)
D:/Program Files (x86)/go/src/runtime/panic.go:605 +0x95
runtime.newstack(0x0)
D:/Program Files (x86)/go/src/runtime/stack.go:1050 +0x6e1
runtime.morestack()
D:/Program Files (x86)/go/src/runtime/asm_amd64.s:415 +0x86

goroutine 45820 [running]:
runtime.heapBitsSetType(0xc43d93fef0, 0x30, 0x30, 0x894ea0)
D:/Program Files (x86)/go/src/runtime/mbitmap.go:855 +0x625 fp=0xc4461e0338 sp=0xc4461e0330 pc=0x413a65
runtime.mallocgc(0x30, 0x894ea0, 0x7f4d28ef9e01, 0xc4461e04a0)
D:/Program Files (x86)/go/src/runtime/malloc.go:741 +0x546 fp=0xc4461e03e0 sp=0xc4461e0338 pc=0x410b86
runtime.newobject(0x894ea0, 0x8)
D:/Program Files (x86)/go/src/runtime/malloc.go:840 +0x38 fp=0xc4461e0410 sp=0xc4461e03e0 pc=0x411078
runtime.makemap(0x8311c0, 0x1, 0x0, 0x0, 0xc4461e04f0)
D:/Program Files (x86)/go/src/runtime/hashmap.go:321 +0x2ee fp=0xc4461e0470 sp=0xc4461e0410 pc=0x4080ce
github.com/emitter-io/emitter/broker/subscription.toCompressed(0xc43d8fb8e0, 0x60000000000)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:470 +0x6d fp=0xc4461e0528 sp=0xc4461e0470 pc=0x6bbd9d
github.com/emitter-io/emitter/broker/subscription.clean(0xc42000ce28)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:400 +0x45 fp=0xc4461e0560 sp=0xc4461e0528 pc=0x6bb8d5
github.com/emitter-io/emitter/broker/subscription.(*Trie).ilookup(0xc42000c618, 0xc4202f2060, 0xc42000ce28, 0xc4201acd88, 0x1, 0x1, 0xc4461e0808, 0x2)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:351 +0x217 fp=0xc4461e05e0 sp=0xc4461e0560 pc=0x6bb677
github.com/emitter-io/emitter/broker/subscription.(*Trie).bLookup(0xc42000c618, 0xc42000ce28, 0xc42000c608, 0xc43d931140, 0xc4201e00a0, 0xc4201acd84, 0x2, 0x2, 0xc4461e0808, 0x1)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:378 +0x17d fp=0xc4461e0650 sp=0xc4461e05e0 pc=0x6bb83d
github.com/emitter-io/emitter/broker/subscription.(*Trie).ilookup(0xc42000c618, 0xc42000ce28, 0xc42000c608, 0xc4201acd84, 0x2, 0x2, 0xc4461e0808, 0x0)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:338 +0x1d8 fp=0xc4461e06d0 sp=0xc4461e0650 pc=0x6bb638
github.com/emitter-io/emitter/broker/subscription.(*Trie).bLookup(0xc42000c618, 0xc42000c608, 0x0, 0xc4201d60a0, 0xc420181840, 0xc4201acd80, 0x3, 0x3, 0xc4461e0808, 0x4433f7)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:378 +0x17d fp=0xc4461e0740 sp=0xc4461e06d0 pc=0x6bb83d
github.com/emitter-io/emitter/broker/subscription.(*Trie).ilookup(0xc42000c618, 0xc42000c608, 0x0, 0xc4201acd80, 0x3, 0x3, 0xc4461e0808, 0x443300)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:338 +0x1d8 fp=0xc4461e07c0 sp=0xc4461e0740 pc=0x6bb638
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0878)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:318 +0xbd fp=0xc4461e0830 sp=0xc4461e07c0 pc=0x6bb3ad
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e08e8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e08a0 sp=0xc4461e0830 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0958)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0910 sp=0xc4461e08a0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e09c8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0980 sp=0xc4461e0910 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0a38)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e09f0 sp=0xc4461e0980 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0aa8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0a60 sp=0xc4461e09f0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0b18)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0ad0 sp=0xc4461e0a60 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0b88)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0b40 sp=0xc4461e0ad0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0bf8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0bb0 sp=0xc4461e0b40 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0c68)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0c20 sp=0xc4461e0bb0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0cd8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0c90 sp=0xc4461e0c20 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0d48)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0d00 sp=0xc4461e0c90 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0db8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0d70 sp=0xc4461e0d00 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0e28)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0de0 sp=0xc4461e0d70 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0e98)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0e50 sp=0xc4461e0de0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0f08)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0ec0 sp=0xc4461e0e50 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0f78)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0f30 sp=0xc4461e0ec0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e0fe8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e0fa0 sp=0xc4461e0f30 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1058)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1010 sp=0xc4461e0fa0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e10c8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1080 sp=0xc4461e1010 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1138)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e10f0 sp=0xc4461e1080 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e11a8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1160 sp=0xc4461e10f0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1218)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e11d0 sp=0xc4461e1160 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1288)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1240 sp=0xc4461e11d0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e12f8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e12b0 sp=0xc4461e1240 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1368)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1320 sp=0xc4461e12b0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e13d8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1390 sp=0xc4461e1320 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1448)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1400 sp=0xc4461e1390 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e14b8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1470 sp=0xc4461e1400 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1528)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e14e0 sp=0xc4461e1470 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1598)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1550 sp=0xc4461e14e0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1608)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e15c0 sp=0xc4461e1550 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1678)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1630 sp=0xc4461e15c0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e16e8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e16a0 sp=0xc4461e1630 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1758)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1710 sp=0xc4461e16a0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e17c8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1780 sp=0xc4461e1710 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1838)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e17f0 sp=0xc4461e1780 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e18a8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1860 sp=0xc4461e17f0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1918)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e18d0 sp=0xc4461e1860 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1988)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1940 sp=0xc4461e18d0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e19f8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e19b0 sp=0xc4461e1940 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1a68)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1a20 sp=0xc4461e19b0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1ad8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1a90 sp=0xc4461e1a20 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1b48)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1b00 sp=0xc4461e1a90 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1bb8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1b70 sp=0xc4461e1b00 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1c28)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1be0 sp=0xc4461e1b70 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1c98)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1c50 sp=0xc4461e1be0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1d08)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1cc0 sp=0xc4461e1c50 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1d78)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1d30 sp=0xc4461e1cc0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1de8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1da0 sp=0xc4461e1d30 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1e58)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1e10 sp=0xc4461e1da0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1ec8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1e80 sp=0xc4461e1e10 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1f38)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1ef0 sp=0xc4461e1e80 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e1fa8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1f60 sp=0xc4461e1ef0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2018)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e1fd0 sp=0xc4461e1f60 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2088)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2040 sp=0xc4461e1fd0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e20f8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e20b0 sp=0xc4461e2040 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2168)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2120 sp=0xc4461e20b0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e21d8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2190 sp=0xc4461e2120 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2248)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2200 sp=0xc4461e2190 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e22b8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2270 sp=0xc4461e2200 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2328)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e22e0 sp=0xc4461e2270 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2398)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2350 sp=0xc4461e22e0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2408)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e23c0 sp=0xc4461e2350 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2478)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2430 sp=0xc4461e23c0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e24e8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e24a0 sp=0xc4461e2430 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2558)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2510 sp=0xc4461e24a0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e25c8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2580 sp=0xc4461e2510 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2638)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e25f0 sp=0xc4461e2580 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e26a8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2660 sp=0xc4461e25f0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2718)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e26d0 sp=0xc4461e2660 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2788)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2740 sp=0xc4461e26d0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e27f8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e27b0 sp=0xc4461e2740 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2868)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2820 sp=0xc4461e27b0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e28d8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2890 sp=0xc4461e2820 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2948)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2900 sp=0xc4461e2890 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e29b8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2970 sp=0xc4461e2900 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2a28)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e29e0 sp=0xc4461e2970 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2a98)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2a50 sp=0xc4461e29e0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2b08)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2ac0 sp=0xc4461e2a50 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2b78)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2b30 sp=0xc4461e2ac0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2be8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2ba0 sp=0xc4461e2b30 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2c58)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2c10 sp=0xc4461e2ba0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2cc8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2c80 sp=0xc4461e2c10 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2d38)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2cf0 sp=0xc4461e2c80 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2da8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2d60 sp=0xc4461e2cf0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2e18)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2dd0 sp=0xc4461e2d60 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2e88)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2e40 sp=0xc4461e2dd0 pc=0x6bb419
github.com/emitter-io/emitter/broker/subscription.(*Trie).Lookup(0xc42000c618, 0xc4201acd80, 0x3, 0x3, 0x3, 0x3, 0xc4461e2ef8)
D:/gopath/src/github.com/emitter-io/emitter/broker/subscription/subtrie.go:322 +0x129 fp=0xc4461e2eb0 sp=0xc4461e2e40 pc=0x6bb419
...additional frames elided...
created by github.com/emitter-io/emitter/broker.(*Service).onAcceptConn
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:260 +0x61

goroutine 1 [select (no cases), 762 minutes]:
github.com/emitter-io/emitter/broker.(*Service).Listen(0xc4200672c0, 0x0, 0x0)
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:190 +0x4bb
main.main()
D:/gopath/src/github.com/emitter-io/emitter/main.go:54 +0x295

goroutine 27 [chan receive, 762 minutes]:
github.com/emitter-io/emitter/network/listener.muxListener.Accept(...)
D:/gopath/src/github.com/emitter-io/emitter/network/listener/listener.go:242
github.com/emitter-io/emitter/network/listener.(*muxListener).Accept(0xc4200bfc40, 0xaf5f70, 0xc4200bfc40, 0x0, 0x0)
:1 +0x65
github.com/emitter-io/emitter/vendor/github.com/kelindar/tcp.(*Server).Serve(0xc4200bf560, 0xaf5f40, 0xc4200bfc40, 0x0, 0x0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/kelindar/tcp/server.go:44 +0x7c
github.com/emitter-io/emitter/vendor/github.com/kelindar/tcp.(*Server).Serve-fm(0xaf5f40, 0xc4200bfc40, 0xaf5f40, 0xc4200bfc40)
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:203 +0x3e
created by github.com/emitter-io/emitter/network/listener.(*Listener).ServeAsync
D:/gopath/src/github.com/emitter-io/emitter/network/listener/listener.go:125 +0x99

goroutine 17 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*localPeer).actorLoop(0xc420135080, 0xc42004ad80)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/local_peer.go:141 +0xf5
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newLocalPeer
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/local_peer.go:31 +0x125

goroutine 16 [syscall, 762 minutes]:
os/signal.signal_recv(0x0)
D:/Program Files (x86)/go/src/runtime/sigqueue.go:131 +0xa6
os/signal.loop()
D:/Program Files (x86)/go/src/os/signal/signal_unix.go:22 +0x22
created by os/signal.init.0
D:/Program Files (x86)/go/src/os/signal/signal_unix.go:28 +0x41

goroutine 18 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*routes).run(0xc4200d5000, 0xc42004af00, 0xc420054900, 0xc420054960)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/routes.go:177 +0x11f
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newRoutes
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/routes.go:44 +0x3ff

goroutine 26 [chan receive]:
github.com/emitter-io/emitter/network/listener.muxListener.Accept(...)
D:/gopath/src/github.com/emitter-io/emitter/network/listener/listener.go:242
github.com/emitter-io/emitter/network/listener.(*muxListener).Accept(0xc4200bfc20, 0x8d62f0, 0xc420066aa0, 0xaf6780, 0xc420135e90)
:1 +0x65
net/http.(*Server).Serve(0xc42010b5f0, 0xaf5f40, 0xc4200bfc20, 0x0, 0x0)
D:/Program Files (x86)/go/src/net/http/server.go:2695 +0x1b2
net/http.(*Server).Serve-fm(0xaf5f40, 0xc4200bfc20, 0xaf5f40, 0xc4200bfc20)
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:202 +0x3e
created by github.com/emitter-io/emitter/network/listener.(*Listener).ServeAsync
D:/gopath/src/github.com/emitter-io/emitter/network/listener/listener.go:125 +0x99

goroutine 19 [select, 5 minutes]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*connectionMaker).queryLoop(0xc4200f8700, 0xc42004af60)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection_maker.go:226 +0x122
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newConnectionMaker
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection_maker.go:75 +0x1f9

goroutine 20 [select]:
github.com/emitter-io/emitter/vendor/github.com/karlseguin/ccache.(*Cache).worker(0xc42005cdc0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/karlseguin/ccache/cache.go:159 +0x149
created by github.com/emitter-io/emitter/vendor/github.com/karlseguin/ccache.(*Cache).restart
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/karlseguin/ccache/cache.go:128 +0xec

goroutine 21 [select, 762 minutes, locked to thread]:
runtime.gopark(0x8d6910, 0x0, 0x8b859b, 0x6, 0x18, 0x1)
D:/Program Files (x86)/go/src/runtime/proc.go:277 +0x12c
runtime.selectgo(0xc420045f50, 0xc420054a80)
D:/Program Files (x86)/go/src/runtime/select.go:395 +0x1138
runtime.ensureSigM.func1()
D:/Program Files (x86)/go/src/runtime/signal_unix.go:511 +0x220
runtime.goexit()
D:/Program Files (x86)/go/src/runtime/asm_amd64.s:2337 +0x1

goroutine 22 [chan receive, 762 minutes]:
github.com/emitter-io/emitter/broker.(*Service).hookSignals.func1(0xc42004b080, 0xc4200672c0)
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:376 +0x81
created by github.com/emitter-io/emitter/broker.(*Service).hookSignals
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:375 +0xe2

goroutine 23 [select]:
github.com/emitter-io/emitter/broker.(*Service).notifyPresenceChange.func1(0xc4200672c0)
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:217 +0x14c
created by github.com/emitter-io/emitter/broker.(*Service).notifyPresenceChange
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:214 +0x3f

goroutine 24 [select]:
github.com/emitter-io/emitter/utils.Repeat.func1(0xc420054840, 0xc42013e300, 0xc4201425d0)
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:12 +0xed
created by github.com/emitter-io/emitter/utils.Repeat
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:10 +0x66

goroutine 25 [IO wait, 6 minutes]:
internal/poll.runtime_pollWait(0x7f4d2a07df70, 0x72, 0xffffffffffffffff)
D:/Program Files (x86)/go/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4200d5198, 0x72, 0xc420041d00, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc4200d5198, 0xffffffffffffff00, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Accept(0xc4200d5180, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_unix.go:334 +0x1e2
net.(*netFD).accept(0xc4200d5180, 0x75e686, 0x17d78400, 0xed179f590)
D:/Program Files (x86)/go/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc42000c648, 0xed179f590, 0xb32080, 0x11e1a300)
D:/Program Files (x86)/go/src/net/tcpsock_posix.go:136 +0x2e
net.(*TCPListener).AcceptTCP(0xc42000c648, 0xc42000dd98, 0x0, 0x0)
D:/Program Files (x86)/go/src/net/tcpsock.go:234 +0x49
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*Router).listenTCP.func1(0xc42000c648, 0xc420148000)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/router.go:113 +0x59
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*Router).listenTCP
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/router.go:110 +0x15e

goroutine 28 [IO wait]:
internal/poll.runtime_pollWait(0x7f4d2a07deb0, 0x72, 0xffffffffffffffff)
D:/Program Files (x86)/go/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4200d5218, 0x72, 0xc42015e500, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc4200d5218, 0xffffffffffffff00, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Accept(0xc4200d5200, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_unix.go:334 +0x1e2
net.(*netFD).accept(0xc4200d5200, 0xc4202f2538, 0x0, 0x0)
D:/Program Files (x86)/go/src/net/fd_unix.go:238 +0x42
net.(*TCPListener).accept(0xc42000c668, 0x7a151a, 0x458f10, 0xc42015e760)
D:/Program Files (x86)/go/src/net/tcpsock_posix.go:136 +0x2e
net.(*TCPListener).Accept(0xc42000c668, 0x8d5d60, 0xc42005ce10, 0xaf9360, 0xc4202f2538)
D:/Program Files (x86)/go/src/net/tcpsock.go:247 +0x49
github.com/emitter-io/emitter/network/listener.(*Listener).Serve(0xc42005ce10, 0x0, 0x0)
D:/gopath/src/github.com/emitter-io/emitter/network/listener/listener.go:162 +0x95
created by github.com/emitter-io/emitter/broker.(*Service).listen
D:/gopath/src/github.com/emitter-io/emitter/broker/service.go:204 +0x20e

goroutine 29 [select]:
github.com/emitter-io/emitter/utils.Repeat.func1(0xc420054840, 0xc42013e380, 0xc420142760)
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:12 +0xed
created by github.com/emitter-io/emitter/utils.Repeat
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:10 +0x66

goroutine 42339 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*gossipSender).run(0xc420244c80, 0xc4200541e0, 0xc420054540, 0xc4200545a0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:101 +0x11b
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newGossipSender
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:94 +0x172

goroutine 42340 [IO wait]:
internal/poll.runtime_pollWait(0x7f4d2a07ddf0, 0x72, 0x0)
D:/Program Files (x86)/go/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4200d4018, 0x72, 0xffffffffffffff00, 0xaf26c0, 0xaee398)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc4200d4018, 0xc420450700, 0x4, 0x4)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Read(0xc4200d4000, 0xc420450768, 0x4, 0x4, 0x0, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_unix.go:125 +0x18a
net.(*netFD).Read(0xc4200d4000, 0xc420450768, 0x4, 0x4, 0xc42002c380, 0x456ad0, 0xc42002c380)
D:/Program Files (x86)/go/src/net/fd_unix.go:202 +0x52
net.(*conn).Read(0xc42000d618, 0xc420450768, 0x4, 0x4, 0x0, 0x0, 0x0)
D:/Program Files (x86)/go/src/net/net.go:176 +0x6d
io.ReadAtLeast(0x7f4d2a082698, 0xc42000d618, 0xc420450768, 0x4, 0x4, 0x4, 0x80c4e0, 0xdf8475501, 0xc420450768)
D:/Program Files (x86)/go/src/io/io.go:309 +0x86
io.ReadFull(0x7f4d2a082698, 0xc42000d618, 0xc420450768, 0x4, 0x4, 0x4, 0xbe721dea7a565e6e, 0x29aabc61ea97)
D:/Program Files (x86)/go/src/io/io.go:327 +0x58
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*lengthPrefixTCPReceiver).Receive(0xc42000ea90, 0xc429f4ff38, 0x3c, 0xc429f4ff70, 0x748c38, 0xc42000d618)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/protocol_crypto.go:168 +0x96
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*encryptedTCPReceiver).Receive(0xc4201e1a00, 0x0, 0x0, 0x5d3, 0x5d3, 0x0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/protocol_crypto.go:193 +0x37
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).receiveTCP(0xc4203c4210, 0xaf0400, 0xc4201e1a00)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:434 +0x56
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).run
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:259 +0x6fc

goroutine 42338 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*gossipSender).run(0xc420244c30, 0xc4200541e0, 0xc420054480, 0xc4200544e0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:101 +0x11b
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newGossipSender
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:94 +0x172

goroutine 42347 [select]:
github.com/emitter-io/emitter/utils.Repeat.func1(0xc420054c60, 0xc4201d4180, 0xc420143020)
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:12 +0xed
created by github.com/emitter-io/emitter/utils.Repeat
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:10 +0x66

goroutine 42334 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).actorLoop(0xc4203c4210, 0xc4203ab0e0, 0xc4203ab140, 0xaf0400, 0xc4201e1a00)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:366 +0x35e
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).run(0xc4203c4210, 0xc4203ab0e0, 0xc4203ab140, 0xc4200541e0, 0x1)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:268 +0x727
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.startLocalConnection
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:102 +0x2ff

goroutine 45496 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).actorLoop(0xc4202c9340, 0xc4202c7f80, 0xc4204d0000, 0xaf0400, 0xc420373400)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:366 +0x35e
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).run(0xc4202c9340, 0xc4202c7f80, 0xc4204d0000, 0xc420054660, 0x1)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:268 +0x727
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.startLocalConnection
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:102 +0x2ff

goroutine 45500 [select, 1 minutes]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*gossipSender).run(0xc4201a9590, 0xc420054660, 0xc420054c00, 0xc420054cc0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:101 +0x11b
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newGossipSender
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:94 +0x172

goroutine 45501 [select]:
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*gossipSender).run(0xc4201a95e0, 0xc420054660, 0xc420054d20, 0xc420054d80)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:101 +0x11b
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.newGossipSender
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/gossip.go:94 +0x172

goroutine 45502 [IO wait]:
internal/poll.runtime_pollWait(0x7f4d2a07dbb0, 0x72, 0x0)
D:/Program Files (x86)/go/src/runtime/netpoll.go:173 +0x57
internal/poll.(*pollDesc).wait(0xc4200d4598, 0x72, 0xffffffffffffff00, 0xaf26c0, 0xaee398)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:85 +0xae
internal/poll.(*pollDesc).waitRead(0xc4200d4598, 0xc4201ac500, 0x4, 0x4)
D:/Program Files (x86)/go/src/internal/poll/fd_poll_runtime.go:90 +0x3d
internal/poll.(*FD).Read(0xc4200d4580, 0xc4201ac52c, 0x4, 0x4, 0x0, 0x0, 0x0)
D:/Program Files (x86)/go/src/internal/poll/fd_unix.go:125 +0x18a
net.(*netFD).Read(0xc4200d4580, 0xc4201ac52c, 0x4, 0x4, 0xb, 0x1837cce, 0xc4200d5800)
D:/Program Files (x86)/go/src/net/fd_unix.go:202 +0x52
net.(*conn).Read(0xc42000dd98, 0xc4201ac52c, 0x4, 0x4, 0x0, 0x0, 0x0)
D:/Program Files (x86)/go/src/net/net.go:176 +0x6d
io.ReadAtLeast(0x7f4d2a082698, 0xc42000dd98, 0xc4201ac52c, 0x4, 0x4, 0x4, 0x80c4e0, 0xdf8471d01, 0xc4201ac52c)
D:/Program Files (x86)/go/src/io/io.go:309 +0x86
io.ReadFull(0x7f4d2a082698, 0xc42000dd98, 0xc4201ac52c, 0x4, 0x4, 0x4, 0xbe721de8f16cdc21, 0x29a94dd7ac5a)
D:/Program Files (x86)/go/src/io/io.go:327 +0x58
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*lengthPrefixTCPReceiver).Receive(0xc420143b80, 0xc4204d9f38, 0x3c, 0xc4204d9f70, 0x748c38, 0xc42000dd98)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/protocol_crypto.go:168 +0x96
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*encryptedTCPReceiver).Receive(0xc420373400, 0x0, 0x0, 0x53, 0x53, 0x0)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/protocol_crypto.go:193 +0x37
github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).receiveTCP(0xc4202c9340, 0xaf0400, 0xc420373400)
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:434 +0x56
created by github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh.(*LocalConnection).run
D:/gopath/src/github.com/emitter-io/emitter/vendor/github.com/weaveworks/mesh/connection.go:259 +0x6fc

goroutine 45503 [runnable]:
github.com/emitter-io/emitter/utils.Repeat.func1(0xc420054300, 0xc42013ec00, 0xc4201d6640)
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:12 +0xed
created by github.com/emitter-io/emitter/utils.Repeat
D:/gopath/src/github.com/emitter-io/emitter/utils/timer.go:10 +0x66

schedule a message ?

hello
can i schedule a message to be developed at specific time in the future ?

regards

Roadmap

I love the project - I considered using it in one of our project, but we ended up going with Kafka instead.
The main obstacle in adopting this in a serious LoB application is understanding for where you are headed, and what are your plans for the project.
That is also quite vital when it comes to contributing to the project - can't work on anything beyond simple bug fixes.

@kelindar mentioned that you guys are planning to rebuild emitter in Golang, it would be good to understand what that might look like, will that replace or be supported side by side with c#, etc..

Channel specific authorization proposal

I don't know the state of the project or if there is any interest for it.
I'm mostly just throwing ideas your way :P
It currently uses the "mqtt style channels", but It would work the same way with the current channel parser.

I made a proof of concept to validate the idea.


Channel specific authorization proposal

Current behavior

The key authorisation is based only on the root of the channel.
For example, we can only limit a key to a/#/, we cannot limit a key to a specific sub-channel like: a/b/#/

Solution

The key has 24 bytes total.
Bytes 12 to 15 are used to store permission flags.
Bytes 16 to 19 are use to store the "target" hash.

Those are the bytes we will use.

I suggest we take 3 bytes that are currently used to store "permissions" and use them for the new authorization proposal.
The permissions have 4 bytes allocated to them. There is currently 5 permissions (read/write/store/load/presence) which means we only need 5 bits to store this information.

To simplify things a little, I will make my examples with only 1 byte.

I would allocate one bit to describe if the key is good for all sub-channels, or not.
And the rest of the bits to describe "exact-match" vs "wildcard" per channel level.

match ends-with /#/ - - - - - - -
a/b/c/ 0 1 1 1 0 0 0 0
a/b/c/#/ 1 1 1 1 0 0 0 0
a/+/c/ 0 1 0 1 0 0 0 0
a/+/c/#/ 1 1 0 1 0 0 0 0

With 3 bytes we can have authorization for up to 23 levels channels.

Concrete examples

Example 1

We have a key that has read permission to a/+/c/#/.
The key contains the hash for a/+/c/ (bytes 16 - 19) and the following authorization byte 11010000.

A user wants to subscribe to the following channel a/b/c/d/e/ using this key.

The server takes the key.
It finds the maximum depth (last 1 inside the auth byte). It finds 3.
The first bit is 1, we authorize all sub channels. We strip all sub channels greater than 3 (depth).
We now have a/b/c/
We replace sub-channels with + if the corresponding bit is 0.
We now have a/+/c/
We now compare what we have with the hash contained by the key.
User is authorized to access this channel.

Example 2

We have a key that has read permission to a/+/c/.
The key contains the hash for a/+/c/ (bytes 16 - 19) and the following authorization byte 01010000.

A user wants to subscribe to the following channel a/b/c/d/e/ using this key.

The server takes the key.
It finds the maximum depth (last 1 inside the auth byte). It finds 3.
The first bit is 0, we do not authorize all sub channels.
The requested channel depth (5) is greater then 3.
The user is denied access.

Go! Broker timeout disconnection.

Hi.

As per my Blog entry (ID pauldy1000, 21 November 2017) and response from Roman I am enclosing the situation and some source code. I am using the Go! version of the Broker.

My use case is to have a Subscriber connected to the Broker for the length of time I choose.

For example, I want a Subscriber in the UK to be ready to receive messages from a Publisher in the USA at any time the USA Publisher chooses to publish messages. If the UK Subscriber connection times out after 1 minute of inactivity, how can I detect that the Publisher in the USA has published a message destined for the UK Subscriber if the USA Publisher does not come on-line for 3 hours?

Emitter.Connection emitterMagnetLocal = new Emitter.Connection(magnetLocalIPAddress, magnetLocalPort, "myserverkeygoeshere");
emitterMagnetLocal.On(cChannelKeyCommander, channel, (channel, msg) =>
{
   // Message received, go handle it.
   HandleInboundMessage(channel.TrimEnd(new char[] { '/' }), msg);
});
// Wire up the Disconnect event.
emitterMagnetLocal.Disconnected += EmitterMagnetLocal_Disconnected;
// Connect to Magnet.Local emitter.
ConnectToMagnetLocal();  // This is a class member method which connects to the Broker.

When the Broker forcibly disconnects the Subscriber (as above) the Disconnected event handles it:

private void EmitterMagnetLocal_Disconnected(object sender, EventArgs e)
{
   Logging.LogIt(cCodeName + ": Magnet.Local: Disconnected(): Waiting for five second before trying to reconnect.");

   // Wait for five seconds.
   Thread.Sleep(5000);

   Logging.LogIt(cCodeName + ": Magnet.Local: Disconnected(): Trying to reconnect again now.");

   // Try to connect to the magnet local service again.
   ConnectToMagnetLocal();     // This is a class member method which connects to the Broker.
}

I have had to architect the "wait 5 seconds then reconnect" due to the forced disconnection by the Broker. I would much prefer to be able to declare how long I would like to keep the Subscriber connected - even if this is "never disconnect".

I hope this is useful.

Regards,

Paul.

How would you make secure private messages with channels and current access key?

Hey developers.

I've been looking into the documentation on Emitter and I have been wondering how it could solve my usecase. Since I am not quite certain about how the channel filtering and key works I would like some advice.

I would like to use it as the broadcaster to my users, but also be able to let specific users send message to each other through a channel privately.
How would you then achieve private messaging? Basically the setup would be that a user writes a message that gets passed to NodeJS that will then act as a client, then connect to emitter and broadcast it to another user that's listening on emitter.

But how would it be secure enough so the sender and the reciever won't have other people tapping in on the line? Is there a way to dynamically make a key relationship? Or how would this be achieved if it's even possible to do such specific things?

Kind Regards.

Unique Devices in Metering

We'd need to add the number of unique devices per contract for the metering. Ideally this should be done without the storing the entire set as only the cardinality is required. This should be possible by using HyperLogLog structure and merging it on the receiver's end.

Add rate-limiting per contract

We'd need to add a simple leaking bucket rate-limiting on a per-contract level. This would help to control the spiky load and refuse incoming publish requests if the rate is exceeded. We should be also able in the contract provider to adjust the rate, so this could be change don the backend)

Getting Error when "go get"ing Emitter

On Mac 10.12.6:

> rm -Rf ~/go
> go version
go version go1.9 darwin/amd64
> go get github.com/emitter-io/emitter && emitter
# github.com/emitter-io/emitter
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not allowed in code signed PIE, but used in type..eqfunc.[106]string from /var/folders/gb/bn5tvy2s2vqcf6hxs9qz17tm0000gn/T/go-link-417292192/go.o. To fix this warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
-bash: emitter: command not found
> 

What are the supported platforms for this new pivot of the implementation? What versions of Go?

Emitter keeps crashing

Hello,

I installed emitter via docker and running docker run -d -p 8080:8080 emitter/server, I noticed the server keeps crashing.

BR
Quaye Samson

Unable to access Keygen page

I saw some code in broker/service.go

280 // Occurs when a new HTTP request is received.
281 func (s *Service) onHTTPKeyGen(w http.ResponseWriter, r *http.Request) {
282 if resp, err := http.Get("http://s3-eu-west-1.amazonaws.com/cdn.emitter.io/web/keygen.html"); err == nil {
283 if content, err := ioutil.ReadAll(resp.Body); err == nil {
284 w.Write(content)
285 return
286 }
287 }
288 }

in china, aws cloud is not stable and often be blocked by China goverment .

so, Where I can find the source code of "keyGen" ?

or, you won't open source the "keyGen" ?

Recovering secret key?

Is there any way to recover your secret key, after first time it is displayed in your console or do I actually have to rerun emitter and generate new keys and just be fast to grab them?

It is mostly because I am having a problem with the docker container version, where it keeps restarting.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.