com.wallstop-studios.dxmessaging 2.0.0 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/.github/workflows/format-on-demand.yml +2 -2
  2. package/.github/workflows/json-format-check.yml +1 -1
  3. package/.github/workflows/markdown-json.yml +1 -1
  4. package/.github/workflows/markdownlint.yml +1 -1
  5. package/.github/workflows/npm-publish.yml +1 -1
  6. package/.github/workflows/prettier-autofix.yml +2 -2
  7. package/.github/workflows/yaml-format-lint.yml +1 -1
  8. package/Docs/Advanced.md +26 -1
  9. package/Docs/Comparisons.md +1229 -146
  10. package/Docs/Compatibility.md +27 -0
  11. package/Docs/DesignAndArchitecture.md +41 -34
  12. package/Docs/EmitShorthands.md +34 -0
  13. package/Docs/Helpers.md +91 -76
  14. package/Docs/Index.md +28 -25
  15. package/Docs/Install.md +29 -6
  16. package/Docs/Integrations/Reflex.md +292 -0
  17. package/{package-lock.json.meta → Docs/Integrations/Reflex.md.meta} +1 -1
  18. package/Docs/Integrations/VContainer.md +324 -0
  19. package/Docs/Integrations/VContainer.md.meta +7 -0
  20. package/Docs/Integrations/Zenject.md +333 -0
  21. package/Docs/Integrations/Zenject.md.meta +7 -0
  22. package/{Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.pdb.meta → Docs/Integrations.meta} +2 -1
  23. package/Docs/InterceptorsAndOrdering.md +371 -17
  24. package/Docs/ListeningPatterns.md +206 -0
  25. package/Docs/MessageBusProviders.md +496 -0
  26. package/Docs/MessageBusProviders.md.meta +7 -0
  27. package/Docs/MessageTypes.md +27 -0
  28. package/Docs/MigrationGuide.md +45 -0
  29. package/Docs/Patterns.md +286 -0
  30. package/Docs/Performance.md +9 -9
  31. package/Docs/QuickReference.md +31 -0
  32. package/Docs/QuickStart.md +1 -2
  33. package/Docs/RuntimeConfiguration.md +407 -0
  34. package/Docs/RuntimeConfiguration.md.meta +7 -0
  35. package/Docs/UnityIntegration.md +3 -1
  36. package/Docs/VisualGuide.md +206 -157
  37. package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
  38. package/README.md +148 -26
  39. package/Runtime/AssemblyInfo.cs +4 -0
  40. package/Runtime/Core/Attributes/DxAutoConstructorAttribute.cs +1 -1
  41. package/Runtime/Core/Attributes/DxBroadcastMessageAttribute.cs +1 -1
  42. package/Runtime/Core/Attributes/DxOptionalParameterAttribute.cs +1 -1
  43. package/Runtime/Core/Attributes/DxTargetedMessageAttribute.cs +1 -1
  44. package/Runtime/Core/Attributes/DxUntargetedMessageAttribute.cs +1 -1
  45. package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
  46. package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
  47. package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
  48. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
  49. package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
  50. package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
  51. package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
  52. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
  53. package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
  54. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
  55. package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
  56. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
  57. package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
  58. package/Runtime/Core/MessageHandler.cs +198 -27
  59. package/Runtime/Core/MessageRegistrationToken.cs +67 -25
  60. package/Runtime/Core/Messages/IBroadcastMessage.cs +1 -1
  61. package/Runtime/Core/Messages/ITargetedMessage.cs +1 -1
  62. package/Runtime/Core/Messages/IUntargetedMessage.cs +1 -1
  63. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
  64. package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
  65. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
  66. package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
  67. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
  68. package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
  69. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
  70. package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
  71. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
  72. package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
  73. package/Runtime/Unity/Integrations/Reflex.meta +8 -0
  74. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
  75. package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
  76. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
  77. package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
  78. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
  79. package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
  80. package/Runtime/Unity/Integrations/VContainer.meta +8 -0
  81. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
  82. package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
  83. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
  84. package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
  85. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
  86. package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
  87. package/Runtime/Unity/Integrations/Zenject.meta +8 -0
  88. package/Runtime/Unity/Integrations.meta +8 -0
  89. package/Runtime/Unity/MessageAwareComponent.cs +102 -0
  90. package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
  91. package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
  92. package/Runtime/Unity/MessagingComponent.cs +175 -9
  93. package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
  94. package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
  95. package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
  96. package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
  97. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
  98. package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
  99. package/Samples~/DI/Prefabs.meta +8 -0
  100. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
  101. package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
  102. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
  103. package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
  104. package/Samples~/DI/Providers.meta +8 -0
  105. package/Samples~/DI/README.md +51 -0
  106. package/Samples~/DI/README.md.meta +7 -0
  107. package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
  108. package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
  109. package/Samples~/DI/Reflex.meta +8 -0
  110. package/Samples~/DI/VContainer/SampleLifetimeScope.cs +79 -0
  111. package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
  112. package/Samples~/DI/VContainer.meta +8 -0
  113. package/Samples~/DI/Zenject/SampleInstaller.cs +65 -0
  114. package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
  115. package/Samples~/DI/Zenject.meta +8 -0
  116. package/Samples~/DI.meta +8 -0
  117. package/Samples~/Mini Combat/README.md +5 -7
  118. package/Samples~/Mini Combat/Walkthrough.md +18 -24
  119. package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
  120. package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
  121. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
  122. package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
  123. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
  124. package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
  125. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
  126. package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
  127. package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
  128. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
  129. package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
  130. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
  131. package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
  132. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
  133. package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
  134. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
  135. package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
  136. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
  137. package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
  138. package/Tests/Runtime/Core/Extensions.meta +8 -0
  139. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
  140. package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
  141. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
  142. package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
  143. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
  144. package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
  145. package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
  146. package/Tests/Runtime/Core/NominalTests.cs +2 -2
  147. package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
  148. package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
  149. package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
  150. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
  151. package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
  152. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
  153. package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
  154. package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
  155. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
  156. package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
  157. package/Tests/Runtime/Integrations/Reflex.meta +8 -0
  158. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
  159. package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
  160. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
  161. package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
  162. package/Tests/Runtime/Integrations/VContainer.meta +8 -0
  163. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
  164. package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
  165. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
  166. package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
  167. package/Tests/Runtime/Integrations/Zenject.meta +8 -0
  168. package/Tests/Runtime/Integrations.meta +8 -0
  169. package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
  170. package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
  171. package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
  172. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
  173. package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
  174. package/Tests/Runtime/TestUtilities.meta +9 -0
  175. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
  176. package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
  177. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
  178. package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
  179. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
  180. package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
  181. package/Tests/Runtime/Unity.meta +9 -0
  182. package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
  183. package/package.json +1 -1
@@ -0,0 +1,383 @@
1
+ namespace DxMessaging.Core.MessageBus
2
+ {
3
+ using System;
4
+ using System.Threading;
5
+ using DxMessaging.Core;
6
+
7
+ /// <summary>
8
+ /// Options controlling how <see cref="MessageRegistrationBuilder"/> constructs registration tokens.
9
+ /// </summary>
10
+ /// <remarks>
11
+ /// These options let you override the message bus used by the generated token, opt into diagnostics,
12
+ /// and register lifecycle callbacks that are triggered when the returned <see cref="MessageRegistrationLease"/> is
13
+ /// activated or disposed.
14
+ /// </remarks>
15
+ /// <example>
16
+ /// <code>
17
+ /// var options = new MessageRegistrationBuildOptions
18
+ /// {
19
+ /// ActivateOnBuild = true,
20
+ /// EnableDiagnostics = true,
21
+ /// Configure = token =>
22
+ /// {
23
+ /// _ = token.RegisterUntargeted&lt;SimpleUntargetedMessage&gt;(OnMessage);
24
+ /// },
25
+ /// Lifecycle = new MessageRegistrationLifecycle(
26
+ /// onBuild: token => Debug.Log("Configured"),
27
+ /// onActivate: token => Debug.Log("Enabled"),
28
+ /// onDeactivate: token => Debug.Log("Disabled"),
29
+ /// onDispose: token => Debug.Log("Disposed"))
30
+ /// };
31
+ ///
32
+ /// using MessageRegistrationLease lease = registrationBuilder.Build(options);
33
+ /// // token is activated automatically because ActivateOnBuild = true
34
+ /// </code>
35
+ /// </example>
36
+ public sealed class MessageRegistrationBuildOptions
37
+ {
38
+ /// <summary>
39
+ /// Explicit owner identifier for the underlying <see cref="MessageHandler"/>.
40
+ /// When omitted, a synthetic identifier is generated automatically.
41
+ /// </summary>
42
+ public InstanceId? Owner { get; set; }
43
+
44
+ #if UNITY_2017_1_OR_NEWER
45
+ /// <summary>
46
+ /// Unity object to treat as the owner. Overrides <see cref="Owner"/> when supplied.
47
+ /// </summary>
48
+ public UnityEngine.Object UnityOwner { get; set; }
49
+ #endif
50
+
51
+ /// <summary>
52
+ /// Overrides the message bus used for registrations. Falls back to provider/global bus when null.
53
+ /// </summary>
54
+ public IMessageBus PreferredMessageBus { get; set; }
55
+
56
+ /// <summary>
57
+ /// Overrides the provider used to resolve a message bus when <see cref="PreferredMessageBus"/> is null.
58
+ /// </summary>
59
+ public IMessageBusProvider MessageBusProvider { get; set; }
60
+
61
+ /// <summary>
62
+ /// Indicates whether the underlying <see cref="MessageHandler"/> starts in an active state.
63
+ /// </summary>
64
+ public bool HandlerStartsActive { get; set; } = true;
65
+
66
+ /// <summary>
67
+ /// Indicates whether <see cref="MessageRegistrationToken.Enable"/> should be invoked immediately.
68
+ /// </summary>
69
+ public bool ActivateOnBuild { get; set; }
70
+
71
+ /// <summary>
72
+ /// Enables <see cref="MessageRegistrationToken.DiagnosticMode"/> on the created token.
73
+ /// </summary>
74
+ public bool EnableDiagnostics { get; set; }
75
+
76
+ /// <summary>
77
+ /// Optional hook invoked after the token has been constructed but before lifecycle callbacks.
78
+ /// Use this to stage registrations.
79
+ /// </summary>
80
+ public Action<MessageRegistrationToken> Configure { get; set; }
81
+
82
+ /// <summary>
83
+ /// Lifecycle hooks that fire during build, activation, deactivation, and disposal.
84
+ /// </summary>
85
+ public MessageRegistrationLifecycle Lifecycle { get; set; }
86
+ }
87
+
88
+ /// <summary>
89
+ /// Lifecycle callbacks for registration leases.
90
+ /// </summary>
91
+ /// <remarks>
92
+ /// Callbacks run in the following order:
93
+ /// <list type="number">
94
+ /// <item><description><c>OnBuild</c> (invoked immediately after the lease is created, before activation).</description></item>
95
+ /// <item><description><c>OnActivate</c> (invoked when <see cref="MessageRegistrationLease.Activate"/> runs or when <see cref="MessageRegistrationBuildOptions.ActivateOnBuild"/> is set).</description></item>
96
+ /// <item><description><c>OnDeactivate</c> (invoked when <see cref="MessageRegistrationLease.Deactivate"/> runs or the lease is disposed while active).</description></item>
97
+ /// <item><description><c>OnDispose</c> (invoked during <see cref="MessageRegistrationLease.Dispose"/>).</description></item>
98
+ /// </list>
99
+ /// </remarks>
100
+ public readonly struct MessageRegistrationLifecycle
101
+ {
102
+ public MessageRegistrationLifecycle(
103
+ Action<MessageRegistrationToken> onBuild,
104
+ Action<MessageRegistrationToken> onActivate,
105
+ Action<MessageRegistrationToken> onDeactivate,
106
+ Action<MessageRegistrationToken> onDispose
107
+ )
108
+ {
109
+ OnBuild = onBuild;
110
+ OnActivate = onActivate;
111
+ OnDeactivate = onDeactivate;
112
+ OnDispose = onDispose;
113
+ }
114
+
115
+ public Action<MessageRegistrationToken> OnBuild { get; }
116
+
117
+ public Action<MessageRegistrationToken> OnActivate { get; }
118
+
119
+ public Action<MessageRegistrationToken> OnDeactivate { get; }
120
+
121
+ public Action<MessageRegistrationToken> OnDispose { get; }
122
+ }
123
+
124
+ /// <summary>
125
+ /// Represents the lifetime of a registration token constructed by the builder.
126
+ /// </summary>
127
+ /// <remarks>
128
+ /// A lease grants direct access to the created <see cref="MessageRegistrationToken"/>, holds a reference to the
129
+ /// underlying <see cref="MessageHandler"/>, and coordinates lifecycle callbacks supplied via
130
+ /// <see cref="MessageRegistrationBuildOptions.Lifecycle"/>.
131
+ /// </remarks>
132
+ public sealed class MessageRegistrationLease : IDisposable
133
+ {
134
+ private readonly MessageRegistrationToken _token;
135
+ private readonly MessageHandler _messageHandler;
136
+ private readonly IMessageBus _messageBus;
137
+ private readonly MessageRegistrationLifecycle _lifecycle;
138
+ private bool _isActive;
139
+ private bool _disposed;
140
+
141
+ internal MessageRegistrationLease(
142
+ MessageRegistrationToken token,
143
+ MessageHandler messageHandler,
144
+ IMessageBus messageBus,
145
+ MessageRegistrationLifecycle lifecycle
146
+ )
147
+ {
148
+ _token = token ?? throw new ArgumentNullException(nameof(token));
149
+ _messageHandler =
150
+ messageHandler ?? throw new ArgumentNullException(nameof(messageHandler));
151
+ _messageBus = messageBus;
152
+ _lifecycle = lifecycle;
153
+ _isActive = false;
154
+ _disposed = false;
155
+ }
156
+
157
+ /// <summary>
158
+ /// Gets the registration token created for this lease.
159
+ /// </summary>
160
+ public MessageRegistrationToken Token => _token;
161
+
162
+ /// <summary>
163
+ /// Gets the handler hosting the lease's registrations.
164
+ /// </summary>
165
+ public MessageHandler Handler => _messageHandler;
166
+
167
+ /// <summary>
168
+ /// Gets the message bus that registrations created through this lease will target by default.
169
+ /// </summary>
170
+ public IMessageBus MessageBus => _messageBus;
171
+
172
+ /// <summary>
173
+ /// Gets the owner identifier associated with the underlying handler.
174
+ /// </summary>
175
+ public InstanceId Owner => _messageHandler.owner;
176
+
177
+ /// <summary>
178
+ /// Gets a value indicating whether the lease is currently active (token enabled).
179
+ /// </summary>
180
+ public bool IsActive => _isActive;
181
+
182
+ /// <summary>
183
+ /// Enables the token managed by this lease and raises the activation lifecycle callback if provided.
184
+ /// </summary>
185
+ /// <exception cref="ObjectDisposedException">Thrown if the lease has already been disposed.</exception>
186
+ public void Activate()
187
+ {
188
+ EnsureNotDisposed();
189
+ if (_isActive)
190
+ {
191
+ return;
192
+ }
193
+
194
+ _messageHandler.active = true;
195
+ _token.Enable();
196
+ if (_lifecycle.OnActivate != null)
197
+ {
198
+ _lifecycle.OnActivate(_token);
199
+ }
200
+
201
+ _isActive = true;
202
+ }
203
+
204
+ public void Deactivate()
205
+ {
206
+ if (_disposed || !_isActive)
207
+ {
208
+ return;
209
+ }
210
+
211
+ if (_lifecycle.OnDeactivate != null)
212
+ {
213
+ _lifecycle.OnDeactivate(_token);
214
+ }
215
+
216
+ _token.Disable();
217
+ _messageHandler.active = false;
218
+ _isActive = false;
219
+ }
220
+
221
+ public void Dispose()
222
+ {
223
+ if (_disposed)
224
+ {
225
+ return;
226
+ }
227
+
228
+ Deactivate();
229
+ if (_lifecycle.OnDispose != null)
230
+ {
231
+ _lifecycle.OnDispose(_token);
232
+ }
233
+
234
+ _disposed = true;
235
+ }
236
+
237
+ internal void InvokeBuildHook()
238
+ {
239
+ if (_lifecycle.OnBuild != null)
240
+ {
241
+ _lifecycle.OnBuild(_token);
242
+ }
243
+ }
244
+
245
+ private void EnsureNotDisposed()
246
+ {
247
+ if (_disposed)
248
+ {
249
+ throw new ObjectDisposedException(nameof(MessageRegistrationLease));
250
+ }
251
+ }
252
+ }
253
+
254
+ /// <summary>
255
+ /// Default implementation that composes message handlers, registration tokens, and lifecycle hooks.
256
+ /// </summary>
257
+ public sealed class MessageRegistrationBuilder : IMessageRegistrationBuilder
258
+ {
259
+ private readonly IMessageBusProvider _messageBusProvider;
260
+ private static int _syntheticOwnerCounter;
261
+
262
+ public MessageRegistrationBuilder()
263
+ {
264
+ _messageBusProvider = null;
265
+ }
266
+
267
+ public MessageRegistrationBuilder(IMessageBusProvider messageBusProvider)
268
+ {
269
+ _messageBusProvider = messageBusProvider;
270
+ }
271
+
272
+ /// <summary>
273
+ /// Creates a <see cref="MessageRegistrationLease"/> configured according to the supplied <paramref name="options"/>.
274
+ /// </summary>
275
+ /// <param name="options">Options controlling bus selection, diagnostics, and lifecycle behavior.</param>
276
+ /// <returns>A lease that wraps the created <see cref="MessageRegistrationToken"/>.</returns>
277
+ /// <exception cref="ArgumentNullException">Thrown when <paramref name="options"/> is <see langword="null"/>.</exception>
278
+ public MessageRegistrationLease Build(MessageRegistrationBuildOptions options)
279
+ {
280
+ if (options == null)
281
+ {
282
+ throw new ArgumentNullException(nameof(options));
283
+ }
284
+
285
+ IMessageBus messageBus = ResolveMessageBus(options);
286
+ InstanceId owner = ResolveOwner(options);
287
+ MessageHandler messageHandler = new MessageHandler(owner, messageBus);
288
+ messageHandler.active = options.HandlerStartsActive;
289
+ MessageRegistrationToken token = MessageRegistrationToken.Create(
290
+ messageHandler,
291
+ messageBus
292
+ );
293
+ token.DiagnosticMode = options.EnableDiagnostics;
294
+ if (options.Configure != null)
295
+ {
296
+ options.Configure(token);
297
+ }
298
+
299
+ MessageRegistrationLease lease = new MessageRegistrationLease(
300
+ token,
301
+ messageHandler,
302
+ messageBus,
303
+ options.Lifecycle
304
+ );
305
+ lease.InvokeBuildHook();
306
+
307
+ if (options.ActivateOnBuild)
308
+ {
309
+ lease.Activate();
310
+ }
311
+
312
+ return lease;
313
+ }
314
+
315
+ private static InstanceId ResolveOwner(MessageRegistrationBuildOptions options)
316
+ {
317
+ #if UNITY_2017_1_OR_NEWER
318
+ if (options.UnityOwner != null)
319
+ {
320
+ if (options.UnityOwner is UnityEngine.GameObject gameObject)
321
+ {
322
+ return gameObject;
323
+ }
324
+
325
+ if (options.UnityOwner is UnityEngine.Component component)
326
+ {
327
+ return component;
328
+ }
329
+
330
+ return new InstanceId(options.UnityOwner.GetInstanceID());
331
+ }
332
+ #endif
333
+ if (options.Owner.HasValue)
334
+ {
335
+ return options.Owner.Value;
336
+ }
337
+
338
+ int generatedId = Interlocked.Decrement(ref _syntheticOwnerCounter);
339
+
340
+ InstanceId syntheticOwner = new InstanceId(generatedId);
341
+ return syntheticOwner;
342
+ }
343
+
344
+ private IMessageBus ResolveMessageBus(MessageRegistrationBuildOptions options)
345
+ {
346
+ if (options.PreferredMessageBus != null)
347
+ {
348
+ return options.PreferredMessageBus;
349
+ }
350
+
351
+ IMessageBusProvider effectiveProvider =
352
+ options.MessageBusProvider ?? _messageBusProvider;
353
+ if (effectiveProvider != null)
354
+ {
355
+ IMessageBus resolved = effectiveProvider.Resolve();
356
+ if (resolved != null)
357
+ {
358
+ return resolved;
359
+ }
360
+ }
361
+
362
+ return null;
363
+ }
364
+ }
365
+
366
+ /// <summary>
367
+ /// Simple provider that always resolves to the supplied bus instance.
368
+ /// </summary>
369
+ public sealed class FixedMessageBusProvider : IMessageBusProvider
370
+ {
371
+ private readonly IMessageBus _messageBus;
372
+
373
+ public FixedMessageBusProvider(IMessageBus messageBus)
374
+ {
375
+ _messageBus = messageBus ?? throw new ArgumentNullException(nameof(messageBus));
376
+ }
377
+
378
+ public IMessageBus Resolve()
379
+ {
380
+ return _messageBus;
381
+ }
382
+ }
383
+ }
@@ -0,0 +1,11 @@
1
+ fileFormatVersion: 2
2
+ guid: 89a06b71fd525914b9374ef5316173ca
3
+ MonoImporter:
4
+ externalObjects: {}
5
+ serializedVersion: 2
6
+ defaultReferences: []
7
+ executionOrder: 0
8
+ icon: {instanceID: 0}
9
+ userData:
10
+ assetBundleName:
11
+ assetBundleVariant: