add once and listenOnce support