---
title: "Signals types & behavior"
description: "Object fields, option tables, and behavior for Signals."
---


## Native Connection wrappers

These are tables returned by getconnections, not the custom Signal connection type.

| Member | Type / call | Behavior |
| --- | --- | --- |
| Enabled | boolean or nil | Connection's current enabled state |
| ForeignState | boolean or nil | Whether the native thread belongs to another VM |
| LuaConnection | boolean or nil | Whether a Lua callback/wait slot is discoverable |
| Function | function or nil | Resolved callback |
| Thread | thread or nil | Resolved thread; foreign threads may not be exposed |
| Fire | connection:Fire(...) | Invokes this connection with arguments |
| Defer | connection:Defer(...) | Defers callback invocation |
| Disable | connection:Disable() | Temporarily disables the connection |
| Enable | connection:Enable() | Re-enables it |
| Disconnect | connection:Disconnect() | Disables it, marks the wrapper invalid, and removes its cache entry |

Use colon calls for wrapper methods. Unresolved/disconnected wrapper fields can be nil, and method access can resolve to a no-op. Do not assume every engine listener has a callable Function. Inspecting a connection is separate from permission to read a foreign VM's thread.

The wrapper's Disconnect does not call the native RBXScriptConnection:Disconnect and is not a guarantee of permanent engine disconnection. If you own the original RBXScriptConnection, use its Disconnect for permanent cleanup. Assigning Enabled does not change the native state: the wrapper's __newindex ignores assignments; use Disable/Enable.

For a native BindableEvent you created, an inspection pattern is:

~~~lua
local event = Instance.new("BindableEvent")
local listener = event.Event:Connect(function(value) print(value) end)
local connection = getconnection(event.Event, 1)
if connection then
    connection:Disable()
    connection:Enable()
    connection:Fire("direct callback")
    connection:Defer("deferred callback")
end
task.wait()
listener:Disconnect()
event:Destroy()
~~~

For the separate pure-Luau event emitter and all its methods, see [Custom Signal](/reference/signals/signalobject).
