diff options
Diffstat (limited to 'internal/pipewire/core.go')
| -rw-r--r-- | internal/pipewire/core.go | 251 |
1 files changed, 154 insertions, 97 deletions
diff --git a/internal/pipewire/core.go b/internal/pipewire/core.go index 026f75bb..b0d82b44 100644 --- a/internal/pipewire/core.go +++ b/internal/pipewire/core.go @@ -84,8 +84,8 @@ const ( FOOTER_CORE_OPCODE_LAST ) -// The FooterCoreGeneration indicates to the client what is the current -// registry generation number of the Context on the server side. +// The FooterCoreGeneration indicates to the client what is the current registry +// generation number of the Context on the server side. // // The server shall include this footer in the next message it sends that // follows the increment of the registry generation number. @@ -99,12 +99,12 @@ func (fcg FooterCoreGeneration) Size() Word { Size(SizeLong) } -// The FooterClientGeneration indicates to the server what is the last -// registry generation number the client has processed. +// The FooterClientGeneration indicates to the server what is the last registry +// generation number the client has processed. // -// The client shall include this footer in the next message it sends, -// after it has processed an incoming message whose footer includes a -// registry generation update. +// The client shall include this footer in the next message it sends, after it +// has processed an incoming message whose footer includes a registry generation +// update. type FooterClientGeneration struct { ClientGeneration Long `json:"client_generation"` } @@ -115,8 +115,8 @@ func (fcg FooterClientGeneration) Size() Word { Size(SizeLong) } -// A CoreInfo event is emitted by the server upon connection -// with the more information about the server. +// A CoreInfo event is emitted by the server upon connection with the more +// information about the server. type CoreInfo struct { // The id of the server (PW_ID_CORE). ID Int `json:"id"` @@ -132,7 +132,8 @@ type CoreInfo struct { Name String `json:"name"` // A set of bits with changes to the info. ChangeMask Long `json:"change_mask"` - // Optional key/value properties, valid when change_mask has PW_CORE_CHANGE_MASK_PROPS. + // Optional key/value properties, valid when change_mask has + // PW_CORE_CHANGE_MASK_PROPS. Properties *SPADict `json:"props"` } @@ -184,12 +185,13 @@ func (c *CoreDone) MarshalBinary() ([]byte, error) { return Marshal(c) } // UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal]. func (c *CoreDone) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } -// The CorePing event is emitted by the server when it wants to check if a client is -// alive or ensure that it has processed the previous events. +// The CorePing event is emitted by the server when it wants to check if a +// client is alive or ensure that it has processed the previous events. type CorePing struct { // The object id to ping. ID Int `json:"id"` // Usually automatically generated. + // // The client should pass this in the Pong method reply. Sequence Int `json:"seq"` } @@ -212,13 +214,12 @@ func (c *CorePing) UnmarshalBinary(data []byte) error { return Unmarshal(data, c // The CoreError can be emitted by both the client and the server. // // When emitted by the server, the error event is sent out when a fatal -// (non-recoverable) error has occurred. The id argument is the proxy -// object where the error occurred, most often in response to a request -// to that object. The message is a brief description of the error, for -// (debugging) convenience. +// (non-recoverable) error has occurred. The id argument is the proxy object +// where the error occurred, most often in response to a request to that object. +// The message is a brief description of the error, for (debugging) convenience. // -// When emitted by the client, it indicates an error occurred in an -// object on the client. +// When emitted by the client, it indicates an error occurred in an object on +// the client. type CoreError struct { // The id of the resource (proxy if emitted by the client) that is in error. ID Int `json:"id"` @@ -270,9 +271,9 @@ func (c *CoreErrorEvent) Opcode() byte { return PW_CORE_EVENT_ERROR } // The CoreRemoveId event is used internally by the object ID management logic. // -// When a client deletes an object, the server will send this event to acknowledge -// that it has seen the delete request. When the client receives this event, it -// will know that it can safely reuse the object ID. +// When a client deletes an object, the server will send this event to +// acknowledge that it has seen the delete request. When the client receives +// this event, it will know that it can safely reuse the object ID. type CoreRemoveId struct { // A proxy id that was removed. ID Int `json:"id"` @@ -293,8 +294,8 @@ func (c *CoreRemoveId) MarshalBinary() ([]byte, error) { return Marshal(c) } // UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal]. func (c *CoreRemoveId) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } -// The CoreBoundProps event is emitted when a local object ID is bound to a global ID. -// It is emitted before the global becomes visible in the registry. +// The CoreBoundProps event is emitted when a local object ID is bound to a +// global ID. It is emitted before the global becomes visible in the registry. type CoreBoundProps struct { // A proxy id. ID Int `json:"id"` @@ -334,8 +335,8 @@ type noAck struct{} // setBoundProps should never be called as this proxy should never be targeted by [CoreBoundProps]. func (noAck) setBoundProps(*CoreBoundProps) error { panic(ErrBadBoundProps) } -// ErrBadRemove is returned when a [CoreRemoveId] event targeting a proxy -// that should never be targeted is received and processed. +// ErrBadRemove is returned when a [CoreRemoveId] event targeting a proxy that +// should never be targeted is received and processed. var ErrBadRemove = errors.New("attempting to remove a proxy that should never be targeted") // noRemove is embedded by proxies that are never targeted by [CoreRemoveId]. @@ -344,11 +345,14 @@ type noRemove struct{} // remove should never be called as this proxy should never be targeted by [CoreRemoveId]. func (noRemove) remove() error { panic(ErrBadRemove) } -// ErrInvalidRemove is returned when a proxy is somehow removed twice. This is only reached for -// an implementation error as the proxy struct should no longer be reachable after the first call. +// ErrInvalidRemove is returned when a proxy is somehow removed twice. +// +// This is only reached for an implementation error as the proxy struct should +// no longer be reachable after the first call. var ErrInvalidRemove = errors.New("attempting to remove an already freed proxy") -// removable is embedded by proxies that can be targeted by [CoreRemoveId] and requires no cleanup. +// removable is embedded by proxies that can be targeted by [CoreRemoveId] and +// requires no cleanup. type removable bool // remove checks against removal of a freed proxy and marks the proxy as removed. @@ -360,21 +364,27 @@ func (s *removable) remove() error { return nil } -// ErrProxyDestroyed is returned when attempting to use a proxy method when the underlying -// proxy has already been targeted by a [CoreRemoveId] event. +// ErrProxyDestroyed is returned when attempting to use a proxy method when the +// underlying proxy has already been targeted by a [CoreRemoveId] event. var ErrProxyDestroyed = errors.New("underlying proxy has been removed") -// checkDestroy returns [ErrProxyDestroyed] if the current proxy has been destroyed. -// Must be called at the beginning of any exported method of a proxy embedding removable. +// checkDestroy returns [ErrProxyDestroyed] if the current proxy has been +// destroyed. +// +// Must be called at the beginning of any exported method of a proxy embedding +// removable. func (s *removable) checkDestroy() error { if *s { - // not fatal: the caller is allowed to recover from this and allocate a new proxy + // not fatal: the caller is allowed to recover from this and allocate a + // new proxy return ErrProxyDestroyed } return nil } -// mustCheckDestroy calls checkDestroy and panics if a non-nil error is returned. +// mustCheckDestroy calls checkDestroy and panics if a non-nil error is +// returned. +// // This is useful for non-exported methods as they should become unreachable. func (s *removable) mustCheckDestroy() { if err := s.checkDestroy(); err != nil { @@ -382,17 +392,19 @@ func (s *removable) mustCheckDestroy() { } } -// destructible is embedded by proxies that can be targeted by the [CoreRemoveId] event and the -// [CoreDestroy] method and requires no cleanup. destructible purposefully does not override -// removable.mustCheckDestroy because it is used by unexported methods called during event handling -// and are exempt from the destruction check. +// destructible is embedded by proxies that can be targeted by the +// [CoreRemoveId] event and the [CoreDestroy] method and requires no cleanup. +// destructible purposefully does not override removable.mustCheckDestroy +// because it is used by unexported methods called during event handling and are +// exempt from the destruction check. type destructible struct { destroyed bool removable } -// checkDestroy overrides removable.checkDestroy to also check the destroyed field. +// checkDestroy overrides removable.checkDestroy to also check the destroyed +// field. func (s *destructible) checkDestroy() error { if s.destroyed { return ErrProxyDestroyed @@ -403,7 +415,8 @@ func (s *destructible) checkDestroy() error { return nil } -// destroy calls removable.checkDestroy then queues a [CoreDestroy] event if it succeeds. +// destroy calls removable.checkDestroy then queues a [CoreDestroy] event if it +// succeeds. func (s *destructible) destroy(ctx *Context, id Int) error { if err := s.checkDestroy(); err != nil { return err @@ -417,8 +430,10 @@ func (s *destructible) destroy(ctx *Context, id Int) error { return ctx.GetCore().destroy(id) } -// An InconsistentIdError describes an inconsistent state where the server claims an impossible -// proxy or global id. This is only generated by the [CoreBoundProps] event. +// An InconsistentIdError describes an inconsistent state where the server claims +// an impossible proxy or global id. +// +// This is only generated by the [CoreBoundProps] event. type InconsistentIdError struct { // Whether the inconsistent id is the global resource id. Global bool @@ -434,8 +449,9 @@ func (e *InconsistentIdError) Error() string { name = "global" } - return name + " id " + strconv.Itoa(int(e.ID)) + " targeting " + e.Proxy.String() + - " inconsistent with " + strconv.Itoa(int(e.ServerID)) + " claimed by the server" + return name + " id " + strconv.Itoa(int(e.ID)) + " targeting " + + e.Proxy.String() + " inconsistent with " + + strconv.Itoa(int(e.ServerID)) + " claimed by the server" } // CoreHello is the first message sent by a client. @@ -460,7 +476,9 @@ func (c *CoreHello) MarshalBinary() ([]byte, error) { return Marshal(c) } func (c *CoreHello) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } // hello queues a [CoreHello] message for the PipeWire server. -// This method should not be called directly, the [New] function queues this message. +// +// This method should not be called directly, the [New] function queues this +// message. func (core *Core) hello() error { return core.ctx.writeMessage( PW_ID_CORE, @@ -469,13 +487,14 @@ func (core *Core) hello() error { } const ( - // CoreSyncSequenceOffset is the offset to [Header.Sequence] to produce [CoreSync.Sequence]. + // CoreSyncSequenceOffset is the offset to [Header.Sequence] to produce + // [CoreSync.Sequence]. CoreSyncSequenceOffset = 0x40000000 ) -// The CoreSync message will result in a Done event from the server. -// When the Done event is received, the client can be sure that all -// operations before the Sync method have been completed. +// The CoreSync message will result in a Done event from the server. When the +// Done event is received, the client can be sure that all operations before the +// Sync method have been completed. type CoreSync struct { // The id will be returned in the Done event. ID Int `json:"id"` @@ -499,6 +518,7 @@ func (c *CoreSync) MarshalBinary() ([]byte, error) { return Marshal(c) } func (c *CoreSync) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } // sync queues a [CoreSync] message for the PipeWire server. +// // This is not safe to use directly, callers should use Sync instead. func (core *Core) sync(id Int) error { return core.ctx.writeMessage( @@ -507,9 +527,11 @@ func (core *Core) sync(id Int) error { ) } -// ErrNotDone is returned if [Core.Sync] returns from its [Context.Roundtrip] without -// receiving a [CoreDone] event targeting the [CoreSync] event it delivered. -var ErrNotDone = errors.New("did not receive a Core::Done event targeting previously delivered Core::Sync") +// ErrNotDone is returned if [Core.Sync] returns from its [Context.Roundtrip] +// without receiving a [CoreDone] event targeting the [CoreSync] event it +// delivered. +var ErrNotDone = errors.New("did not receive a Core::Done event " + + "targeting previously delivered Core::Sync") const ( // syncTimeout is the maximum duration [Core.Sync] is allowed to take before @@ -517,7 +539,8 @@ const ( syncTimeout = RoundtripTimeout + 15*time.Second ) -// Sync queues a [CoreSync] message for the PipeWire server and initiates a Roundtrip. +// Sync queues a [CoreSync] message for the PipeWire server and initiates a +// Roundtrip. func (core *Core) Sync() error { core.done = false if err := core.sync(roundtripSyncID); err != nil { @@ -537,16 +560,31 @@ func (core *Core) Sync() error { if len(core.ctx.pendingIds) != 0 { core.ctx.closeReceivedFiles() - return &ProxyFatalError{Err: UnacknowledgedProxyError(slices.Collect(maps.Keys(core.ctx.pendingIds))), ProxyErrs: core.ctx.cloneAsProxyErrors()} + return &ProxyFatalError{ + Err: UnacknowledgedProxyError(slices.Collect( + maps.Keys( + core.ctx.pendingIds, + )), + ), + ProxyErrs: core.ctx.cloneAsProxyErrors(), + } } if len(core.ctx.pendingDestruction) != 0 { core.ctx.closeReceivedFiles() - return &ProxyFatalError{Err: UnacknowledgedProxyDestructionError(slices.Collect(maps.Keys(core.ctx.pendingDestruction))), ProxyErrs: core.ctx.cloneAsProxyErrors()} + return &ProxyFatalError{ + Err: UnacknowledgedProxyDestructionError(slices.Collect( + maps.Keys( + core.ctx.pendingDestruction, + )), + ), + ProxyErrs: core.ctx.cloneAsProxyErrors(), + } } return core.ctx.doSyncComplete() } -// The CorePong message is sent from the client to the server when the server emits the Ping event. +// The CorePong message is sent from the client to the server when the server +// emits the Ping event. type CorePong struct { // Copied from [CorePing.ID]. ID Int `json:"id"` @@ -569,18 +607,18 @@ func (c *CorePong) MarshalBinary() ([]byte, error) { return Marshal(c) } // UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal]. func (c *CorePong) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } -// CoreGetRegistry is sent when a client requests to bind to the -// registry object and list the available objects on the server. +// CoreGetRegistry is sent when a client requests to bind to the registry object +// and list the available objects on the server. // -// Like with all bindings, first the client allocates a new proxy -// id and puts this as the new_id field. Methods and Events can -// then be sent and received on the new_id (in the message Id field). +// Like with all bindings, first the client allocates a new proxy id and puts +// this as the new_id field. Methods and Events can then be sent and received on +// the new_id (in the message Id field). type CoreGetRegistry struct { // The version of the registry interface used on the client, // usually PW_VERSION_REGISTRY. Version Int `json:"version"` - // The id of the new proxy with the registry interface, - // ends up as [Header.ID] in future messages. + // The id of the new proxy with the registry interface, ends up as + // [Header.ID] in future messages. NewID Int `json:"new_id"` } @@ -599,8 +637,8 @@ func (c *CoreGetRegistry) MarshalBinary() ([]byte, error) { return Marshal(c) } // UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal]. func (c *CoreGetRegistry) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } -// GetRegistry queues a [CoreGetRegistry] message for the PipeWire server -// and returns the address of the newly allocated [Registry]. +// GetRegistry queues a [CoreGetRegistry] message for the PipeWire server and +// returns the address of the newly allocated [Registry]. func (ctx *Context) GetRegistry() (*Registry, error) { registry := Registry{Objects: make(map[Int]RegistryGlobal), ctx: ctx} newId := ctx.newProxyId(®istry, false) @@ -611,18 +649,17 @@ func (ctx *Context) GetRegistry() (*Registry, error) { ) } -// CoreCreateObject is sent when the client requests to create a -// new object from a factory of a certain type. +// CoreCreateObject is sent when the client requests to create a new object from +// a factory of a certain type. // -// The client allocates a new_id for the proxy. The server will -// allocate a new resource with the same new_id and from then on, -// Methods and Events will be exchanged between the new object of -// the given type. +// The client allocates a new_id for the proxy. The server will allocate a new +// resource with the same new_id and from then on, Methods and Events will be +// exchanged between the new object of the given type. type CoreCreateObject struct { // The name of a server factory object to use. FactoryName String `json:"factory_name"` - // The type of the object to create, this is also the type of - // the interface of the new_id proxy. + // The type of the object to create, this is also the type of the interface + // of the new_id proxy. Type String `json:"type"` // Undocumented, assumed to be the local version of the proxy. Version Int `json:"version"` @@ -655,7 +692,9 @@ func (c *CoreCreateObject) MarshalBinary() ([]byte, error) { return Marshal(c) } func (c *CoreCreateObject) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } // createObject queues a [CoreCreateObject] message for the PipeWire server. -// This is not safe to use directly, callers should use typed wrapper methods on [Registry] instead. +// +// This is not safe to use directly, callers should use typed wrapper methods on +// [Registry] instead. func (core *Core) createObject(factoryName, typeName String, version Int, props SPADict, newId Int) error { return core.ctx.writeMessage( PW_ID_CORE, @@ -685,8 +724,9 @@ func (c *CoreDestroy) MarshalBinary() ([]byte, error) { return Marshal(c) } func (c *CoreDestroy) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } // destroy queues a [CoreDestroy] message for the PipeWire server. -// This is not safe to use directly, callers should use the exported method -// on the proxy implementation instead. +// +// This is not safe to use directly, callers should use the exported method on +// the proxy implementation instead. func (core *Core) destroy(id Int) error { return core.ctx.writeMessage( PW_ID_CORE, @@ -754,10 +794,9 @@ func (c *RegistryGlobalRemove) MarshalBinary() ([]byte, error) { return Marshal( // UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal]. func (c *RegistryGlobalRemove) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } -// RegistryBind is sent when the client requests to bind to the -// global object with id and use the client proxy with new_id as -// the proxy. After this call, methods can be sent to the remote -// global object and events can be received. +// RegistryBind is sent when the client requests to bind to the global object +// with id and use the client proxy with new_id as the proxy. After this call, +// methods can be sent to the remote global object and events can be received. type RegistryBind struct { // The [RegistryGlobal.ID] to bind to. ID Int `json:"id"` @@ -790,8 +829,8 @@ func (c *RegistryBind) MarshalBinary() ([]byte, error) { return Marshal(c) } // UnmarshalBinary satisfies [encoding.BinaryUnmarshaler] via [Unmarshal]. func (c *RegistryBind) UnmarshalBinary(data []byte) error { return Unmarshal(data, c) } -// bind queues a [RegistryBind] message for the PipeWire server -// and returns the newly allocated proxy id. +// bind queues a [RegistryBind] message for the PipeWire server and returns the +// newly allocated proxy id. func (registry *Registry) bind(proxy eventProxy, id, version Int) (Int, error) { bind := RegistryBind{ ID: id, @@ -806,6 +845,7 @@ func (registry *Registry) bind(proxy eventProxy, id, version Int) (Int, error) { } // RegistryDestroy is sent to try to destroy the global object with id. +// // This might fail when the client does not have permission. type RegistryDestroy struct { // The global id to destroy. @@ -864,7 +904,8 @@ func (registry *Registry) Destroy(id Int) (err error) { } } -// An UnsupportedObjectTypeError is the name of a type not known by the server [Registry]. +// An UnsupportedObjectTypeError is the name of a type not known by the server +// [Registry]. type UnsupportedObjectTypeError string func (e UnsupportedObjectTypeError) Error() string { return "unsupported object type " + string(e) } @@ -872,7 +913,8 @@ func (e UnsupportedObjectTypeError) Message() string { return e.Error() } // Core holds state of [PW_TYPE_INTERFACE_Core]. type Core struct { - // Additional information from the server, populated or updated during [Context.Roundtrip]. + // Additional information from the server, populated or updated during + // [Context.Roundtrip]. Info *CoreInfo `json:"info"` // Whether a [CoreDone] event was received during Sync. @@ -887,7 +929,8 @@ type Core struct { // ErrUnexpectedDone is a [CoreDone] event with unexpected values. var ErrUnexpectedDone = errors.New("multiple Core::Done events targeting Core::Sync") -// An UnknownProxyIdError describes an event targeting a proxy id that was never allocated. +// An UnknownProxyIdError describes an event targeting a proxy id that was never +// allocated. type UnknownProxyIdError[E any] struct { // Offending id decoded from Data. Id Int @@ -899,7 +942,8 @@ func (e *UnknownProxyIdError[E]) Error() string { return "unknown proxy id " + strconv.Itoa(int(e.Id)) } -// An InvalidPingError is a [CorePing] event targeting a proxy id that was never allocated. +// An InvalidPingError is a [CorePing] event targeting a proxy id that was never +// allocated. type InvalidPingError CorePing func (e *InvalidPingError) Error() string { @@ -917,7 +961,8 @@ func (core *Core) consume(opcode byte, files []int, unmarshal func(v any)) error case PW_CORE_EVENT_DONE: var done CoreDone unmarshal(&done) - if done.ID == roundtripSyncID && done.Sequence == CoreSyncSequenceOffset+core.ctx.currentSeq() { + if done.ID == roundtripSyncID && + done.Sequence == CoreSyncSequenceOffset+core.ctx.currentSeq() { if core.done { return ErrUnexpectedDone } @@ -956,7 +1001,10 @@ func (core *Core) consume(opcode byte, files []int, unmarshal func(v any)) error unmarshal(&coreRemoveId) if proxy, ok := core.ctx.proxy[coreRemoveId.ID]; !ok { // this should never happen so is non-recoverable if it does - panic(&UnknownProxyIdError[*CoreRemoveId]{Id: coreRemoveId.ID, Event: &coreRemoveId}) + panic(&UnknownProxyIdError[*CoreRemoveId]{ + Id: coreRemoveId.ID, + Event: &coreRemoveId}, + ) } else { delete(core.ctx.proxy, coreRemoveId.ID) // not always populated so this is not checked @@ -971,7 +1019,10 @@ func (core *Core) consume(opcode byte, files []int, unmarshal func(v any)) error delete(core.ctx.pendingIds, boundProps.ID) proxy, ok := core.ctx.proxy[boundProps.ID] if !ok { - return &UnknownProxyIdError[*CoreBoundProps]{Id: boundProps.ID, Event: &boundProps} + return &UnknownProxyIdError[*CoreBoundProps]{ + Id: boundProps.ID, + Event: &boundProps, + } } return proxy.setBoundProps(&boundProps) @@ -989,8 +1040,8 @@ type Registry struct { // Global objects received via the [RegistryGlobal] event. // - // This requires more processing before it can be used, but is not implemented - // as it is not used by Hakurei. + // This requires more processing before it can be used, but is not + // implemented as it is not used by Hakurei. Objects map[Int]RegistryGlobal `json:"objects"` ctx *Context @@ -999,7 +1050,8 @@ type Registry struct { noRemove } -// A GlobalIDCollisionError describes a [RegistryGlobal] event stepping on a previous instance of itself. +// A GlobalIDCollisionError describes a [RegistryGlobal] event stepping on a +// previous instance of itself. type GlobalIDCollisionError struct { // The colliding id. ID Int @@ -1012,8 +1064,9 @@ func (e *GlobalIDCollisionError) Error() string { " stepping on previous id " + strconv.Itoa(int(e.ID)) + " for " + e.Previous.Type } -// An UnknownGlobalIDRemoveError describes a [RegistryGlobalRemove] event announcing the removal of -// a global id that is not yet known to [Registry] or was already deleted. +// An UnknownGlobalIDRemoveError describes a [RegistryGlobalRemove] event +// announcing the removal of a global id that is not yet known to [Registry] or +// was already deleted. type UnknownGlobalIDRemoveError Int func (e UnknownGlobalIDRemoveError) Error() string { @@ -1028,7 +1081,11 @@ func (registry *Registry) consume(opcode byte, files []int, unmarshal func(v any unmarshal(&global) if object, ok := registry.Objects[global.ID]; ok { // this should never happen so is non-recoverable if it does - panic(&GlobalIDCollisionError{global.ID, &object, &global}) + panic(&GlobalIDCollisionError{ + global.ID, + &object, + &global, + }) } registry.Objects[global.ID] = global return nil @@ -1036,8 +1093,8 @@ func (registry *Registry) consume(opcode byte, files []int, unmarshal func(v any case PW_REGISTRY_EVENT_GLOBAL_REMOVE: var globalRemove RegistryGlobalRemove unmarshal(&globalRemove) - // server emits PW_CORE_EVENT_REMOVE_ID events targeting - // affected proxies so they do not need to be handled here + // server emits PW_CORE_EVENT_REMOVE_ID events targeting affected + // proxies so they do not need to be handled here l := len(registry.Objects) delete(registry.Objects, globalRemove.ID) if len(registry.Objects) != l-1 { |
