feat: add once listener
test: add test for once