refactor: make event emitter threadsafe
This commit is contained in:
parent
9ce0ae08a1
commit
e58f5b03eb
|
@ -40,9 +40,6 @@
|
||||||
[submodule "vendor/isaac"]
|
[submodule "vendor/isaac"]
|
||||||
path = vendor/isaac
|
path = vendor/isaac
|
||||||
url = https://github.com/pragmagic/isaac.git
|
url = https://github.com/pragmagic/isaac.git
|
||||||
[submodule "vendor/eventemitter"]
|
|
||||||
path = vendor/eventemitter
|
|
||||||
url = https://github.com/al-bimani/eventemitter.git
|
|
||||||
[submodule "vendor/nim-libp2p"]
|
[submodule "vendor/nim-libp2p"]
|
||||||
path = vendor/nim-libp2p
|
path = vendor/nim-libp2p
|
||||||
url = https://github.com/status-im/nim-libp2p
|
url = https://github.com/status-im/nim-libp2p
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import NimQml, eventemitter, chronicles, tables
|
import NimQml, chronicles, tables
|
||||||
import ../../status/chat as chat_model
|
import ../../status/chat as chat_model
|
||||||
import ../../status/mailservers as mailserver_model
|
import ../../status/mailservers as mailserver_model
|
||||||
import ../../status/messages as messages_model
|
import ../../status/messages as messages_model
|
||||||
|
@ -7,6 +7,7 @@ import ../../status/libstatus/types as status_types
|
||||||
import ../../status/libstatus/settings as status_settings
|
import ../../status/libstatus/settings as status_settings
|
||||||
import ../../status/[chat, contacts, status, wallet, stickers]
|
import ../../status/[chat, contacts, status, wallet, stickers]
|
||||||
import view, views/channels_list, views/message_list
|
import view, views/channels_list, views/message_list
|
||||||
|
import ../../eventemitter
|
||||||
|
|
||||||
logScope:
|
logScope:
|
||||||
topics = "chat-controller"
|
topics = "chat-controller"
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import NimQml, eventemitter, chronicles, options, std/wrapnils
|
import NimQml, chronicles, options, std/wrapnils
|
||||||
import ../../status/libstatus/types as status_types
|
import ../../status/libstatus/types as status_types
|
||||||
import ../../status/signals/types
|
import ../../status/signals/types
|
||||||
import ../../status/status
|
import ../../status/status
|
||||||
import view
|
import view
|
||||||
import ../../status/accounts as status_accounts
|
import ../../status/accounts as status_accounts
|
||||||
|
import ../../eventemitter
|
||||||
|
|
||||||
type LoginController* = ref object
|
type LoginController* = ref object
|
||||||
status*: Status
|
status*: Status
|
||||||
|
|
|
@ -2,7 +2,7 @@ import NimQml, chronicles
|
||||||
import ../../status/signals/types
|
import ../../status/signals/types
|
||||||
import ../../status/[status, node, network]
|
import ../../status/[status, node, network]
|
||||||
import ../../status/libstatus/types as status_types
|
import ../../status/libstatus/types as status_types
|
||||||
import eventemitter
|
import ../../eventemitter
|
||||||
import view
|
import view
|
||||||
|
|
||||||
logScope:
|
logScope:
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import NimQml, eventemitter, chronicles, std/wrapnils
|
import NimQml, chronicles, std/wrapnils
|
||||||
import ../../status/libstatus/types as status_types
|
import ../../status/libstatus/types as status_types
|
||||||
import ../../status/libstatus/accounts as status_accounts
|
import ../../status/libstatus/accounts as status_accounts
|
||||||
import ../../status/accounts as AccountModel
|
import ../../status/accounts as AccountModel
|
||||||
import ../../status/status
|
import ../../status/status
|
||||||
import ../../status/signals/types
|
import ../../status/signals/types
|
||||||
|
import ../../eventemitter
|
||||||
import view
|
import view
|
||||||
|
|
||||||
type OnboardingController* = ref object
|
type OnboardingController* = ref object
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import NimQml, json, eventemitter, strutils, sugar, sequtils
|
import NimQml, json, strutils, sugar, sequtils
|
||||||
import json_serialization
|
import json_serialization
|
||||||
import ../../status/libstatus/mailservers as status_mailservers
|
import ../../status/libstatus/mailservers as status_mailservers
|
||||||
import ../../status/signals/types
|
import ../../status/signals/types
|
||||||
|
@ -11,6 +11,7 @@ import ../../status/chat as status_chat
|
||||||
import ../../status/devices
|
import ../../status/devices
|
||||||
import ../../status/chat/chat
|
import ../../status/chat/chat
|
||||||
import ../../status/wallet
|
import ../../status/wallet
|
||||||
|
import ../../eventemitter
|
||||||
import view
|
import view
|
||||||
import views/ens_manager
|
import views/ens_manager
|
||||||
import chronicles
|
import chronicles
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import NimQml, eventemitter, strformat, strutils, chronicles
|
import NimQml, strformat, strutils, chronicles
|
||||||
|
|
||||||
import view
|
import view
|
||||||
import views/[asset_list, account_list, account_item]
|
import views/[asset_list, account_list, account_item]
|
||||||
|
@ -8,6 +8,7 @@ import ../../status/libstatus/types as status_types
|
||||||
import ../../status/signals/types
|
import ../../status/signals/types
|
||||||
import ../../status/[status, wallet]
|
import ../../status/[status, wallet]
|
||||||
import ../../status/wallet/account as WalletTypes
|
import ../../status/wallet/account as WalletTypes
|
||||||
|
import ../../eventemitter
|
||||||
|
|
||||||
type WalletController* = ref object
|
type WalletController* = ref object
|
||||||
status: Status
|
status: Status
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
import # system libs
|
||||||
|
tables
|
||||||
|
|
||||||
|
import # deps
|
||||||
|
uuids
|
||||||
|
|
||||||
|
type
|
||||||
|
Args* = ref object of RootObj # ...args
|
||||||
|
Handler* = proc (args: Args) {.closure.} # callback function type
|
||||||
|
EventEmitter* = ref object
|
||||||
|
events: Table[string, Table[UUID, Handler]]
|
||||||
|
|
||||||
|
proc createEventEmitter*(): EventEmitter =
|
||||||
|
result.new
|
||||||
|
result.events = initTable[string, Table[UUID, Handler]]()
|
||||||
|
|
||||||
|
|
||||||
|
proc on(this: EventEmitter, name: string, handlerId: UUID, handler: Handler): void =
|
||||||
|
if this.events.hasKey(name):
|
||||||
|
this.events[name].add handlerId, handler
|
||||||
|
return
|
||||||
|
|
||||||
|
this.events[name] = [(handlerId, handler)].toTable
|
||||||
|
|
||||||
|
proc on*(this: EventEmitter, name: string, handler: Handler): void =
|
||||||
|
var uuid: UUID
|
||||||
|
this.on(name, uuid, handler)
|
||||||
|
|
||||||
|
proc once*(this:EventEmitter, name:string, handler:Handler): void =
|
||||||
|
var handlerId = genUUID()
|
||||||
|
this.on(name, handlerId) do(a: Args):
|
||||||
|
handler(a)
|
||||||
|
this.events[name].del handlerId
|
||||||
|
|
||||||
|
proc emit*(this:EventEmitter, name:string, args:Args): void =
|
||||||
|
if this.events.hasKey(name):
|
||||||
|
for (id, handler) in this.events[name].pairs:
|
||||||
|
handler(args)
|
||||||
|
|
||||||
|
when isMainModule:
|
||||||
|
block:
|
||||||
|
type ReadyArgs = ref object of Args
|
||||||
|
text: string
|
||||||
|
var evts = createEventEmitter()
|
||||||
|
evts.on("ready") do(a: Args):
|
||||||
|
var args = ReadyArgs(a)
|
||||||
|
echo args.text, ": from [1st] handler"
|
||||||
|
evts.once("ready") do(a: Args):
|
||||||
|
var args = ReadyArgs(a)
|
||||||
|
echo args.text, ": from [2nd] handler"
|
||||||
|
evts.emit("ready", ReadyArgs(text:"Hello, World"))
|
||||||
|
evts.emit("ready", ReadyArgs(text:"Hello, World"))
|
|
@ -1,4 +1,4 @@
|
||||||
import NimQml, eventemitter, chronicles, os, strformat
|
import NimQml, chronicles, os, strformat
|
||||||
|
|
||||||
import app/chat/core as chat
|
import app/chat/core as chat
|
||||||
import app/wallet/core as wallet
|
import app/wallet/core as wallet
|
||||||
|
@ -11,6 +11,7 @@ import status/signals/core as signals
|
||||||
import status/libstatus/types
|
import status/libstatus/types
|
||||||
import nim_status
|
import nim_status
|
||||||
import status/status as statuslib
|
import status/status as statuslib
|
||||||
|
import ./eventemitter
|
||||||
|
|
||||||
var signalsQObjPointer: pointer
|
var signalsQObjPointer: pointer
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import eventemitter, options, chronicles, json
|
import options, chronicles, json
|
||||||
import libstatus/accounts as status_accounts
|
import libstatus/accounts as status_accounts
|
||||||
import libstatus/settings as status_settings
|
import libstatus/settings as status_settings
|
||||||
import libstatus/types
|
import libstatus/types
|
||||||
import libstatus/utils
|
import libstatus/utils
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
type
|
type
|
||||||
AccountModel* = ref object
|
AccountModel* = ref object
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
import eventemitter, json, strutils, sequtils, tables, chronicles, times
|
import json, strutils, sequtils, tables, chronicles, times
|
||||||
import libstatus/chat as status_chat
|
import libstatus/chat as status_chat
|
||||||
import libstatus/mailservers as status_mailservers
|
import libstatus/mailservers as status_mailservers
|
||||||
import libstatus/chatCommands as status_chat_commands
|
import libstatus/chatCommands as status_chat_commands
|
||||||
import libstatus/accounts/constants as constants
|
import libstatus/accounts/constants as constants
|
||||||
import libstatus/types
|
import libstatus/types
|
||||||
import stickers
|
import stickers
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
import profile/profile
|
import profile/profile
|
||||||
import contacts
|
import contacts
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import eventemitter, json, sequtils
|
import json, sequtils
|
||||||
import libstatus/contacts as status_contacts
|
import libstatus/contacts as status_contacts
|
||||||
import profile/profile
|
import profile/profile
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
const DELETE_CONTACT* = "__deleteThisContact__"
|
const DELETE_CONTACT* = "__deleteThisContact__"
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import eventemitter, json, options, typetraits
|
import json, options, typetraits
|
||||||
import web3/ethtypes, json_serialization, stint
|
import web3/ethtypes, json_serialization, stint
|
||||||
import accounts/constants
|
import accounts/constants
|
||||||
|
import ../../eventemitter
|
||||||
|
|
||||||
type SignalType* {.pure.} = enum
|
type SignalType* {.pure.} = enum
|
||||||
Message = "messages.new"
|
Message = "messages.new"
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import algorithm, json, random, math, os, tables, sets, chronicles, eventemitter, sequtils, locks, sugar
|
import algorithm, json, random, math, os, tables, sets, chronicles, sequtils, locks, sugar
|
||||||
import libstatus/core as status_core
|
import libstatus/core as status_core
|
||||||
import libstatus/chat as status_chat
|
import libstatus/chat as status_chat
|
||||||
import libstatus/mailservers as status_mailservers
|
import libstatus/mailservers as status_mailservers
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
|
|
||||||
# How do mailserver should work ?
|
# How do mailserver should work ?
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import tables, sets, eventemitter
|
import tables, sets
|
||||||
import libstatus/chat
|
import libstatus/chat
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
type
|
type
|
||||||
MessageDetails* = object
|
MessageDetails* = object
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import chronicles, eventemitter
|
import chronicles
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
logScope:
|
logScope:
|
||||||
topics = "network-model"
|
topics = "network-model"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import eventemitter
|
|
||||||
import libstatus/core as status
|
import libstatus/core as status
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
type NodeModel* = ref object
|
type NodeModel* = ref object
|
||||||
events*: EventEmitter
|
events*: EventEmitter
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import json, eventemitter
|
import json
|
||||||
import libstatus/types
|
import libstatus/types
|
||||||
import profile/profile
|
import profile/profile
|
||||||
import libstatus/core as libstatus_core
|
import libstatus/core as libstatus_core
|
||||||
import libstatus/accounts as status_accounts
|
import libstatus/accounts as status_accounts
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
type
|
type
|
||||||
ProfileModel* = ref object
|
ProfileModel* = ref object
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import NimQml, eventemitter, tables, json, chronicles, strutils, json_serialization
|
import NimQml, tables, json, chronicles, strutils, json_serialization
|
||||||
import ../libstatus/types as status_types
|
import ../libstatus/types as status_types
|
||||||
import types, messages, discovery, whisperFilter, envelopes, expired, wallet
|
import types, messages, discovery, whisperFilter, envelopes, expired, wallet
|
||||||
import ../status
|
import ../status
|
||||||
|
import ../../eventemitter
|
||||||
|
|
||||||
logScope:
|
logScope:
|
||||||
topics = "signals"
|
topics = "signals"
|
||||||
|
|
|
@ -2,7 +2,7 @@ import json, chronicles, json_serialization, tables
|
||||||
import ../libstatus/types
|
import ../libstatus/types
|
||||||
import ../chat/[chat, message]
|
import ../chat/[chat, message]
|
||||||
import ../profile/[profile, devices]
|
import ../profile/[profile, devices]
|
||||||
import eventemitter
|
import ../../eventemitter
|
||||||
|
|
||||||
type Signal* = ref object of Args
|
type Signal* = ref object of Args
|
||||||
signalType* {.serializedFieldName("type").}: SignalType
|
signalType* {.serializedFieldName("type").}: SignalType
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
import eventemitter
|
|
||||||
|
|
||||||
import libstatus/accounts as libstatus_accounts
|
import libstatus/accounts as libstatus_accounts
|
||||||
import libstatus/core as libstatus_core
|
import libstatus/core as libstatus_core
|
||||||
import libstatus/settings as libstatus_settings
|
import libstatus/settings as libstatus_settings
|
||||||
import libstatus/types as libstatus_types
|
import libstatus/types as libstatus_types
|
||||||
import chat, accounts, wallet, node, network, mailservers, messages, contacts, profile, stickers
|
import chat, accounts, wallet, node, network, mailservers, messages, contacts, profile, stickers
|
||||||
|
import ../eventemitter
|
||||||
|
|
||||||
export chat, accounts, node, mailservers, messages, contacts, profile, network
|
export chat, accounts, node, mailservers, messages, contacts, profile, network
|
||||||
|
|
||||||
|
|
|
@ -2,12 +2,12 @@ import # global deps
|
||||||
tables, strutils, sequtils
|
tables, strutils, sequtils
|
||||||
|
|
||||||
import # project deps
|
import # project deps
|
||||||
chronicles, web3/[ethtypes, conversions], eventemitter, stint
|
chronicles, web3/[ethtypes, conversions], stint
|
||||||
|
|
||||||
import # local deps
|
import # local deps
|
||||||
libstatus/types, libstatus/eth/contracts as status_contracts,
|
libstatus/types, libstatus/eth/contracts as status_contracts,
|
||||||
libstatus/stickers as status_stickers, transactions,
|
libstatus/stickers as status_stickers, transactions,
|
||||||
libstatus/wallet
|
libstatus/wallet, ../eventemitter
|
||||||
from libstatus/utils as libstatus_utils import eth2Wei, gwei2Wei, toUInt64, parseAddress
|
from libstatus/utils as libstatus_utils import eth2Wei, gwei2Wei, toUInt64, parseAddress
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import eventemitter, json, strformat, strutils, chronicles, sequtils, httpclient, tables
|
import json, strformat, strutils, chronicles, sequtils, httpclient, tables
|
||||||
import json_serialization, stint
|
import json_serialization, stint
|
||||||
from web3/ethtypes import Address, EthSend, Quantity
|
from web3/ethtypes import Address, EthSend, Quantity
|
||||||
from web3/conversions import `$`
|
from web3/conversions import `$`
|
||||||
|
@ -14,6 +14,7 @@ from libstatus/types import PendingTransactionType, GeneratedAccount, DerivedAcc
|
||||||
from libstatus/utils as libstatus_utils import eth2Wei, gwei2Wei, first, toUInt64, parseAddress
|
from libstatus/utils as libstatus_utils import eth2Wei, gwei2Wei, first, toUInt64, parseAddress
|
||||||
import wallet/[balance_manager, account, collectibles]
|
import wallet/[balance_manager, account, collectibles]
|
||||||
import transactions
|
import transactions
|
||||||
|
import ../eventemitter
|
||||||
export account, collectibles
|
export account, collectibles
|
||||||
export Transaction
|
export Transaction
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from eventemitter import Args
|
from ../../eventemitter import Args
|
||||||
import ../libstatus/types
|
import ../libstatus/types
|
||||||
|
|
||||||
type CollectibleList* = ref object
|
type CollectibleList* = ref object
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 49cfa2f3135139c3488b68fdd061cc069d31d651
|
|
Loading…
Reference in New Issue