local U=(require(script.Parent.loader)).load(script)local Z=game:GetService("\082\101\112\108\105\099\097\116\101\100\083\116\111\114\097\103\101")local f=game:GetService("\082\117\110\083\101\114\118\105\099\101")local Q=U("\082\101\115\111\117\114\099\101\067\111\110\115\116\097\110\116\115")if not f:IsRunning()then return function(U)local Z=Instance.new("\082\101\109\111\116\101\069\118\101\110\116")Z.Archivable=false Z.Name="\077\111\099\107"..U return Z end elseif f:IsServer()then return function(U)assert(type(U)=="\115\116\114\105\110\103","\066\097\100 \110\097\109\101")local f=Z:FindFirstChild(Q.REMOTE_EVENT_STORAGE_NAME)if not f then f=Instance.new("\070\111\108\100\101\114")f.Name=Q.REMOTE_EVENT_STORAGE_NAME f.Archivable=false f.Parent=Z end local K=f:FindFirstChild(U)if K then return K end K=Instance.new("\082\101\109\111\116\101\069\118\101\110\116")K.Name=U K.Archivable=false K.Parent=f return K end else return function(U)assert(type(U)=="\115\116\114\105\110\103","\066\097\100 \110\097\109\101")return(Z:WaitForChild(Q.REMOTE_EVENT_STORAGE_NAME)):WaitForChild(U)end end
--[=[
	Retrieves a global remote event from the store. On the server, it constructs a new one,
	and on the client, it waits for it to exist.

	:::tip
	Consider using [PromiseGetRemoteEvent] for a non-yielding version
	:::

	```lua
	-- server.lua
	local GetRemoteEvent = require("GetRemoteEvent")

	local remoteEvent = GetRemoteEvent("testing")
	remoteEvent.OnServerEvent:Connect(print)

	-- client.lua
	local GetRemoteEvent = require("GetRemoteEvent")

	local remoteEvent = GetRemoteEvent("testing")
	remoteEvent:FireServer("Hello") --> Hello (on the server)
	```

	:::info
	If the game is not running, then a mock remote event will be created
	for use in testing.
	:::

	@yields
	@function GetRemoteEvent
	@within GetRemoteEvent
	@param name string
	@return RemoteEvent
]=]

local require = require(script.Parent.loader).load(script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")

local ResourceConstants = require("ResourceConstants")

if not RunService:IsRunning() then
	return function(name)
		local event = Instance.new("RemoteEvent")
		event.Archivable = false
		event.Name = "Mock" .. name

		return event
	end
elseif RunService:IsServer() then
	return function(name)
		assert(type(name) == "string", "Bad name")

		local storage = ReplicatedStorage:FindFirstChild(ResourceConstants.REMOTE_EVENT_STORAGE_NAME)
		if not storage then
			storage = Instance.new("Folder")
			storage.Name = ResourceConstants.REMOTE_EVENT_STORAGE_NAME
			storage.Archivable = false
			storage.Parent = ReplicatedStorage
		end

		local event = storage:FindFirstChild(name)
		if event then
			return event
		end

		event = Instance.new("RemoteEvent")
		event.Name = name
		event.Archivable = false
		event.Parent = storage

		return event
	end
else -- RunService:IsClient()
	return function(name)
		assert(type(name) == "string", "Bad name")

		return ReplicatedStorage:WaitForChild(ResourceConstants.REMOTE_EVENT_STORAGE_NAME):WaitForChild(name)
	end
end
