mirror of
				https://github.com/imezx/Warp.git
				synced 2025-10-31 10:19:17 +00:00 
			
		
		
		
	v1.0.9
This commit is contained in:
		
							parent
							
								
									5cf44bd21f
								
							
						
					
					
						commit
						9aaa382278
					
				
					 17 changed files with 407 additions and 18 deletions
				
			
		
							
								
								
									
										
											BIN
										
									
								
								Warp.rbxm
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Warp.rbxm
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							|  | @ -106,6 +106,7 @@ function ClientProcess.start() | ||||||
| 			table.clear(data) | 			table.clear(data) | ||||||
| 		end | 		end | ||||||
| 		for Identifier: string, data: any in clientQueue do | 		for Identifier: string, data: any in clientQueue do | ||||||
|  | 			local callback = clientCallback[Identifier] or nil | ||||||
| 			if #data > 0 then | 			if #data > 0 then | ||||||
| 				if clientRatelimit[Identifier](#data) then | 				if clientRatelimit[Identifier](#data) then | ||||||
| 					ReliableEvent:FireServer(Buffer.revert(Identifier), data) | 					ReliableEvent:FireServer(Buffer.revert(Identifier), data) | ||||||
|  | @ -126,11 +127,11 @@ function ClientProcess.start() | ||||||
| 					table.clear(incoming_cache[Identifier]) | 					table.clear(incoming_cache[Identifier]) | ||||||
| 				end | 				end | ||||||
| 			end | 			end | ||||||
| 			if clientCallback[Identifier] then | 			if callback then | ||||||
| 				if #queueIn[Identifier] > 0 then | 				if #queueIn[Identifier] > 0 then | ||||||
| 					for _, packedDatas: any in queueIn[Identifier] do | 					for _, packedDatas: any in queueIn[Identifier] do | ||||||
| 						if #packedDatas == 0 then continue end | 						if #packedDatas == 0 then continue end | ||||||
| 						for _, fn: any in clientCallback[Identifier] do | 						for _, fn: any in callback do | ||||||
| 							for i=1,math.min(1e3, #packedDatas) do | 							for i=1,math.min(1e3, #packedDatas) do | ||||||
| 								Spawn(fn, table.unpack(packedDatas[i] or {})) | 								Spawn(fn, table.unpack(packedDatas[i] or {})) | ||||||
| 							end | 							end | ||||||
|  | @ -141,7 +142,7 @@ function ClientProcess.start() | ||||||
| 				if #queueInRequest[1][Identifier] > 0 then | 				if #queueInRequest[1][Identifier] > 0 then | ||||||
| 					for idx, packetDatas: any in queueInRequest[1][Identifier] do | 					for idx, packetDatas: any in queueInRequest[1][Identifier] do | ||||||
| 						if #packetDatas == 0 then continue end | 						if #packetDatas == 0 then continue end | ||||||
| 						for _, fn: any in clientCallback[Identifier] do | 						for _, fn: any in callback do | ||||||
| 							for i=1,math.min(1e3, #packetDatas) do | 							for i=1,math.min(1e3, #packetDatas) do | ||||||
| 								local packetData = packetDatas[i] | 								local packetData = packetDatas[i] | ||||||
| 								if not packetData then continue end | 								if not packetData then continue end | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								src/Index/Client/ClientProcess/Logger.luau
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/Index/Client/ClientProcess/Logger.luau
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | --!strict | ||||||
|  | local Logger = {} | ||||||
|  | local Logs: { | ||||||
|  | 	[string]: { | ||||||
|  | 		[string]: string | ||||||
|  | 	} | ||||||
|  | } = {} | ||||||
|  | local logging: { | ||||||
|  | 	[string]: boolean | ||||||
|  | } = {} | ||||||
|  | 
 | ||||||
|  | local now = tick() | ||||||
|  | 
 | ||||||
|  | function Logger.write(Identifier: string, text: string, log: boolean?) | ||||||
|  | 	if not Logs[Identifier] then | ||||||
|  | 		Logs[Identifier] = {} | ||||||
|  | 	end | ||||||
|  | 	if log ~= nil then | ||||||
|  | 		logging[Identifier] = log | ||||||
|  | 	end | ||||||
|  | 	now = tick() | ||||||
|  | 	Logs[Identifier][tostring(now)] = text | ||||||
|  | 	if logging[Identifier] then | ||||||
|  | 		print(`[{now}] ->`, text) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function Logger.read(Identifier: string) | ||||||
|  | 	return Logs[Identifier] | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | return Logger | ||||||
							
								
								
									
										253
									
								
								src/Index/Client/ClientProcess/init.luau
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								src/Index/Client/ClientProcess/init.luau
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,253 @@ | ||||||
|  | --!native | ||||||
|  | --!strict | ||||||
|  | --!optimize 2 | ||||||
|  | local ClientProcess = {} | ||||||
|  | 
 | ||||||
|  | local RunService = game:GetService("RunService") | ||||||
|  | local Util = script.Parent.Parent.Util | ||||||
|  | 
 | ||||||
|  | local Type = require(script.Parent.Parent.Type) | ||||||
|  | local Event = require(script.Parent.Parent.Event) | ||||||
|  | local Spawn = require(Util.Spawn) | ||||||
|  | local Key = require(Util.Key) | ||||||
|  | local RateLimit = require(Util.RateLimit) | ||||||
|  | local Buffer = require(Util.Buffer) | ||||||
|  | local Logger = require(script.Logger) | ||||||
|  | 
 | ||||||
|  | local clientRatelimit: Type.StoredRatelimit = {} | ||||||
|  | local clientQueue: Type.QueueMap = {} | ||||||
|  | local unreliableClientQueue: Type.QueueMap = {} | ||||||
|  | local clientCallback: Type.CallbackMap = {} | ||||||
|  | local clientRequestQueue: Type.QueueMap = {} | ||||||
|  | 
 | ||||||
|  | local queueIn: { | ||||||
|  | 	[string]: {any} | ||||||
|  | } = {} | ||||||
|  | local queueInRequest: { | ||||||
|  | 	[number]: { | ||||||
|  | 		[string]: { | ||||||
|  | 			any | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } = {} | ||||||
|  | local queueOutRequest: { | ||||||
|  | 	[number]: { | ||||||
|  | 		[string]: { | ||||||
|  | 			any | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } = {} | ||||||
|  | local incoming_cache: { | ||||||
|  | 	[string]: { | ||||||
|  | 		any | ||||||
|  | 	} | ||||||
|  | } = {} | ||||||
|  | local logger: { | ||||||
|  | 	[string]: boolean | ||||||
|  | } = {} | ||||||
|  | 
 | ||||||
|  | queueInRequest[1] = {} | ||||||
|  | queueInRequest[2] = {} | ||||||
|  | queueOutRequest[1] = {} | ||||||
|  | queueOutRequest[2] = {} | ||||||
|  | 
 | ||||||
|  | local ReliableEvent = Event.Reliable | ||||||
|  | local UnreliableEvent = Event.Unreliable | ||||||
|  | local RequestEvent = Event.Request | ||||||
|  | 
 | ||||||
|  | function ClientProcess.insertQueue(Identifier: string, reliable: boolean, ...: any) | ||||||
|  | 	if not reliable then | ||||||
|  | 		table.insert(unreliableClientQueue[Identifier], { ... }) | ||||||
|  | 		return | ||||||
|  | 	end | ||||||
|  | 	table.insert(clientQueue[Identifier], { ... }) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.insertRequest(Identifier: string, timeout: number, ...: any) | ||||||
|  | 	local yieldThread: thread, start = coroutine.running(), os.clock() | ||||||
|  | 	local cancel = task.delay(timeout, function() | ||||||
|  | 		task.spawn(yieldThread, nil) | ||||||
|  | 	end) | ||||||
|  | 	table.insert(clientRequestQueue[Identifier], { tostring(Key()), function(...: any) | ||||||
|  | 		if (os.clock() - start) > timeout then  return end | ||||||
|  | 		task.cancel(cancel) | ||||||
|  | 		task.spawn(yieldThread, ...) | ||||||
|  | 	end :: any, { ... } :: any }) | ||||||
|  | 	return coroutine.yield() | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.add(Identifier: any, originId: string) | ||||||
|  | 	if not clientQueue[Identifier] then | ||||||
|  | 		clientRatelimit[Identifier] = RateLimit.create(originId) | ||||||
|  | 		clientQueue[Identifier] = {} | ||||||
|  | 		unreliableClientQueue[Identifier] = {} | ||||||
|  | 		clientRequestQueue[Identifier] = {} | ||||||
|  | 		clientCallback[Identifier] = {} | ||||||
|  | 		 | ||||||
|  | 		queueOutRequest[1][Identifier] = {} | ||||||
|  | 		queueOutRequest[2][Identifier] = {} | ||||||
|  | 		queueInRequest[1][Identifier] = {} | ||||||
|  | 		queueInRequest[2][Identifier] = {} | ||||||
|  | 		queueIn[Identifier] = {} | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.logger(Identifier: string, store: boolean, log: boolean) | ||||||
|  | 	logger[Identifier] = store | ||||||
|  | 	Logger.write(Identifier, `state: change -> {log == true and "enabled" or "disabled"} logger.`, log) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.getlogs(Identifier: string) | ||||||
|  | 	return Logger.read(Identifier) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.addCallback(Identifier: string, key: string, callback) | ||||||
|  | 	clientCallback[Identifier][key] = callback | ||||||
|  | 	if logger[Identifier] then | ||||||
|  | 		task.defer(Logger.write, Identifier, `state: change -> new callback added.`) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.removeCallback(Identifier: string, key: string) | ||||||
|  | 	clientCallback[Identifier][key] = nil | ||||||
|  | 	if logger[Identifier] then | ||||||
|  | 		task.defer(Logger.write, Identifier, `state: change -> removed a callback.`) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ClientProcess.start() | ||||||
|  | 	RunService.PostSimulation:Connect(function() | ||||||
|  | 		for Identifier: string, data: any in unreliableClientQueue do | ||||||
|  | 			if #data == 0 then continue end | ||||||
|  | 			if clientRatelimit[Identifier](#data) then | ||||||
|  | 				UnreliableEvent:FireServer(Buffer.revert(Identifier), data) | ||||||
|  | 				if logger[Identifier] then | ||||||
|  | 					task.defer(Logger.write, Identifier, `state: out -> unreliable -> {#data} data.`) | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 			table.clear(data) | ||||||
|  | 		end | ||||||
|  | 		for Identifier: string, data: any in clientQueue do | ||||||
|  | 			local callback = clientCallback[Identifier] or nil | ||||||
|  | 			if #data > 0 then | ||||||
|  | 				if clientRatelimit[Identifier](#data) then | ||||||
|  | 					ReliableEvent:FireServer(Buffer.revert(Identifier), data) | ||||||
|  | 					if logger[Identifier] then | ||||||
|  | 						task.defer(Logger.write, Identifier, `state: out -> reliable -> {#data} data.`) | ||||||
|  | 					end | ||||||
|  | 				end | ||||||
|  | 				table.clear(data) | ||||||
|  | 			end | ||||||
|  | 			if #clientRequestQueue[Identifier] > 0 then | ||||||
|  | 				for _, requestData in clientRequestQueue[Identifier] do | ||||||
|  | 					if not requestData[3] then continue end | ||||||
|  | 					table.insert(queueOutRequest[1][Identifier], { requestData[1], requestData[3] }) | ||||||
|  | 					table.remove(requestData, #requestData) | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 			if incoming_cache[Identifier] then | ||||||
|  | 				for _, packet in incoming_cache[Identifier] do | ||||||
|  | 					if not queueIn[Identifier] then continue end | ||||||
|  | 					table.insert(queueIn[Identifier], table.clone(packet)) | ||||||
|  | 					table.clear(incoming_cache[Identifier]) | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 			if callback then | ||||||
|  | 				if #queueIn[Identifier] > 0 then | ||||||
|  | 					for _, packedDatas: any in queueIn[Identifier] do | ||||||
|  | 						if #packedDatas == 0 then continue end | ||||||
|  | 						for _, fn: any in callback do | ||||||
|  | 							for i=1,math.min(1e3, #packedDatas) do | ||||||
|  | 								Spawn(fn, table.unpack(packedDatas[i] or {})) | ||||||
|  | 							end | ||||||
|  | 						end | ||||||
|  | 					end | ||||||
|  | 					table.clear(queueIn[Identifier]) | ||||||
|  | 				end | ||||||
|  | 				if #queueInRequest[1][Identifier] > 0 then | ||||||
|  | 					for idx, packetDatas: any in queueInRequest[1][Identifier] do | ||||||
|  | 						if #packetDatas == 0 then continue end | ||||||
|  | 						for _, fn: any in callback do | ||||||
|  | 							for i=1,math.min(1e3, #packetDatas) do | ||||||
|  | 								local packetData = packetDatas[i] | ||||||
|  | 								if not packetData then continue end | ||||||
|  | 								Spawn(function() | ||||||
|  | 									local requestReturn = { fn(table.unpack(packetData[2])) } | ||||||
|  | 									table.insert(queueOutRequest[2][Identifier], { packetData[1],  requestReturn }) | ||||||
|  | 								end) | ||||||
|  | 							end | ||||||
|  | 						end | ||||||
|  | 					end | ||||||
|  | 					table.clear(queueInRequest[1][Identifier]) | ||||||
|  | 				end | ||||||
|  | 				if #queueInRequest[2][Identifier] > 0 then | ||||||
|  | 					for _, packetDatas: any in queueInRequest[2][Identifier] do | ||||||
|  | 						for _, packetData in packetDatas do | ||||||
|  | 							if #packetData == 1 then continue end | ||||||
|  | 							for y=1, math.min(1e3, #clientRequestQueue[Identifier]) do | ||||||
|  | 								local clientRequest = clientRequestQueue[Identifier][y] | ||||||
|  | 								if not clientRequest then continue end | ||||||
|  | 								if clientRequest[1] == packetData[1] then | ||||||
|  | 									Spawn(clientRequest[2], table.unpack(packetData[2])) | ||||||
|  | 									table.remove(clientRequestQueue[Identifier], y) | ||||||
|  | 									break | ||||||
|  | 								end | ||||||
|  | 							end | ||||||
|  | 						end | ||||||
|  | 					end | ||||||
|  | 					table.clear(queueInRequest[2][Identifier]) | ||||||
|  | 				end | ||||||
|  | 			end | ||||||
|  | 		end | ||||||
|  | 		for Identifier: string, requestsData in queueOutRequest[1] do | ||||||
|  | 			if #requestsData == 0 then continue end | ||||||
|  | 			RequestEvent:FireServer(Buffer.revert(Identifier), "\1", requestsData) | ||||||
|  | 			if logger[Identifier] then | ||||||
|  | 				task.defer(Logger.write, Identifier, `state: out -> request -> {#requestsData} data.`) | ||||||
|  | 			end | ||||||
|  | 			table.clear(queueOutRequest[1][Identifier]) | ||||||
|  | 		end | ||||||
|  | 		for Identifier: string, toReturnDatas in queueOutRequest[2] do | ||||||
|  | 			if #toReturnDatas == 0 then continue end | ||||||
|  | 			RequestEvent:FireServer(Buffer.revert(Identifier), "\0", toReturnDatas) | ||||||
|  | 			if logger[Identifier] then | ||||||
|  | 				task.defer(Logger.write, Identifier, `state: out -> return request -> {#toReturnDatas} data.`) | ||||||
|  | 			end | ||||||
|  | 			table.clear(queueOutRequest[2][Identifier]) | ||||||
|  | 		end | ||||||
|  | 	end) | ||||||
|  | 	local function onClientNetworkReceive(Identifier: any, data: any) | ||||||
|  | 		if not Identifier or not data then return end | ||||||
|  | 		Identifier = Buffer.convert(Identifier) | ||||||
|  | 		if not queueIn[Identifier] then | ||||||
|  | 			queueIn[Identifier] = {} | ||||||
|  | 		end | ||||||
|  | 		if logger[Identifier] then | ||||||
|  | 			task.defer(Logger.write, Identifier, `state: in -> net -> {#data} data.`) | ||||||
|  | 		end | ||||||
|  | 		if not clientCallback[Identifier] then | ||||||
|  | 			if not incoming_cache[Identifier] then | ||||||
|  | 				incoming_cache[Identifier] = {} | ||||||
|  | 			end | ||||||
|  | 			table.insert(incoming_cache[Identifier], data) | ||||||
|  | 			return | ||||||
|  | 		end | ||||||
|  | 		table.insert(queueIn[Identifier], data) | ||||||
|  | 	end | ||||||
|  | 	ReliableEvent.OnClientEvent:Connect(onClientNetworkReceive) | ||||||
|  | 	UnreliableEvent.OnClientEvent:Connect(onClientNetworkReceive) | ||||||
|  | 	RequestEvent.OnClientEvent:Connect(function(Identifier: any, action: string, data) | ||||||
|  | 		if not Identifier or not data then return end | ||||||
|  | 		Identifier = Buffer.convert(Identifier) | ||||||
|  | 		if action == "\1" then | ||||||
|  | 			table.insert(queueInRequest[1][Identifier], data) | ||||||
|  | 		else | ||||||
|  | 			table.insert(queueInRequest[2][Identifier], data) | ||||||
|  | 		end | ||||||
|  | 		if logger[Identifier] then | ||||||
|  | 			task.defer(Logger.write, Identifier, `state: in -> request -> {#data} data.`) | ||||||
|  | 		end | ||||||
|  | 	end) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | return ClientProcess | ||||||
|  | @ -13,10 +13,10 @@ local Key = require(Util.Key) | ||||||
| local Serdes = require(Util.Serdes) | local Serdes = require(Util.Serdes) | ||||||
| local Buffer = require(Util.Buffer) | local Buffer = require(Util.Buffer) | ||||||
| 
 | 
 | ||||||
| function Client.new(Identifier: string) | function Client.new(Identifier: string, yieldWait: number?) | ||||||
| 	local self = setmetatable({}, Client) | 	local self = setmetatable({}, Client) | ||||||
| 	self._buffer = Buffer.new() | 	self._buffer = Buffer.new() | ||||||
| 	self._buffer:wu8(Serdes(Identifier)) | 	self._buffer:wu8(Serdes(Identifier, yieldWait)) | ||||||
| 	self.id = Buffer.convert(self._buffer:build()) | 	self.id = Buffer.convert(self._buffer:build()) | ||||||
| 	self.fn = {} | 	self.fn = {} | ||||||
| 	self.IsConnected = false | 	self.IsConnected = false | ||||||
|  | @ -25,6 +25,13 @@ function Client.new(Identifier: string) | ||||||
| 	return self | 	return self | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | function Client:Logging(store: boolean, opt: boolean) | ||||||
|  | 	ClientProcess.logger(self.id, store, opt) | ||||||
|  | 	return function() | ||||||
|  | 		return ClientProcess.getlogs(self.id) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
| function Client:Fire(reliable: boolean,...: any) | function Client:Fire(reliable: boolean,...: any) | ||||||
| 	ClientProcess.insertQueue(self.id, reliable, ...) | 	ClientProcess.insertQueue(self.id, reliable, ...) | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -26,6 +26,13 @@ function Server.new(Identifier: string, rateLimit: Type.rateLimitArg?) | ||||||
| 	return self | 	return self | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | function Server:Logging(store: boolean, opt: boolean) | ||||||
|  | 	ServerProcess.logger(self.id, store, opt) | ||||||
|  | 	return function() | ||||||
|  | 		return ServerProcess.getlogs(self.id) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
| function Server:Fire(reliable: boolean, player: Player, ...: any) | function Server:Fire(reliable: boolean, player: Player, ...: any) | ||||||
| 	ServerProcess.insertQueue(self.id, reliable, player, ...) | 	ServerProcess.insertQueue(self.id, reliable, player, ...) | ||||||
| end | end | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								src/Index/Server/ServerProcess/Logger.luau
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/Index/Server/ServerProcess/Logger.luau
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | --!strict | ||||||
|  | local Logger = {} | ||||||
|  | local Logs: { | ||||||
|  | 	[string]: { | ||||||
|  | 		[string]: string | ||||||
|  | 	} | ||||||
|  | } = {} | ||||||
|  | local logging: { | ||||||
|  | 	[string]: boolean | ||||||
|  | } = {} | ||||||
|  | 
 | ||||||
|  | local now = tick() | ||||||
|  | 
 | ||||||
|  | function Logger.write(Identifier: string, text: string, log: boolean?) | ||||||
|  | 	if not Logs[Identifier] then | ||||||
|  | 		Logs[Identifier] = {} | ||||||
|  | 	end | ||||||
|  | 	if log ~= nil then | ||||||
|  | 		logging[Identifier] = log | ||||||
|  | 	end | ||||||
|  | 	now = tick() | ||||||
|  | 	Logs[Identifier][tostring(now)] = text | ||||||
|  | 	if logging[Identifier] then | ||||||
|  | 		print(`[{now}] ->`, text) | ||||||
|  | 	end | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function Logger.read(Identifier: string) | ||||||
|  | 	return Logs[Identifier] | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | return Logger | ||||||
|  | @ -13,6 +13,7 @@ local Spawn = require(Util.Spawn) | ||||||
| local Key = require(Util.Key) | local Key = require(Util.Key) | ||||||
| local RateLimit = require(Util.RateLimit) | local RateLimit = require(Util.RateLimit) | ||||||
| local Buffer = require(Util.Buffer) | local Buffer = require(Util.Buffer) | ||||||
|  | local Logger = require(script.Logger) | ||||||
| 
 | 
 | ||||||
| local serverQueue: Type.QueueMap = {} | local serverQueue: Type.QueueMap = {} | ||||||
| local unreliableServerQueue: Type.QueueMap = {} | local unreliableServerQueue: Type.QueueMap = {} | ||||||
|  | @ -43,6 +44,10 @@ local queueOutRequest: { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } = {} | } = {} | ||||||
|  | local logger: { | ||||||
|  | 	[string]: boolean | ||||||
|  | } = {} | ||||||
|  | 
 | ||||||
| queueInRequest[1] = {} | queueInRequest[1] = {} | ||||||
| queueInRequest[2] = {} | queueInRequest[2] = {} | ||||||
| queueOutRequest[1] = {} | queueOutRequest[1] = {} | ||||||
|  | @ -131,12 +136,27 @@ function ServerProcess.add(Identifier: string, originId: string, ratelimit: Type | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | function ServerProcess.logger(Identifier: string, store: boolean, log: boolean) | ||||||
|  | 	logger[Identifier] = store | ||||||
|  | 	Logger.write(Identifier, `state: change -> {log == true and "enabled" or "disabled"} logger.`, log) | ||||||
|  | end | ||||||
|  | 
 | ||||||
|  | function ServerProcess.getlogs(Identifier: string) | ||||||
|  | 	return Logger.read(Identifier) | ||||||
|  | end | ||||||
|  | 
 | ||||||
| function ServerProcess.addCallback(Identifier: string, key: string, callback) | function ServerProcess.addCallback(Identifier: string, key: string, callback) | ||||||
| 	serverCallback[Identifier][key] = callback | 	serverCallback[Identifier][key] = callback | ||||||
|  | 	if logger[Identifier] then | ||||||
|  | 		task.defer(Logger.write, Identifier, `state: change -> new callback added.`) | ||||||
|  | 	end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function ServerProcess.removeCallback(Identifier: string, key: string) | function ServerProcess.removeCallback(Identifier: string, key: string) | ||||||
| 	serverCallback[Identifier][key] = nil | 	serverCallback[Identifier][key] = nil | ||||||
|  | 	if logger[Identifier] then | ||||||
|  | 		task.defer(Logger.write, Identifier, `state: change -> removed a callback.`) | ||||||
|  | 	end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function ServerProcess.start() | function ServerProcess.start() | ||||||
|  | @ -145,6 +165,9 @@ function ServerProcess.start() | ||||||
| 			for player: Player, data: any in players do | 			for player: Player, data: any in players do | ||||||
| 				if #data == 0 then continue end | 				if #data == 0 then continue end | ||||||
| 				UnreliableEvent:FireClient(player, Buffer.revert(Identifier), data) | 				UnreliableEvent:FireClient(player, Buffer.revert(Identifier), data) | ||||||
|  | 				if logger[Identifier] then | ||||||
|  | 					task.defer(Logger.write, Identifier, `state: out -> unreliable -> {#data} data.`) | ||||||
|  | 				end | ||||||
| 				table.clear(data) | 				table.clear(data) | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
|  | @ -153,10 +176,14 @@ function ServerProcess.start() | ||||||
| 			for Identifier: string, data: any in queueOut[player] do | 			for Identifier: string, data: any in queueOut[player] do | ||||||
| 				if #data == 0 then continue end | 				if #data == 0 then continue end | ||||||
| 				ReliableEvent:FireClient(player, Buffer.revert(Identifier), data) | 				ReliableEvent:FireClient(player, Buffer.revert(Identifier), data) | ||||||
|  | 				if logger[Identifier] then | ||||||
|  | 					task.defer(Logger.write, Identifier, `state: out -> reliable -> {#data} data.`) | ||||||
|  | 				end | ||||||
| 				table.clear(data) | 				table.clear(data) | ||||||
| 			end | 			end | ||||||
| 		end | 		end | ||||||
| 		for Identifier: string, players in serverQueue do | 		for Identifier: string, players in serverQueue do | ||||||
|  | 			local callback = serverCallback[Identifier] or nil | ||||||
| 			for player: Player, data in players do | 			for player: Player, data in players do | ||||||
| 				if #data > 0 and queueOut[player] then | 				if #data > 0 and queueOut[player] then | ||||||
| 					queueOut[player][Identifier] = table.clone(data) | 					queueOut[player][Identifier] = table.clone(data) | ||||||
|  | @ -169,11 +196,11 @@ function ServerProcess.start() | ||||||
| 						table.remove(requestData, #requestData) | 						table.remove(requestData, #requestData) | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
| 				if serverCallback[Identifier] then | 				if callback then | ||||||
| 					if #queueIn[Identifier][player] > 0 then | 					if #queueIn[Identifier][player] > 0 then | ||||||
| 						for _, packedDatas: any in queueIn[Identifier][player] do | 						for _, packedDatas: any in queueIn[Identifier][player] do | ||||||
| 							if #packedDatas == 0 then continue end | 							if #packedDatas == 0 then continue end | ||||||
| 							for _, fn: any in serverCallback[Identifier] do | 							for _, fn: any in callback do | ||||||
| 								for i=1,math.min(1e3, #packedDatas) do | 								for i=1,math.min(1e3, #packedDatas) do | ||||||
| 									Spawn(fn, player, table.unpack(packedDatas[i] or {})) | 									Spawn(fn, player, table.unpack(packedDatas[i] or {})) | ||||||
| 								end | 								end | ||||||
|  | @ -184,7 +211,7 @@ function ServerProcess.start() | ||||||
| 					if #queueInRequest[1][Identifier][player] > 0 then | 					if #queueInRequest[1][Identifier][player] > 0 then | ||||||
| 						for idx, packetDatas: any in queueInRequest[1][Identifier][player] do | 						for idx, packetDatas: any in queueInRequest[1][Identifier][player] do | ||||||
| 							if #packetDatas == 0 then continue end | 							if #packetDatas == 0 then continue end | ||||||
| 							for _, fn: any in serverCallback[Identifier] do | 							for _, fn: any in callback do | ||||||
| 								for i=1,math.min(1e3, #packetDatas) do | 								for i=1,math.min(1e3, #packetDatas) do | ||||||
| 									local packetData = packetDatas[i] | 									local packetData = packetDatas[i] | ||||||
| 									if not packetData then continue end | 									if not packetData then continue end | ||||||
|  | @ -218,11 +245,17 @@ function ServerProcess.start() | ||||||
| 					for player: Player, requestsData: any in queueOutRequest[1][Identifier] do | 					for player: Player, requestsData: any in queueOutRequest[1][Identifier] do | ||||||
| 						if #requestsData == 0 then continue end | 						if #requestsData == 0 then continue end | ||||||
| 						RequestEvent:FireClient(player, Buffer.revert(Identifier), "\1", requestsData) | 						RequestEvent:FireClient(player, Buffer.revert(Identifier), "\1", requestsData) | ||||||
|  | 						if logger[Identifier] then | ||||||
|  | 							task.defer(Logger.write, Identifier, `state: out -> request -> {#requestsData} data.`) | ||||||
|  | 						end | ||||||
| 						table.clear(requestsData) | 						table.clear(requestsData) | ||||||
| 					end | 					end | ||||||
| 					for player: Player, toReturnDatas: any in queueOutRequest[2][Identifier] do | 					for player: Player, toReturnDatas: any in queueOutRequest[2][Identifier] do | ||||||
| 						if #toReturnDatas == 0 then continue end | 						if #toReturnDatas == 0 then continue end | ||||||
| 						RequestEvent:FireClient(player, Buffer.revert(Identifier), "\0", toReturnDatas) | 						RequestEvent:FireClient(player, Buffer.revert(Identifier), "\0", toReturnDatas) | ||||||
|  | 						if logger[Identifier] then | ||||||
|  | 							task.defer(Logger.write, Identifier, `state: out -> return request -> {#toReturnDatas} data.`) | ||||||
|  | 						end | ||||||
| 						table.clear(toReturnDatas) | 						table.clear(toReturnDatas) | ||||||
| 					end | 					end | ||||||
| 				end | 				end | ||||||
|  | @ -241,6 +274,9 @@ function ServerProcess.start() | ||||||
| 		if not queueIn[Identifier][player] then | 		if not queueIn[Identifier][player] then | ||||||
| 			queueIn[Identifier][player] = {} | 			queueIn[Identifier][player] = {} | ||||||
| 		end | 		end | ||||||
|  | 		if logger[Identifier] then | ||||||
|  | 			task.defer(Logger.write, Identifier, `state: in -> net -> {#data} data.`) | ||||||
|  | 		end | ||||||
| 		table.insert(queueIn[Identifier][player], data) | 		table.insert(queueIn[Identifier][player], data) | ||||||
| 	end | 	end | ||||||
| 	ReliableEvent.OnServerEvent:Connect(onServerNetworkReceive) | 	ReliableEvent.OnServerEvent:Connect(onServerNetworkReceive) | ||||||
|  | @ -260,6 +296,9 @@ function ServerProcess.start() | ||||||
| 		else | 		else | ||||||
| 			table.insert(queueInRequest[2][Identifier][player], data) | 			table.insert(queueInRequest[2][Identifier][player], data) | ||||||
| 		end | 		end | ||||||
|  | 		if logger[Identifier] then | ||||||
|  | 			task.defer(Logger.write, Identifier, `state: in -> request -> {#data} data.`) | ||||||
|  | 		end | ||||||
| 	end) | 	end) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  | @ -55,7 +55,7 @@ end | ||||||
| 
 | 
 | ||||||
| function Signal:Fire(...: any): () | function Signal:Fire(...: any): () | ||||||
| 	for _, handle in self do | 	for _, handle in self do | ||||||
| 		pcall(handle.fn, ...) | 		task.spawn(handle.fn, ...) | ||||||
| 	end | 	end | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,6 +13,7 @@ export type Client = { | ||||||
| 	DisconnectAll: (self: Client) -> (), | 	DisconnectAll: (self: Client) -> (), | ||||||
| 	Destroy: (self: Client) -> (), | 	Destroy: (self: Client) -> (), | ||||||
| 	Wait: (self: Client) -> number, | 	Wait: (self: Client) -> number, | ||||||
|  | 	Logging: (self: Client, store: boolean, opt: boolean) -> (), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export type Server = { | export type Server = { | ||||||
|  | @ -25,6 +26,7 @@ export type Server = { | ||||||
| 	DisconnectAll: (self: Server) -> (), | 	DisconnectAll: (self: Server) -> (), | ||||||
| 	Destroy: (self: Server) -> (), | 	Destroy: (self: Server) -> (), | ||||||
| 	Wait: (self: Server) -> number, | 	Wait: (self: Server) -> number, | ||||||
|  | 	Logging: (self: Server, store: boolean, opt: boolean) -> (), | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export type Signal = { | export type Signal = { | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| --!strict | --!strict | ||||||
| return function(condition: (any), errorMessage: string?): () | return function(condition: (any), errorMessage: string?): () | ||||||
| 	if not (condition) then error(errorMessage, 2) end | 	if not (condition) then error(`Warp: {errorMessage}`, 2) end | ||||||
| end | end | ||||||
|  | @ -58,46 +58,55 @@ function DedicatedBuffer.build(self: any): buffer | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wi8(self: any, val: number) | function DedicatedBuffer.wi8(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 1) | 	DedicatedBuffer.alloc(self, 1) | ||||||
| 	writei8(self.buffer, self.point, val) | 	writei8(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wi16(self: any, val: number) | function DedicatedBuffer.wi16(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 2) | 	DedicatedBuffer.alloc(self, 2) | ||||||
| 	writei16(self.buffer, self.point, val) | 	writei16(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wi32(self: any, val: number) | function DedicatedBuffer.wi32(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 4) | 	DedicatedBuffer.alloc(self, 4) | ||||||
| 	writei32(self.buffer, self.point, val) | 	writei32(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wu8(self: any, val: number) | function DedicatedBuffer.wu8(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 1) | 	DedicatedBuffer.alloc(self, 1) | ||||||
| 	writeu8(self.buffer, self.point, val) | 	writeu8(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function  DedicatedBuffer.wu16(self: any, val: number) | function  DedicatedBuffer.wu16(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 2) | 	DedicatedBuffer.alloc(self, 2) | ||||||
| 	writeu16(self.buffer, self.point, val) | 	writeu16(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wu32(self: any, val: number) | function DedicatedBuffer.wu32(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 4) | 	DedicatedBuffer.alloc(self, 4) | ||||||
| 	writeu32(self.buffer, self.point, val) | 	writeu32(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wf32(self: any, val: number) | function DedicatedBuffer.wf32(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 4) | 	DedicatedBuffer.alloc(self, 4) | ||||||
| 	writef32(self.buffer, self.point, val) | 	writef32(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wf64(self: any, val: number) | function DedicatedBuffer.wf64(self: any, val: number) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, 8) | 	DedicatedBuffer.alloc(self, 8) | ||||||
| 	writef64(self.buffer, self.point, val) | 	writef64(self.buffer, self.point, val) | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function DedicatedBuffer.wstring(self: any, val: string) | function DedicatedBuffer.wstring(self: any, val: string) | ||||||
|  | 	if not val then return end | ||||||
| 	DedicatedBuffer.alloc(self, #val) | 	DedicatedBuffer.alloc(self, #val) | ||||||
| 	writestring(self.buffer, self.point, val) | 	writestring(self.buffer, self.point, val) | ||||||
| end | end | ||||||
|  |  | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| --!strict | --!strict | ||||||
| return function(): number? | return function(): number? | ||||||
| 	return tonumber(string.sub(tostring(Random.new():NextNumber()), 3, 6)) | 	return tonumber(string.sub(tostring(Random.new():NextNumber()), 3, 7)) -- 4 digits | ||||||
| end | end | ||||||
|  | @ -5,19 +5,26 @@ local SerInt = 0 | ||||||
| local Event = require(script.Parent.Parent.Event).Reliable | local Event = require(script.Parent.Parent.Event).Reliable | ||||||
| local Assert = require(script.Parent.Assert) | local Assert = require(script.Parent.Assert) | ||||||
| 
 | 
 | ||||||
| return function(Identifier: string): number | return function(Identifier: string, timeout: number?): number | ||||||
| 	Assert(typeof(Identifier) == "string", "Identifier must be a string type.") | 	Assert(typeof(Identifier) == "string", "Identifier must be a string type.") | ||||||
| 	Assert(SerInt < 255, "reached max 255 identifiers.") | 	Assert(SerInt < 255, "reached max 255 identifiers.") | ||||||
| 	if RunService:IsServer() then | 	if RunService:IsServer() then | ||||||
| 		if not Event:GetAttribute(Identifier) then | 		if not Event:GetAttribute(Identifier) then | ||||||
| 			SerInt += 1 | 			SerInt += 1 | ||||||
| 			Event:SetAttribute(Identifier, SerInt) | 			Event:SetAttribute(Identifier, SerInt) | ||||||
| 			--Event:SetAttribute(Identifier, string.pack("I1", SerInt)) -- I1 -> 255 max, I2 -> ~ 6.5e4 max. (SerInt) | 			--Event:SetAttribute(Identifier, string.pack("I1", SerInt)) -- I1 -> 255 max, I2 -> ~ 6.5e4 max. (SerInt), removed/disabled for buffer migration. | ||||||
| 		end | 		end | ||||||
| 	else | 	else | ||||||
| 		while not Event:GetAttribute(Identifier) do | 		local retreived = false | ||||||
|  | 		task.delay(timeout or 10,  function() | ||||||
|  | 			if retreived then return end | ||||||
|  | 			retreived = true | ||||||
|  | 			error(`Serdes: {Identifier} is taking too long to retrieve, seems like not replicated on server.`, 2) | ||||||
|  | 		end) | ||||||
|  | 		while (not retreived) and (not Event:GetAttribute(Identifier)) do | ||||||
| 			task.wait(0.5) | 			task.wait(0.5) | ||||||
| 		end | 		end | ||||||
|  | 		retreived = true | ||||||
| 	end | 	end | ||||||
| 	return Event:GetAttribute(Identifier) | 	return Event:GetAttribute(Identifier) | ||||||
| end | end | ||||||
|  | @ -25,10 +25,10 @@ function Index.Server(Identifier: string, rateLimit: Type.rateLimitArg?): Type.S | ||||||
| 	Assert(typeof(Identifier) == "string", `[Warp]: Identifier must be a string type, got {typeof(Identifier)}`) | 	Assert(typeof(Identifier) == "string", `[Warp]: Identifier must be a string type, got {typeof(Identifier)}`) | ||||||
| 	return require(Server.Index)(Identifier, rateLimit) :: Type.Server | 	return require(Server.Index)(Identifier, rateLimit) :: Type.Server | ||||||
| end | end | ||||||
| function Index.Client(Identifier: string): Type.Client | function Index.Client(Identifier: string, yieldWait: number?): Type.Client | ||||||
| 	Assert(not IsServer, `[Warp]: Calling .Client({Identifier}) on server side (expected client side)`) | 	Assert(not IsServer, `[Warp]: Calling .Client({Identifier}) on server side (expected client side)`) | ||||||
| 	Assert(typeof(Identifier) == "string", `[Warp]: Identifier must be a string type, got {typeof(Identifier)}`) | 	Assert(typeof(Identifier) == "string", `[Warp]: Identifier must be a string type, got {typeof(Identifier)}`) | ||||||
| 	return require(Client.Index)(Identifier) :: Type.Client | 	return require(Client.Index)(Identifier, yieldWait) :: Type.Client | ||||||
| end | end | ||||||
| 
 | 
 | ||||||
| function Index.fromServerArray(arrays: { any }): Type.fromServerArray | function Index.fromServerArray(arrays: { any }): Type.fromServerArray | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| -- Warp Library (@Eternity_Devs) | -- Warp Library (@Eternity_Devs) | ||||||
| -- version 1.0.8 | -- version 1.0.9 | ||||||
| --!strict | --!strict | ||||||
| --!native | --!native | ||||||
| --!optimize 2 | --!optimize 2 | ||||||
|  |  | ||||||
|  | @ -1,6 +1,6 @@ | ||||||
| [package] | [package] | ||||||
| name = "imezx/warp" | name = "imezx/warp" | ||||||
| version = "1.0.8" | version = "1.0.9" | ||||||
| registry = "https://github.com/UpliftGames/wally-index" | registry = "https://github.com/UpliftGames/wally-index" | ||||||
| realm = "shared" | realm = "shared" | ||||||
| license = "MIT" | license = "MIT" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue