2013-07-18 16:49:28 +02:00
|
|
|
// Copyright (c) 2013 Conformal Systems LLC.
|
|
|
|
// Use of this source code is governed by an ISC
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package btcchain
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
// NotificationType represents the type of a notification message.
|
|
|
|
type NotificationType int
|
|
|
|
|
|
|
|
// Constants for the type of a notification message.
|
|
|
|
const (
|
|
|
|
// NTOrphanBlock indicates an orphan block was processed and the
|
2013-09-10 02:35:36 +02:00
|
|
|
// associated block hash should be passed to the GetOrphanRoot function
|
|
|
|
// to find the root of all known orphans which should then be used to
|
|
|
|
// request the missing blocks.
|
2013-07-18 16:49:28 +02:00
|
|
|
NTOrphanBlock NotificationType = iota
|
|
|
|
|
|
|
|
// NTBlockAccepted indicates the associated block was accepted into
|
|
|
|
// the block chain. Note that this does not necessarily mean it was
|
|
|
|
// added to the main chain. For that, use NTBlockConnected.
|
|
|
|
NTBlockAccepted
|
|
|
|
|
|
|
|
// NTBlockConnected indicates the associated block was connected to the
|
|
|
|
// main chain.
|
|
|
|
NTBlockConnected
|
|
|
|
|
|
|
|
// NTBlockDisconnected indicates the associated block was disconnected
|
|
|
|
// from the main chain.
|
|
|
|
NTBlockDisconnected
|
|
|
|
)
|
|
|
|
|
|
|
|
// notificationTypeStrings is a map of notification types back to their constant
|
|
|
|
// names for pretty printing.
|
|
|
|
var notificationTypeStrings = map[NotificationType]string{
|
|
|
|
NTOrphanBlock: "NTOrphanBlock",
|
|
|
|
NTBlockAccepted: "NTBlockAccepted",
|
|
|
|
NTBlockConnected: "NTBlockConnected",
|
|
|
|
NTBlockDisconnected: "NTBlockDisconnected",
|
|
|
|
}
|
|
|
|
|
|
|
|
// String returns the NotificationType in human-readable form.
|
|
|
|
func (n NotificationType) String() string {
|
|
|
|
if s, ok := notificationTypeStrings[n]; ok {
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
return fmt.Sprintf("Unknown Notification Type (%d)", int(n))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Notification defines an asynchronous notification that is sent to the caller
|
|
|
|
// over the notification channel provided during the call to New and consists
|
|
|
|
// of a notification type as well as associated data that depends on the type as
|
|
|
|
// follows:
|
|
|
|
// - NTOrphanBlock: *btcwire.ShaHash
|
|
|
|
// - NTBlockAccepted: *btcutil.Block
|
|
|
|
// - NTBlockConnected: *btcutil.Block
|
|
|
|
// - NTBlockDisconnected: *btcutil.Block
|
|
|
|
type Notification struct {
|
|
|
|
Type NotificationType
|
|
|
|
Data interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// sendNotification sends a notification with the passed type and data if the
|
|
|
|
// caller requested notifications by providing a channel in the call to New.
|
|
|
|
func (b *BlockChain) sendNotification(typ NotificationType, data interface{}) {
|
|
|
|
// Ignore it if the caller didn't request notifications.
|
|
|
|
if b.notifications == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2013-09-06 18:05:04 +02:00
|
|
|
// Generate and send the notification asynchronously.
|
|
|
|
go func() {
|
|
|
|
n := Notification{Type: typ, Data: data}
|
|
|
|
b.notifications <- &n
|
|
|
|
}()
|
2013-07-18 16:49:28 +02:00
|
|
|
}
|