The best way would be through a shader, but I don't know how to implement it, but if it doesn't bother you that the sprite disappears completely, the wrapf function is ideal:
float wrapf(value: float, min: float, max: float)
Wraps float value between min and max.
Usable for creating loop-alike behavior or infinite surfaces.
extends Node2D
onready var sprite= $Sprite;
onready var screen= get_viewport_rect();
var time= 0.0
func _process(delta):
time += 5 * delta
sprite.position.x= wrapf(sprite.position.x + 8, -50, screen.size.x)
sprite.position.y= wrapf(sprite.position.y + sin(time) * 20, -50, screen.size.y)