Uniqush is a free and open source software system which provides a unified push service for server side notification to apps on mobile devices.

Overview

Introduction

Uniqush (\ˈyü-nə-ku̇sh\ "uni" pronounced as in "unified", and "qush" pronounced as in "cushion") is a free and open source software system which provides a unified push service for server side notification to apps on mobile devices. The uniqush-push API abstracts the APIs of the various push services used to send push notifications to those devices. By running uniqush-push on the server side, you can send push notifications to any supported mobile platform.

Build Status

Supported Platforms

  • GCM from Google for the Android platform
  • FCM from Google for the Android platform
  • APNS from Apple for the iOS platform
  • ADM from Amazon for Kindle tablets

FAQ

  • Q: Is this a general push notification platform for all types of devices? How does this differ from services such as Urban Airship?

  • A: Urban Airship is a great service, and there are other similar services available, like OpenPush, Notificare, etc. All of them are wonderful services. However, Uniqush is different from them. Uniqush is not a service. Instead, Uniqush is a system, which runs on your own server. In fact, if you wish, you can use Uniqush to set up a service similar to Urban Airship.

  • Q: OK. Then is it a library? Like java-apns?

  • A: Well.. Not actually. I mean, it is a program, like Apache HTTP Server. You download it, you run it. It does require a Redis server, but, other than that, you don't need to worry about which language to use, package dependencies, etc.

  • Q: But wait, how can I use it anyway? I mean, if my program wants to send a push notification, I need to tell Uniqush about this action. How can I communicate with Uniqush? There must be some library so that I can use it in my program to talk with Uniqush, right?

  • A: We are trying to make it easier. uniqush-push provides RESTful APIs. In other words, you talk with uniqush-push through HTTP protocol. As long as there's an HTTP client library for your language, you can use it and talk with uniqush-push. For details about our RESTful APIs, see our API documentation.

  • Q: Then that's cool. But I noticed that you are using Go programming language. Do I need to install Go compiler and other stuff to run uniqush-push?

  • A: No. There are no installation dependencies. All you need to do is to download the binary file from the download page and install it. But you do need to set up a Redis server running somewhere, preferably with persistence, so that uniqush-push can store the user data in Redis. For more details, see the installation guide

  • Q: This is nice. I want to give it a try. But you are keep talking about uniqush-push, and I'm talking about Uniqush, are they the same thing?

  • A: Thank you for your support! Uniqush is intended to be the name of a system which provides a full stack solution for communication between mobile devices and the app's server. uniqush-push is one piece of the system. However, right now, uniqush-push is the only piece and others are under active development. If you want to know more details about the Uniqush system's plan, you can read the blog post. If you want to find out about the latest progress with Uniqush, please check out our blog. And, if you are really impatient, there's always our our GitHub account which could have brand-new stuff that hasn't been released yet.

Setting Up Redis

Redis persistence describes the details of how Redis saves data on shutdown, as well as how one might back up that data. Make sure that the Redis server you use has persistence enabled - your redis.conf should have contents similar to the section **PERSISTENCE** of redis.conf in the example config files linked in http://redis.io/topics/config

Contributing

You're encouraged to contribute to the uniqush-push project. There are two ways you can contribute.

Issues

If you encounter an issue while using uniqush-push, please report it at the project's issues tracker. Feature suggestions are also welcome.

Pull request

Code contributions to uniqush-push can be made using pull requests. To submit a pull request:

  1. Fork this project.
  2. Make and commit your changes.
  3. Submit your changes as a pull request.

Related Links

Comments
  • Using asterisk to send to all takes too long to prepare

    Using asterisk to send to all takes too long to prepare

    Hi,

    We got a pretty huge number of users and we try to send the * to send to all. Unfortunately doing an http requests will timeout the client because the server will try to prepare its stuff.

    I like how the gcm push works because its so fast. Except for APNS which is so slow.

    enhancement 
    opened by cmabastar 15
  • Uniqush doesn't handle invalid payload received by apns server

    Uniqush doesn't handle invalid payload received by apns server

    GCM is ok but apns has restrictions of maximum payload of 256 bytes. This happens when the user sends a huge message or simply messages that are utf8-encoded. Uniqush should complain about this issue.

    Uniqush will be OOM killed by the kernel if handling this 'invalid payload'. We tested this with concurrent connections sending messages via celery. We had 8 workers and with 4 concurrency running each worker. When trying to send an invalid payload size, uniqush will crash and killed by the kernel.

    bug 
    opened by cmabastar 14
  • Uniqush having problems with concurrency

    Uniqush having problems with concurrency

    Hi @monnand our uniqush seems to be failing at some point. Probably because of the load we give to it. Before, we had load balancer between two uniqush servers and it seems ok. Our setup today was just having only 1 servers and having multiple workers requesting to push. The following is the log error: ( Sorry if its too long)

    goroutine 4510 [select]: net/http.(_persistConn).writeLoop(0xc201b72680) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4883 [IO wait]: net.runtime_pollWait(0x7f305c2805a0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc201d847d0, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc201d84750, 0xc201650000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc200399b00, 0xc201650000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2013b13f0, 0xc2000fd690, 0xc200399b00, 0x5, 0xc200399b00, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0e280, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0e280, 0xc2016ed000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc2008bfc00) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc2008bfc00, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc201e4dc00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 5114 [semacquire]: sync.runtime_Semacquire(0xc2025ff7e8) /home/monnand/soft/golang/go/src/pkg/runtime/zsema_linux_amd64.c:165 +0x2e sync.(_WaitGroup).Wait(0xc202310e20) /home/monnand/soft/golang/go/src/pkg/sync/waitgroup.go:109 +0xf2 main.(_PushBackEnd).pushImpl(0xc2000fa440, 0xc20231a060, 0x24, 0xc202315407, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:269 +0x497 main.(_PushBackEnd).Push(0xc2000fa440, 0xc20231a060, 0x24, 0xc202315407, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:199 +0xd7 main.(_RestAPI).pushNotification(0xc2000fea50, 0xc20231a060, 0x24, 0xc202317780, 0xc2023177c0, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/restapi.go:242 +0x9ef main.(_RestAPI).ServeHTTP(0xc2000fea50, 0xc2000fa9c0, 0xc2023147e0, 0xc2023190d0) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/restapi.go:338 +0xc52 net/http.(_ServeMux).ServeHTTP(0xc2000b7540, 0xc2000fa9c0, 0xc2023147e0, 0xc2023190d0) /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1416 +0x11d net/http.serverHandler.ServeHTTP(0xc2000feaa0, 0xc2000fa9c0, 0xc2023147e0, 0xc2023190d0) /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1517 +0x16c net/http.(_conn).serve(0xc20202b870) /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1096 +0x765 created by net/http.(_Server).Serve /home/monnand/soft/golang/go/src/pkg/net/http/server.go:1564 +0x266

    goroutine 4689 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ca0a80, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5005 [IO wait]: net.runtime_pollWait(0x7f305c2d10a0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc2017c0350, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc2017c02d0, 0xc201a82000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc2001ec880, 0xc201a82000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc20191dcc0, 0xc2000fd690, 0xc2001ec880, 0x5, 0xc2001ec880, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201061500, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201061500, 0xc20168e000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc2012c6de0) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc2012c6de0, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc20041f500) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4905 [IO wait]: net.runtime_pollWait(0x7f305c22f1e0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc20125d620, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc20125d5a0, 0xc2013a2000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc20031add0, 0xc2013a2000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2003e5630, 0xc2000fd690, 0xc20031add0, 0x5, 0xc20031add0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0ea00, 0x17, 0x0, 0x41efd0) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0ea00, 0xc201a11000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc200943de0) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc200943de0, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc2005d1b80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4624 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc2019164e0, 0xc2019e0000, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4622 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2014e4540, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4660 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201a70a80, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4768 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201928c30, 0xc201b684b0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4759 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc20190fc40, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4766 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201d74f50, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4864 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc200578b10, 0xc200268460, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4796 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201bdd3f0, 0xc201a464b0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4794 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201c49b60, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4862 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc200e7f150, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4920 [IO wait]: net.runtime_pollWait(0x7f305c22f000, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc20125d860, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read[Push][Info] 2013/07/25 11:44:17 RequestId=ca04e629-aa9e-44b6-62e0-18aacd554e86 From=54.215.171.37:13298 Service=7883932819531353 Subscribers="[518a9dc63dc9e1468444bbdb]" [Push][Info] 2013/07/25 11:44:17 RequestId=4123f2da-7663-4454-5450-89129c595896 From=54.215.167.223:46202 Service=7883932819531353 Subscribers="[5180a8293dc9e107b1533f2a]" [Push][Info] 2013/07/25 11:44:17 RequestId=34b80aba-1fe5-47e6-4d08-10ace9e192a8 From=54.215.171.37:13300 Service=7883932819531353 Subscribers="[518deb683dc9e12c476d41f6]" (0xc20125d7e0, 0xc201062000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc2000002f8, 0xc201062000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2003e5c90, 0xc2000fd690, 0xc2000002f8, 0x5, 0xc2000002f8, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201061000, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201061000, 0xc201a35000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc201d5c9c0) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc201d5c9c0, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc2005d1d00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 5103 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201cc73c0, 0xc2017cca50, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4921 [select]: net/http.(_persistConn).writeLoop(0xc2005d1d00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4909 [IO wait]: net.runtime_pollWait(0x7f305c22f140, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc20125d6b0, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc20125d630, 0xc2015c9000, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc20031ae58, 0xc2015c9000, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc201696ba0, 0xc2000fd690, 0xc20031ae58, 0x5, 0xc20031ae58, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0ec80, 0x17, 0x0, 0x41efd0) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0ec80, 0xc201e4e000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc20195b540) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc20195b540, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc2005d1c80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4910 [select]: net/http.(_persistConn).writeLoop(0xc2005d1c80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4959 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2017098c0, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5293 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc203e792d0, 0xc203e74370, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5096 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201cc71e0, 0xc2017cc960, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4881 [IO wait]: net.runtime_pollWait(0x7f305c22fbe0, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc201d84860, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc201d847e0, 0xc2018c7400, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc200399aa0, 0xc2018c7400, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc2013b1120, 0xc2000fd690, 0xc200399aa0, 0x5, 0xc200399aa0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201d0e000, 0x17, 0x0, 0x41efd0) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201d0e000, 0xc2018e7000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc2008bf360) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc2008bf360, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc201e4db00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4882 [select]: net/http.(_persistConn).writeLoop(0xc201e4db00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4884 [select]: net/http.(_persistConn).writeLoop(0xc201e4dc00) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 5039 [select]: net/http.(_persistConn).writeLoop(0xc201cd2d80) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 4972 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201656390, 0xc2012c5050, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4970 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc20155c310, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4946 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc20191d0c0, 0xc201bb0b90, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 4944 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201a348c0, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5249 [select]: net/http.(_persistConn).writeLoop(0xc203816580) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 5277 [chan receive]: main.(_PushBackEnd).collectResult(0xc2000fa440, 0xc203e00780, 0x24, 0xc203e1f097, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:161 +0x51 main.func·003() /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:259 +0x79 created by main.(_PushBackEnd).pushImpl /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:261 +0xbc6

    goroutine 5162 [semacquire]: sync.runtime_Semacquire(0xc2000fd314) /home/monnand/soft/golang/go/src/pkg/runtime/zsema_linux_amd64.c:165 +0x2e sync.(_Mutex).Lock(0xc2000fd310) /home/monnand/soft/golang/go/src/pkg/sync/mutex.go:66 +0xbb sync.(_RWMutex).Lock(0xc2000fd310) /home/monnand/soft/golang/go/src/pkg/sync/rwmutex.go:78 +0x25 github.com/uniqush/uniqush-push/db.(_pushDatabaseOpts).RemoveDeliveryPointFromService(0xc2000fd300, 0xc202937c40, 0x10, 0xc2029374e0, 0x18, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/db/pushdb.go:197 +0x102 main.(_PushBackEnd).Unsubscribe(0xc2000fa440, 0xc202937c40, 0x10, 0xc2029374e0, 0x18, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:77 +0x65 main.(_PushBackEnd).fixError(0xc2000fa440, 0xc20290ad50, 0x24, 0xc2003960c0, 0xc20352a6f0, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:148 +0x101d main.(_PushBackEnd).collectResult(0xc2000fa440, 0xc20290ad50, 0x24, 0xc20291d147, 0x10, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:174 +0x560 main.func·003() /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:259 +0x79 created by main.(*PushBackEnd).pushImpl /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/pushbackend.go:261 +0xbc6

    goroutine 5072 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201d36a80, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 4983 [IO wait]: net.runtime_pollWait(0x7f305c280c80, 0x72, 0x0) /home/monnand/soft/golang/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82 net.(_pollDesc).WaitRead(0xc2017c0110, 0xb, 0xc2000fd390) /home/monnand/soft/golang/go/src/pkg/net/fd_poll_runtime.go:75 +0x31 net.(_netFD).Read(0xc2017c0090, 0xc201a33400, 0x400, 0x400, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/net/fd_unix.go:195 +0x2b3 net.(_conn).Read(0xc200229c30, 0xc201a33400, 0x400, 0x400, 0x48f351, ...) /home/monnand/soft/golang/go/src/pkg/net/net.go:123 +0xc3 crypto/tls.(_block).readFromUntil(0xc201bb1d50, 0xc2000fd690, 0xc200229c30, 0x5, 0xc200229c30, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:401 +0xbd crypto/tls.(_Conn).readRecord(0xc201061280, 0x17, 0x0, 0x413ae5) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:481 +0xfa crypto/tls.(_Conn).Read(0xc201061280, 0xc201d9f000, 0x1000, 0x1000, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/crypto/tls/conn.go:796 +0x102 bufio.(_Reader).fill(0xc201a08420) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:79 +0x10c bufio.(_Reader).Peek(0xc201a08420, 0x1, 0x0, 0x0, 0x0, ...) /home/monnand/soft/golang/go/src/pkg/bufio/bufio.go:107 +0xc9 net/http.(_persistConn).readLoop(0xc20041f300) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:670 +0xc4 created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:511 +0x574

    goroutine 4984 [select]: net/http.(_persistConn).writeLoop(0xc20041f300) /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:774 +0x26f created by net/http.(_Transport).dialConn /home/monnand/soft/golang/go/src/pkg/net/http/transport.go:512 +0x58b

    goroutine 5015 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2013de620, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5031 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc20083a180, 0xc2002121e0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5085 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc201bd0360, 0xc201d325f0, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5083 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201bd1310, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5025 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc20059bf50, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5030 [select]: github.com/uniqush/uniqush-push/srv.(_apnsPushService).waitResults(0xc2000b7f30, 0xc20083a0c0, 0xc200212190, 0x1, 0xa, ...) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:211 +0x207 created by github.com/uniqush/uniqush-push/srv.(_apnsPushService).Push /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:329 +0xd7d

    goroutine 5027 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc2006cb000, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5101 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ccd460, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5094 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ccd000, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    goroutine 5108 [sleep]: time.Sleep(0x165a0bc00) /home/monnand/soft/golang/go/src/pkg/runtime/ztime_linux_amd64.c:19 +0x2f github.com/uniqush/uniqush-push/srv.clearRequest(0xc201ccd930, 0xc200159c00) /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:475 +0x2a created by github.com/uniqush/uniqush-push/srv.(*apnsPushService).pushWorker /home/monnand/goproj/src/github.com/uniqush/uniqush-push/build/tmpgopath/src/github.com/uniqush/uniqush-push/srv/apns.go:615 +0x37c

    bug 
    opened by cmabastar 12
  • Failed: BadDeliveryPoint

    Failed: BadDeliveryPoint

    Hello,

    I'm using uniqush-push and after sometimes when I send a push message I got the following error:

    [Push][Info] 2014/03/25 00:49:58 
    RequestId=5330d2b6-kMqh8mR2TH6-ey5wgumQ6w== From=127.0.0.1:50509 Service=meetapp 
    Subscribers=\"[100002076768728]\"\n[Push][Error] 2014/03/25 00:49:58 RequestID=5330d2b6-kMqh8mR2TH6-ey5wgumQ6w== Service=meetapp Subscriber=100002076768728 PushServiceProvider=apns:531023ac704aca3571969e739a1faa35dc59a0ff 
    DeliveryPoint=apns:e63490774c4147962068b4338b95263c6281e77a Failed: BadDeliveryPoint apns:e63490774c4147962068b4338b95263c6281e77a: encoding/hex: invalid byte: U+0028 '('\n[Push][Info] 2014/03/25 00:49:58 RequestID=5330d2b6-kMqh8mR2TH6-ey5wgumQ6w== Service=meetapp Subscriber=100002076768728 PushServiceProvider=apns:531023ac704aca3571969e739a1faa35dc59a0ff DeliveryPoint=apns:1cc8ea4cec388ba5df6c8ddd0b9f42c40a853666 MsgId=apns:apns:531023ac704aca3571969e739a1faa35dc59a0ff-126 Success!
    

    The error occur only sometimes, but when it happen, all the nexts push aren't delivery with the same error. After a while the pushs notifications start working again (the previous messages aren't delivered).

    Just for the record, my messages does not have parentheses '(' (U+0028). And I'm able to send messages with parentheses.

    triage MustFix 
    opened by guitcastro 11
  • Failed lookup on gcm on autoscale

    Failed lookup on gcm on autoscale

    Hi @monnand

    We have problems when we try to autoscale the uniqush servers: Here's the error:

    [Push][Error] 2014/02/14 12:29:22 RequestID=52fd9ba2-oP7j5BcX4kTn4Ls1-YAgQw== Service=0839899613932562 Subscriber=52db1f733dc9e12b8c5e271a PushServiceProvider=gcm:321c686a5eb5a03ef5d447d19182de600a69e65d DeliveryPoint=gcm:27f83d2a6ae6dec20e57e99aad2968fac6a37f3b Failed: Post https://android.googleapis.com/gcm/send: dial tcp: lookup android.googleapis.com: no such host

    These errors only happen on new instances spawned by the Amazon AutoScale. The only remedy was to restart uniqush manually. We also tested it launching the instance with uniqush manually it seems to be having the same problem.

    Errors on GCM only.

    MustFix 
    opened by cmabastar 11
  • Unable to Download Uniqush tar File

    Unable to Download Uniqush tar File

    Hi,

    im trying to download the tar file for Uniqush from the following page yet i keep getting bad request page (502)

    error uni

    is there any alternative link? or is there fixing for this issue soon?

    Thanks

    bug 
    opened by ibr123 10
  • Migration problem with version 2.x

    Migration problem with version 2.x

    Thank you for maintaining uniqush!

    The full APNS payload is important to me, so I upgraded uniqush from version 1.5.2 to 2.1.0. And I also did the migration command URL: /rebuildserviceset.

    For APNS it worked fine, but GCM pushes were not delivered anymore. The log is: [Push][Info] 2016/05/03 15:51:44 RequestId=5728acf0-HsY2tFkTaKrdpKovS92c1Q== From=127.0.0.1:45544 Service=ajoy NrSubscribers=1 Subscribers="[myAndroidNumber]" [Push][Error] 2016/05/03 15:51:44 RequestID=5728acf0-HsY2tFkTaKrdpKovS92c1Q== Service=ajoy Subscriber= PushServiceProvider=gcm:myPspNumber DeliveryPoint=Unknown Failed: BadPushServiceProvider gcm:myPSPNumber

    Then I checked the psps and I saw only the APNS entry. {"services":{"aJoy":[{"addr":"gateway.push.apple.com:2195","cert":"/mylocalserverpath/myCert.pem","key":"/mylocalserverpath/myKey.pem","service":"aJoy"},{"addr":"gateway.push.apple.com:2195","cert":"/etc/uniqush/sandbox/myCert.pem","key":"/etc/uniqush/sandbox/myKey.pem","service":"aJoy"}],"ajoy":[{"addr":"gateway.push.apple.com:2195","cert":"/etc/uniqush/production/myCert.pem","key":"/etc/uniqush/production/myKey.pem","service":"ajoy"},{"apikey":"myAPIKey","projectid":"myProjectID","service":"ajoy"},{"addr":"gateway.sandbox.push.apple.com:2195","cert":"/etc/uniqush/sandbox/myCert.pem","key":"/etc/uniqush/sandbox/myKey.pem","service":"ajoy"}]},"code":"UNIQUSH_SUCCESS"}

    I tried to add the GCM psp again. curl http://localhost:9898/addpsp -d service=ajoy -d pushservicetype=gcm -d projectid=myProjectID -d apikey=myAPIKey {"type":"AddPushServiceProvider","date":1462296389,"status":0,"details":{"service":"ajoy","from":"127.0.0.1:48268","pushServiceProvider":"gcm:pushServiceProviderNumber","code":"UNIQUSH_SUCCESS"}} But when I checked the psps again, the GCM entry was still missing and GCM push still did not work.

    The migration did also fail with version 2.0.0. Finally I reverted uniqush back to version 1.5.2 and it worked again.

    opened by Uscher1 9
  • Remove expired registrations on send

    Remove expired registrations on send

    From time to time, we have invalid device registrations, especially if the app was uninstalled. If an app is no longer registered in the target device and a message is pushed to the device, the GCM returns a NotRegistered error message. It would be convenient if the server could remove those outdated registrations from its database.

    opened by ItsNotYou 9
  • apns bulk sent problem

    apns bulk sent problem

    I am getting the following error messages after trying to send ~ 12K messages at once using the -d subscribers=* switch, at first sight i thought it is getting failed 20 secs after receiving the push request, any suggestions?

    [Push][Info] 2014/12/05 17:22:36 RequestId=5481cdbc-lVovkUXZnkdyEESlJtweSw== From=127.0.0.1:57883 Service=ios NrSubscribers=1 Subscribers="[*]" [Push][Error] 2014/12/05 17:22:56 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.233.37:2195: write tcp 17.172.233.37:2195: broken pipe. Will retry within 20s [Push][Info] 2014/12/05 17:22:56 Connection closed by APNS: EOF [Push][Info] 2014/12/05 17:22:56 Connection closed by APNS: EOF [Push][Info] 2014/12/05 17:22:57 Connection closed by APNS: EOF [Push][Info] 2014/12/05 17:22:57 Connection closed by APNS: EOF [Push][Error] 2014/12/05 17:22:57 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.234.16:2195: use of closed network connection. Will retry within 20s [Push][Error] 2014/12/05 17:22:57 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.232.40:2195: use of closed network connection. Will retry within 20s [Push][Error] 2014/12/05 17:22:57 RequestID=5481cdbc-lVovkUXZnkdyEESlJtweSw== Service=ios Subscriber= PushServiceProvider=apns:50a00baec3fb2191f08de251c42f46c8c1ff3542 DeliveryPoint=Unknown Failed: error on connection with 17.172.233.39:2195: use of closed network connection. Will retry within 20s

    bug AwaitingResponse 
    opened by eminden 8
  • Delivery Success but not receiving on device.

    Delivery Success but not receiving on device.

    I subscribe correctly and the message gets delivered correctly in iOS, but not on android.

    Any help?

    [Push][Info] 2018/08/24 20:58:44 RequestID=5b807184-OMVeEChySKhLWxZZEg1UCA== Service=promogo Subscriber=lube PushServiceProvider=fcm:ee074643b5ae0c11ee93147348a181e40edaec81 DeliveryPoint=fcm:4c7dbcde37312b03c0fad825a2509642e9150cb7 MsgID=fcm:ee074643b5ae0c11ee93147348a181e40edaec81:0:1535144324485530%fd0791fdf9fd7ecd Success!

    question AwaitingResponse 
    opened by lube 7
  • Title in push notification

    Title in push notification

    The following describes how to push a message to a subscriber.

    Parameter | Description -- | -- service | Service Name. subscriber | Subscriber ID. Could be more than one subscriber. Comma separated. Asterisk (*) could be used as a wildcard to match any string msg | Optional. Message Body ttl | Optional. Time to live. How long (in seconds) the message should be kept on push service provider’s server if the device is offline badge | Optional. Badge img | Optional. Image sound | Optional. Sound loc-key | Optional. loc-key for APNS loc-args | Optional. loc-args for APNS. It is a comma-separated string. action-loc-key | Option. action-loc-key for APNS. Reserved Parameter | Any parameter whose name starts with “uniqush.” is reserved by Uniqush. Users should avoid using those parameter names. User Defined Parameter | Optional. Any other parameter is accepted which will be sent to mobile devices

    Can we add a title? I know that push notification payload can also have a title, but it isn't listed here. am I missing something?

    enhancement 
    opened by geniuscd 7
  • Support UnifiedPush on Android devices

    Support UnifiedPush on Android devices

    Description

    UnifiedPush allows to receive Push Notifications on Android devices that do not have Google Play Services installed. In a free and open world there needs to be a way to free you and your customers from Google, if they choose to. Firebase integration is a no-go on the F-Droid store. Many FOSS apps, like Telegram, fall back to Foreground Service Workers and/or polling with the result of massive battery drain and a permanent annoying foreground notification.

    UnifiedPush simply offers the user the option to install alternative push distributors such as ntfy or even NextPush. The benefit of this approach is that more than one application can leverage the UnifiedPush interface, but only one push receiver has to be installed and run in the foreground (i.e. ntfy or NextPush as mentioned above).

    UnifiedPush also offers an Embedded FCM Distributor that you can automatically fallback to, if no other push distributors can be found.

    Approach

    The idea is to either run all Android oriented operations of Uniqush through UnifiedPush with a proper Embedded FCM Distributor or to try to run through UnifiedPush and fall back to the own FCM integration that Uniqush offers.

    opened by martin-braun 0
  • Switch to api.sandbox.push.apple.com

    Switch to api.sandbox.push.apple.com

    srv/apns/http_api/processor.go has http2UrlHost = "https://api.development.push.apple.com"

    https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns/

    opened by TysonAndre 0
  • Make FCM/APNS timeouts configurable?

    Make FCM/APNS timeouts configurable?

    Timeouts may depend on available bandwidth and burstiness of requests, but if a client expects a response from uniqush within 5 seconds then it may be useful to reduce it below the default of 20 seconds.

    Enforce a minimum of 1 second

    This may be useful to speed up detection and recovery from networking errors

    srv/apns/http_api/processor.go
    76:             // Note: Do not set IdleTimeout, it may be a cause of errors in setups where pushes are infrequent.
    79:             TLSHandshakeTimeout:   10 * time.Second,
    80:             ExpectContinueTimeout: 1 * time.Second,
    98:             Timeout:   20 * time.Second,
    
    enhancement 
    opened by TysonAndre 0
  • Document how to support new root CAs for APNs servers with uniqush

    Document how to support new root CAs for APNs servers with uniqush

    From https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server

    Establish a Trusted Connection to APNs Communication between your provider server and APNs must take place over a secure connection. Creating that connection requires installing the GeoTrust Global CA root certificate (until March 29, 2021) and the AAA Certificate Services root certificate (starting March 29, 2021) on each of your provider servers.

    If your provider server runs macOS, the GeoTrust Global CA root certificate is in the keychain by default. If your provider server runs macOS 10.14 or later, the AAA Certificate Services root certificate is in the keychain by default. On other systems, you might need to install this certificate yourself. You can download the GeoTrust Global CA root certificate from the GeoTrust Root Certificates website. You can download the “AAACertificateServices 5/12/2020” certificate from the Sectigo KnowledgeBase website.

    (developer.apple.com has the official download links)

    https://stackoverflow.com/questions/40051213/where-is-golang-picking-up-root-cas-from

    For example, on linux

    // Copyright 2015 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.
    
    package x509
    
    // Possible certificate files; stop after finding one.
    var certFiles = []string{
        "/etc/ssl/certs/ca-certificates.crt",                // Debian/Ubuntu/Gentoo etc.
        "/etc/pki/tls/certs/ca-bundle.crt",                  // Fedora/RHEL 6
        "/etc/ssl/ca-bundle.pem",                            // OpenSUSE
        "/etc/pki/tls/cacert.pem",                           // OpenELEC
        "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", // CentOS/RHEL 7
        "/etc/ssl/cert.pem",                                 // Alpine Linux
    }
    

    In cases where it is not possible to update the certificate store, look into whether it'd be viable to include those certificate stores manually, e.g. as a CLI flag to add to the OS's certificate store

    opened by TysonAndre 0
  • What about an open server-side events/REST protocol for apps on any platform?

    What about an open server-side events/REST protocol for apps on any platform?

    I couldn't help but notice that all the protocols implemented so far seem to be proprietary ones for use with closed SDKs only (like the Android one, while the system is open the SDK is not). Even the Web Push API I saw suggested seems quite intertwined with the idea of signed Java apps and use through node.js libraries, rather than e.g. a more generally usable C lib for regular apps on maybe even laptops or desktops.

    Are there any plans to support an open protocol maybe alike to Ubuntu Push, with more universal desktop or mobile native client tooling that works with stuff like OpenSSL and winapi and posix sockets? Such a C API could also be used from Java, for example, with a thin wrapper. Laptops in particular appear to be left out of push usage and many other battery optimizations for some reason, as well as the new growing niche of Linux phones, and as an app developer using a proper cross-platform language it seems a bit silly too to reinvent the wheel on every single quirky mobile platform with a new API. Why not use the same push client lib on all of them and on laptops and desktops too? The lock-in to platform specific protocols for the apps seems easy at first, but mostly littered with downsides and odd exclusions further down the road. It's not like a laptop benefits by wasting more energy on notifications compared to a phone.

    I don't know, just makes me wonder that all the "open" push solutions seem to be rushing to stay in those weird EULA SDKs instead of actually making a proper universal app client spec. It's just a bit weird to me

    opened by ell1e 0
Releases(2.7.0)
  • 2.7.0(Nov 27, 2019)

    • Bugfix: Change from the deprecated redis.FlushDb alias to redis.FlushDB of go-redis (FlushDb is removed in the latest releases). This may require updating the version of go-redis that uniqush-push is built with
    • Bugfix: Properly handle values of sandbox other than sandbox=true when creating push service providers. (#249) (This bug is not triggered when there is no sandbox query param)
    • Bugfix: Fix possible incorrect subscription when sending API response for /push containing multiple subscriptions (pushes were sent correctly)
    • Maintenance: Start using go modules
    • Maintenance: Add documentation to source code
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.7.0-1.x86_64.rpm(4.94 MB)
    uniqush-push_2.7.0_amd64.deb(4.96 MB)
    uniqush-push_2.7.0_x86_64.tar.gz(4.96 MB)
  • 2.6.1(Jul 21, 2018)

    • Maintenance: Fix various code style warnings from code linters (e.g. gometalinter). Refactor and document code.

    • Bugfix: Fix the rare "No device" errors seen when retrying a push. (PR #222)

    • Bugfix: Fix the regular expression used as a sanity check of subscriptions and services. (PR #222) The intended accepted characters for use in services and subscriptions were a-z, A-Z, 0-9, -, _, @ or .

      Forbid using the backtick in service and subscription names (this was accidentally permitted by the invalid regex).

      Continue allowing a small number of other invalid characters for now, those may be deprecated in future releases.

    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.6.1-1.x86_64.rpm(3.12 MB)
    uniqush-push_2.6.1_amd64.deb(3.14 MB)
    uniqush-push_2.6.1_x86_64.tar.gz(3.14 MB)
  • 2.6.0(Jul 18, 2018)

    • Maintenance: Update GCM push URL to the equivalent https://fcm.googleapis.com/fcm/ endpoint (#210) Applications using GCM are unaffected by this change. (The old URL stops working in April 2019)
    • Maintenance: Upgrade go-redis from v5 to v6.
    • Get rid of excessive database locking when fetching subscriptions for a user.
    • Make the APNS pool size configurable at runtime
    • Stop overriding Gomaxprocs (removes a call to runtime.GOMAXPROCS(runtime.NumCPU() + 1)). This allows users to override this setting. This is no longer needed because the latest releases of Go have reasonable defaults for GOMAXPROCS.
    • New feature: Add an optional slave_host and slave_port field to the uniqush db config. This may help with scaling if the redis master (or sharded redis masters) have high load, by performing read operations against the redis slave instead.

    Changes to APIs

    • New feature: Prevent creating two different push service providers of the same service name and push service type in /addpsp. (#197) Updating mutable fields of existing PSP will continue to work.

    • New feature: Add optional fields to subscriptions that clients can use to track information about an app with a subscription (app_version, locale, subscribe_date, devid, old_devid (device id)).

      These can be set in calls to /subscribe, and will be returned (if they exist) in calls to /subscriptions

      Note that the subscribe_date provided by the client must be a unix timestamp in seconds.

      • Uniqush-push currently does not use these for anything, but they are returned when fetching subscriptions.
      • devid can be used by clients to remove duplicate subscriptions (e.g. different regid/device token but the same device for GCM/APNS) if the same device id is seen in calls to /subscribe. (E.g. this can used in combination with subscribe_date to check which subscription was newer)
      • old_devid is only useful if you plan to change the way that device ids are generated in a newer release, and want to manually remove duplicate subscriptions if they arise (e.g. for APNS).
    • If /subscriptions is called with include_delivery_point_ids=1, this will return unique string identifiers for each delivery point (as delivery_point_id) to use with /push

    • Make the APNS worker pool size (for the binary API) configurable at runtime. (see example in conf/uniqush-push.conf)

      This controls the number of encrypted TCP connections to APNS (per active APNS Push Service Provider) that can run at a given time.

      This defaults to 13 and has a maximum of 50. The default should be reasonable for most use cases.

    • /push now accepts an optional parameter delivery_point_id with a comma separated list of delivery point ids to push to, e.g. delivery_point_id="apns:abcdef0123456789" to push to the single subscription with that delivery point id.

      Knowing the delivery point id allows clients to implement custom logic to invoke uniqush-push's APIs

      • For example, a client may wish to push different payloads (or not push at all) to endpoints running app_version 1.2.3 of your app or older.

        (or base the payload on the locale of the device, etc)

      This parameter only needs to be used if you want to push to some delivery points (for a subscriber) but not others.

    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.6.0-1.x86_64.rpm(3.12 MB)
    uniqush-push_2.6.0_amd64.deb(3.14 MB)
    uniqush-push_2.6.0_x86_64.tar.gz(3.14 MB)
  • 2.5.0(Apr 1, 2018)

    • Support "title", "title-loc-key", and "title-loc-args"
    • Support larger APNS payloads. Support 5120 byte payloads for APNS voip pushes (Where the Cert is a VOIP cert and uniqush.apns_voip=1 is part of the query params in the call to /push
    • Support more granular loglevel levels in uniqush config files: alert, error, warn/warning, standard/verbose/info, and debug
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.5.0-1.x86_64.rpm(2.96 MB)
    uniqush-push_2.5.0_amd64.deb(2.97 MB)
    uniqush-push_2.5.0_x86_64.tar.gz(2.98 MB)
  • 2.4.0(Oct 7, 2017)

    • New feature: Initial support for GCM/FCM "notification" pushes (Documented in PR #185). uniqush.notification.gcm and uniqush.notification.fcm can be used as fields for /push, with the JSON blob to send GCM/FCM for the optional "notification" message. "notification" messages will let GCM/FCM display the notification for you.
    • Maintenance: Change from https://android.googleapis.com/gcm/send to https://gcm-http.googleapis.com/gcm/send (equivalent endpoints)
    • Maintenance: Bump go version used to compile releases
    • Maintenance: go 1.9+ is recommended for compiling and testing
    • Bug fix: Improve logging subscriber name in failed API requests.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.4.0-1.x86_64.rpm(2.75 MB)
    uniqush-push_2.4.0_amd64.deb(2.77 MB)
    uniqush-push_2.4.0_x86_64.tar.gz(2.78 MB)
  • 2.3.0(Jul 18, 2017)

    • New feature: Add /previewpush endpoint to preview the payload that would be generated and sent to push services. (Issue #140) This helps with debugging.
    • Maintenance: Update APNS binary provider API(default) from version 1 to version 2.
    • Maintenance: Upgrade to redis.v5 (Issue #143)
    • New provider: Add FCM support. (Issue #148) The parameters that would be provided to /addpsp, /subscribe, and /push are the same as they would be for GCM. (Replace "gcm" with "fcm" when following instructions)
    • New feature: Add support APNS HTTP2 API (Issue #157, PR #173) This gives more accurate results on whether a push succeeded, and should not impact Uniqush's performance. To set this up, call /addpsp (to create a new provider or modify an existing provider) with the same params you would use to create a new APNS endpoint for binary providers (including cert and key), in addition to providing bundleid. Currently, to make testing easy, each call to /push must be provided with the query param value uniqush.http=1. Otherwise, uniqush continues to use the APNS binary provider API.
    • Maintenance: Use unescaped payloads for GCM and FCM. This allows larger payloads, avoiding escaping characters such as < and >

    Fixes #134

    go 1.8.3+ and an up to date version of golang.org/x/net/http2 are suggested (For the APNS HTTP2 API).

    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.3.0-1.x86_64.rpm(2.66 MB)
    uniqush-push_2.3.0_amd64.deb(2.68 MB)
    uniqush-push_2.3.0_x86_64.tar.gz(2.69 MB)
  • 2.2.0(Nov 3, 2016)

    • Add API endpoints for querying subscriptions (/subscriptions), available services (/services), and a migration API for building the services set (/rebuildserviceset)
    • Allow for providing custom JSON payloads to ADM, APNS, and GCM
    • Add feedback to indicate whether a delivery point was modified on push (thanks Clemens Fischer)
    • Better connection pooling for the GCM implementation reduces memory footprint by about 90% for if(we)
    • Migrate Redis implementation to redis.v3
    • Automatically remove invalid PSPs if they are detected
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.2.0-1.x86_64.rpm(2.36 MB)
    uniqush-push_2.2.0_amd64.deb(2.38 MB)
    uniqush-push_2.2.0_x86_64.tar.gz(2.38 MB)
  • 2.1.0(Mar 9, 2016)

    2016-Mar-09

    This release contains bugfixes, new APIs and improvements.

    ChangeLog:

    • improvement Add new APIs for listing the subscriptions of a subscriber and for listing the services exist.
    • bugfix Fix concurrency issues in ADM, APNS. Change the APNS implementation from a buggy connection pool to a reliable worker pool.
    • bugfix Fix a bug which would lead to an infinite loop in rare circumstances.
    • improvement Remove Go's default HTML escaping of JSON payloads, for APNS. The APNS servers now render payloads with characters such as '"' properly.
    • improvement Add more details to error messages.
    • improvement Add enough buffer space for potential 100-byte APNS device tokens.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.1.0-1.x86_64.rpm(2.69 MB)
    uniqush-push_2.1.0_amd64.deb(2.72 MB)
    uniqush-push_2.1.0_x86_64.tar.gz(2.72 MB)
  • 2.0.0(Mar 9, 2016)

    2016-Mar-08

    This release contains a change to the response format, as well as bug fixes and improvements.

    ChangeLog:

    • improvement Changed the response format of most APIs from logs to JSON. This allows clients to reliably parse results and errors from the API response. This will break clients that parse the old format
    • improvement Allow 2048 byte APNS payloads
    • bugfix Fix various memory leaks.
    • bugfix Fix bugs in closing connections.
    • Remove support for C2DM, which was shut down by Google on October 2015.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-2.0.0-1.x86_64.rpm(2.67 MB)
    uniqush-push_2.0.0_amd64.deb(2.69 MB)
    uniqush-push_2.0.0_x86_64.tar.gz(2.70 MB)
  • 1.5.2(Jun 29, 2014)

    29-Jun-2014

    This release contains some bug fix and improvements.

    ChangeLog:

    • Changed the code so that it could work with most recent Go's crypto/tls package. The change is made in this commit.
    • bugfix Fixed a bug in code related to APNS. In 1.5.1, uniqush-push calculates waiting time before retry by squaring previous waiting time. This method leads to integer overflow quickly because we represents time interval in nanoseconds. Right now, we will randomly increase the waiting time which solves the integer overflow problem and also reduces the probability of having message storm.
    • improvement Report error when a user try to add an iOS device with wrong device token.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.5.2-1.x86_64.rpm(1.99 MB)
    uniqush-push_1.5.2_amd64.deb(2.01 MB)
    uniqush-push_1.5.2_x86_64.tar.gz(2.02 MB)
  • 1.5.1(Nov 15, 2013)

    7-Nov-2013

    This release contains some minor bug fix and improvements.

    ChangeLog:

    • bugfix Correctly change from sandbox to production environment in APNS. This fixed issue 33.
    • bugfix If a connection pool connecting with APNS closed, then any Close() operation on connections from the pool will cause a panic. This is a bug in connpool, and fixed in issue 37.
    • improvement APNS: add content-available support. Fixed issue 36.
    • improvement Set Keepalive for all TCP connections. In this case, we can discover connection failure quickly. Fixed issue 38.
    • improvement @ is a valid character in subscriber and service names. Fixed issue 39.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.5.1-1.x86_64.rpm(2.17 MB)
    uniqush-push_1.5.1_amd64.deb(2.20 MB)
    uniqush-push_1.5.1_x86_64.tar.gz(2.20 MB)
  • 1.5.0(Sep 2, 2013)

  • 1.4.5(Aug 2, 2013)

  • 1.4.4(Jul 19, 2013)

    19-Jul-2013

    This version contains some minor bug fixes and a huge improvement for APNS. I would like to give special thanks to cmabastar-gumi for his detailed bug reports.

    ChangeLog:

    • bugfix Removed some unnecessary information in the notification when call on /push. In old versions, service and subscriber(s) names will be included in the notification. This may leak some information to the client (e.g. how you name the client internally.) Fixed issue 19.
    • bugfix Fixed a potential memory leak bug affected APNS sandbox environment. Fixed issue 25.
    • bugfix For APNS, uniqush-push now checks the payload size before sending it. Fixed issue 24.
    • improvement For APNS, uniqush-push now checks the feedback service less frequently so that the performance can be improved a lot. Fixed issue 26.
    • improvement Added a connection pool support for APNS. Partially fixed issue 27.
    • improvement For APNS, uniqush-push now does not wait for the error response. This is a trade-off to improve the performance. However, for most errors, uniqush-push is able to check them before sending the notification to APNS. For others, uniqush-push is able to recover the error. More details will be discussed on the blog. Partially fixed issue 27.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.4.4-1.x86_64.rpm(1.54 MB)
    uniqush-push_1.4.4_amd64.deb(1.55 MB)
    uniqush-push_1.4.4_x86_64.tar.gz(1.56 MB)
  • 1.4.3(Jul 2, 2013)

    14-May-2013

    This version contains some minor bug fixes and added some hidden feature making it works with uniqush-conn.

    ChangeLog:

    • bugfix Close response body on HTTP response in GCM and C2DM code. This is a very common error when using Go's http client package. I thought I have fixed this someday in the past, but it turns out I was wrong. Anyway, this fixed issue 13.
    • bugfix Fixed a bug introduced by feedback support in APNS. It is a missing-return-statement error. Fixed by infiniteloop5 through pull request #17
    • bugfix Fixed some error in document. Fixed issue 16 reported by user974256.
    • improvement We do not depends on redis now. Well, not exactly. You just don't need to install redis on the same machine with uniqush-push. Fixed issue 18.
    • feature Added a new URL path: /nrdp. Users can check how many delivery points are there under certain subscriber. This feature will be used by uniqush-conn and is considered as a hidden feature. i.e. not intended to be used by users. Fixed issue 14.
    • feature Added the so-called _perdp._* feature. This feature is also used by uniqush-conn and is a hidden feature as well. Fixed issue 15.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.4.3-1.x86_64.rpm(1.53 MB)
    uniqush-push_1.4.3_amd64.deb(1.54 MB)
    uniqush-push_1.4.3_x86_64.tar.gz(1.55 MB)
  • 1.4.2(Jul 2, 2013)

    1-Apr-2013 ( This is not a joke! )

    This version contains several bug fixes and a refactory of the main package.

    ChangeLog:

    • bugfix Stop on /stop. Sorry, I forgot to implement the feature after refactoring the main package. Fixed issue 9.
    • bugfix Stop on SIGTERM. Similar with issue 9. User can now stop the program by sending SIGTERM to the process. Fixed issue 8.
    • bugfix Fixed a nil-pointer crash bug. The program will experience a nil-pointer crash (samething as NULL pointer) under some conditions. For example, if user provides an invalid APIKEY for a GCM provider, then uniqush-push will crash when the user tries to push through this malformed provider. Fixed issue 10.
    • feature Support Feedback Service in APNS. Fixed issue 3.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.4.2-1.x86_64.rpm(1.52 MB)
    uniqush-push_1.4.2_amd64.deb(1.54 MB)
    uniqush-push_1.4.2_x86_64.tar.gz(1.54 MB)
  • 1.4.1(Jul 2, 2013)

    24-Feb-2013

    This version contains several bug fixes and a refactory of the main package.

    ChangeLog:

    • improvement On (un)subscription, the log message now contains service and subscriber information. Fixed issue 2.
    • improvement On adding an APNS push service provider, uniqush-push will report error immediately if the given certificate or key files do not exist. Fixed issue 6.
    • bugfix Removed all code related memory pool. There is no dependency on memory pool any more. Fixed issue 7.
    • improvement Rewrote the code in main package. It is more clean, simple and less redundant. Fixed issue 5.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.4.1-1.x86_64.rpm(1.53 MB)
    uniqush-push_1.4.1_amd64.deb(1.55 MB)
    uniqush-push_1.4.1_x86_64.tar.gz(1.55 MB)
  • 1.4.0(Jul 2, 2013)

    7-Jan-2013

    This version contains several bug fixes, new features and interface changes for developers.

    ChangeLog:

    • bugfix Fixed the bug on re-connecting APNS server. Thanks to Ivan Yu for his detailed bug report and analysis
    • feature Added loc-key, loc-args and action-loc-key support for APNS. You can send your localized message through uniqush-pus now. This part of code is adapted from benwei's patch. Thank you, benwei. Here is an example of using loc-key and loc-args: curl http://127.0.0.1:9898/push -d service=fake -d subscriber=client -d msg="hello" -d loc-key="lockey" -d loc-args="hello,world" Then the loc-args sent to the APNS will be ["hello", "world"]. Yes. it is comma separated. If one of your loc-key contains comma(,), then add a backslash () in front of the comma. (Similar to escape character in C)
    • feature Added support to true multicast for GCM.
    • feature Added time-to-live support for both GCM and APNS. It defines how long (in seconds) the message should be kept on push service provider's server if the device is offline.
    • change When subscribe to a GCM service, the user don't need to provide the account parameter. When unsubscribe a service, the user need to provide the same regid as the one he used to subscribe. For existing subscribers (i.e. the subscriber is added using previous releases), the account parameter is required when unsubscribe the service.
    • change This change only affects developers. The interface of PushServiceType is changed making it possible to support true multicast on GCM. Corresponding components are changed.
    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.4.0-1.x86_64.rpm(1.34 MB)
    uniqush-push_1.4.0_amd64.deb(1.36 MB)
    uniqush-push_1.4.0_x86_64.tar.gz(1.36 MB)
  • 1.3.2(May 15, 2018)

    Legacy release for uniqush-push 1.3.2. This contains packages previously hosted on uniqush.org (the packages were moved to GitHub releases)

    You probably want the latest releases: uniqush-push 2.5.0 or newer

    This is a bug fix version. No new features were added.

    • bugfix Fixed a bug on unsubscription. When a user unsubscribed from a service and subscribe it again, the database will be in an error state. Reason: uniqush-push keeps a counter for each delivery points. When a user unsubscribes, its related delivery point's counter will be decreased by one. When the counter reaches zero, its corresponding delivery point information will be deleted. However, in old versions, uniqush-push will not delete the counter when it reaches zero. Hence there is a bug. This bug was found and reported by Ivan Yu.
    • bugfix Fixed a bug when subscribe with identical information. If a delivery point subscribe a service, its corresponding counter will be increased by one. If the delivery point has already been added under a certain user, its counter should not be increased. However, in old versions, uniqush-push will increase the counter without checking if the delivery point has already under the same user. This bug was found and reported by Ivan Yu.
    • The uniqush organization on github moved three repositories under [uniqush-push repository] to merge them into a single repository. Old repositories will be removed soon. They are: pushdb, which now under db directory in [uniqush-push repository]; pushsys, which now under push directory in [uniqush-push repository]; pushsrv, which now under srv directory in [uniqush-push repository].

    Special thanks to Ivan Yu for his bug report.

    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.3.2-1.x86_64.rpm(1.33 MB)
    uniqush-push_1.3.2_amd64.deb(1.35 MB)
    uniqush-push_1.3.2_x86_64.tar.gz(1.35 MB)
  • 1.3.1(May 15, 2018)

    Legacy release for uniqush-push 1.3.1. This contains packages previously hosted on uniqush.org (the packages were moved to GitHub releases)

    You probably want the latest releases: uniqush-push 2.5.0 or newer

    • This version introduced wildcard feature, which allows users use a wildcard to send notification to multiple subscribers.

    • For more details, read this blog post.

    Source code(tar.gz)
    Source code(zip)
    uniqush-push-1.3.1-1.x86_64.rpm(1.33 MB)
    uniqush-push_1.3.1_amd64.deb(1.34 MB)
    uniqush-push_1.3.1_x86_64.tar.gz(1.34 MB)
  • 1.3.0(May 15, 2018)

The Xiaomi message push service is a system-level channel on MIUI and is universal across the platform, which can provide developers with stable, reliable, and efficient push services.

Go-Push-API MiPush、JiPush、UMeng MiPush The Xiaomi message push service is a system-level channel on MIUI and is universal across the platform, which c

houseme 5 Oct 20, 2022
💨 A real time messaging system to build a scalable in-app notifications, multiplayer games, chat apps in web and mobile apps.

Beaver A Real Time Messaging Server. Beaver is a real-time messaging server. With beaver you can easily build scalable in-app notifications, realtime

Ahmed 1.4k Nov 15, 2022
Simple push notification system (android/fcm, apns/slideshow) written by Golang

Golang Push Notification Simple system push notification for android/fcm and apn

Hoàng Hải 0 Dec 20, 2021
Go-notification - Realtime notification system with golang

Realtime notification system Used Apache kafka gRPC & PROTOBUF MongoDB restapi w

vishalvishnu 3 Aug 19, 2022
A push notification server written in Go (Golang).

gorush A push notification micro server using Gin framework written in Go (Golang) and see the demo app. Contents gorush Contents Support Platform Fea

Bo-Yi Wu 6.7k Nov 27, 2022
The Bhojpur MDM is a software-as-a-service product used as a Mobile Device Manager based on Bhojpur.NET Platform for application delivery.

Bhojpur MDM - Mobile Device Manager The Bhojpur MDM is a software-as-a-service product used as a Mobile Device Manager based on Bhojpur.NET Platform f

Bhojpur Consulting 0 Dec 31, 2021
Bark is an iOS App which allows you to push customed notifications to your iPhone.

Bark is an iOS App which allows you to push customed notifications to your iPhone.

Feng 1.6k Nov 21, 2022
a unified representation of buffered, unbuffered, and unbounded channels in Go

chann a unified representation of buffered, unbuffered, and unbounded channels in Go import "golang.design/x/chann" This package requires Go 1.18. Us

The golang.design Initiative 23 Oct 31, 2022
ntfy is a super simple pub-sub notification service. It allows you to send desktop notifications via scripts.

ntfy ntfy (pronounce: notify) is a super simple pub-sub notification service. It allows you to send desktop and (soon) phone notifications via scripts

Philipp C. Heckel 8k Nov 24, 2022
Golang push server cluster

gopush-cluster gopush-cluster is a go push server cluster. Features light weight high performance pure golang implementation message expired offline m

Terry.Mao 2.1k Nov 8, 2022
Converter EPG XMLTV to OTT-play (by Alex) server side JSON

EPG converter for OTT-play FOSS Описание Инструмент создания телепрограммы для OTT-Play FOSS, использует 1 поток, и буферное чтение из файла, что позв

prog4food 6 Sep 24, 2022
Chanify is a safe and simple notification tools. This repository is command line tools for Chanify.

Chanify is a safe and simple notification tools. For developers, system administrators, and everyone can push notifications with API.

Chanify 962 Nov 21, 2022
cisasntyi: check iphone stock and send notification to your iphone

for buy iphone 13 notification cisasntyi: check iphone stock and send notification to your iphone install Bark app in your iphone first before you run

seaZhang 45 Aug 3, 2022
Namecoin calendar notification daemon (ICS, CalDAV)

nccald nccald is a simple daemon to provide calendar notifications for Namecoin name expirations. The daemon periodically queries a Namecoin Core inst

Hugo Landau 0 Dec 11, 2021
Arjuns-urgent-notification-backend - A simple Golang app that handles form JSON POST requests

Arjun's Urgent Notification Backend This is intended to let people urgently noti

Kome Fumi 0 Jan 7, 2022
An little library to create notification files with golang.

notifile With this no library you can easily create notification files for your Go projects. These must then be stored in the directory you specify so

echGo 1 Oct 5, 2022
Open source Observability Platform. 👉 SigNoz helps developers find issues in their deployed applications & solve them quickly

SigNoz SigNoz is an opensource observability platform. SigNoz uses distributed tracing to gain visibility into your systems and powers data using Kafk

SigNoz 10.5k Nov 20, 2022
yt-dl but for free sms services

recvsms - use free sms services through cli You can think of recvsms as yt-dl for free sms services. It will support many SMS "backends" eventually. I

courtier 0 Dec 29, 2021
ZenQ - A low-latency thread-safe queue in golang implemented using a lock-free ringbuffer

ZenQ A low-latency thread-safe queue in golang implemented using a lock-free ringbuffer Features Much faster than native channels in both SPSC (single

Anish Mukherjee 534 Nov 18, 2022