only call callback once from disconnect