code: func GetPubSubResponse(r *bufio.Reader) (msg *Message, err Error) {
  	defer func() {
  		err = onRecover(recover(), "GetPubSubResponse")
  	}()
  
  	buf := readToCRLF(r)
  	assertCtlByte(buf, count_byte, "PubSub Sequence")
  
  	num, e := strconv.ParseInt(string(buf[1:len(buf)]), 10, 64)
  	assertNotError(e, "in getPubSubResponse - ParseInt")
  	if num != 3 {
  		panic(fmt.Errorf("<BUG> Expecting *3 for len in response - got %d - buf: %s", num, buf))
  	}
  
  	header := readMultiBulkData(r, 2)
  
  	msgtype := string(header[0])
  	subid := string(header[1])
  
  	buf = readToCRLF(r)
  
  	n, e := strconv.Atoi(string(buf[1:]))
  	assertNotError(e, "in getPubSubResponse - pubsub msg seq 3 line - number parse error")
  
  	// TODO - REVU decisiont to conflate P/SUB and P/UNSUB
  	switch msgtype {
  	case "subscribe":
  		assertCtlByte(buf, num_byte, "subscribe")
  		msg = newSubcribeAck(subid, n)
  	case "unsubscribe":
  		assertCtlByte(buf, num_byte, "unsubscribe")
  		msg = newUnsubcribeAck(subid, n)
  	case "message":
  		assertCtlByte(buf, size_byte, "MESSAGE")
  		msg = newMessage(subid, readBulkData(r, int(n)))
  	// TODO
  	case "psubscribe", "punsubscribe", "pmessage":
  		panic(fmt.Errorf("<BUG> - pattern-based message type %s not implemented", msgtype))
  	}
  
  	return
  }
docs: // ----------------------------------------------------------------------------
  // PubSub message processing
  // ----------------------------------------------------------------------------
  // Fully reads and processes an expected Redis pubsub message byte sequence.