Giter Site home page Giter Site 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 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

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)

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.

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

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]
}

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.

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.

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

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
```

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" ?

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

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

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!

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.

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 ?

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

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.

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?

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)

.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.

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 :)

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...

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.

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.conf documentation

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

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.

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.

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.

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.

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 :)

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.

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

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]

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.

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

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.

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.

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/

schedule a message ?

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

regards

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.