diff --git a/package-lock.json b/package-lock.json index 86925242d..4c987fbf8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "license": "Apache-2.0", "dependencies": { "@actions/core": "^1.10.0", - "@dcl/protocol": "1.0.0-8299166777.commit-9493ffe", + "@dcl/protocol": "^1.0.0-8691799990.commit-4ba546c", "@dcl/quickjs-emscripten": "^0.21.0-3680274614.commit-1808aa1", "@dcl/ts-proto": "1.153.0", "@types/fs-extra": "^9.0.12", @@ -577,9 +577,9 @@ } }, "node_modules/@dcl/protocol": { - "version": "1.0.0-8299166777.commit-9493ffe", - "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8299166777.commit-9493ffe.tgz", - "integrity": "sha512-QgYSltXnQvDlt66BsxRJ/o77xOPWDH1ku+OE8jchohwyXEY8KD5UV/seNU2u+TM8iPMjE+9a40p2AAtAjBnsJQ==", + "version": "1.0.0-8691799990.commit-4ba546c", + "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8691799990.commit-4ba546c.tgz", + "integrity": "sha512-hU/8zZXdjgRSUvfi1QRL6YAMF/8QDS/hhh8cs4bE2dw9obXTziyekiR7IEwAOmF60wt/u6+s7JLIacHd35G+HQ==", "dependencies": { "@dcl/ts-proto": "1.154.0" } @@ -8232,9 +8232,9 @@ } }, "@dcl/protocol": { - "version": "1.0.0-8299166777.commit-9493ffe", - "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8299166777.commit-9493ffe.tgz", - "integrity": "sha512-QgYSltXnQvDlt66BsxRJ/o77xOPWDH1ku+OE8jchohwyXEY8KD5UV/seNU2u+TM8iPMjE+9a40p2AAtAjBnsJQ==", + "version": "1.0.0-8691799990.commit-4ba546c", + "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8691799990.commit-4ba546c.tgz", + "integrity": "sha512-hU/8zZXdjgRSUvfi1QRL6YAMF/8QDS/hhh8cs4bE2dw9obXTziyekiR7IEwAOmF60wt/u6+s7JLIacHd35G+HQ==", "requires": { "@dcl/ts-proto": "1.154.0" }, diff --git a/package.json b/package.json index a15159367..f783a0621 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "bugs": "https://github.com/decentraland/js-sdk-toolchain/issues", "dependencies": { "@actions/core": "^1.10.0", - "@dcl/protocol": "1.0.0-8299166777.commit-9493ffe", + "@dcl/protocol": "^1.0.0-8691799990.commit-4ba546c", "@dcl/quickjs-emscripten": "^0.21.0-3680274614.commit-1808aa1", "@dcl/ts-proto": "1.153.0", "@types/fs-extra": "^9.0.12", diff --git a/packages/@dcl/ecs/src/components/extended/AudioStream.ts b/packages/@dcl/ecs/src/components/extended/AudioStream.ts new file mode 100644 index 000000000..917c16ba1 --- /dev/null +++ b/packages/@dcl/ecs/src/components/extended/AudioStream.ts @@ -0,0 +1,39 @@ +import { Entity, IEngine } from '../../engine' +import { LastWriteWinElementSetComponentDefinition } from '../../engine/component' +import { AudioStream, PBAudioEvent, AudioEvent as defineAudioEventComponent } from '../generated/index.gen' +import { PBAudioStream } from '../generated/pb/decentraland/sdk/components/audio_stream.gen' + +/** + * @public + */ +export interface AudioStreamComponentDefinitionExtended + extends LastWriteWinElementSetComponentDefinition { + /** + * @public + * + * Set playing=true the sound `$name` + * @param entity - entity with AudioStream component + * @param src - the path to the sound to play + * @param resetCursor - the sound starts at 0 or continues from the current cursor position + * @returns true in successful playing, false if it doesn't find the AudioStream component + */ + getAudioState(entity: Entity): PBAudioEvent | undefined +} + +export function defineAudioStreamComponent( + engine: Pick +): AudioStreamComponentDefinitionExtended { + const theComponent = AudioStream(engine) + const AudioEvent = defineAudioEventComponent(engine) + + return { + ...theComponent, + getAudioState(entity: Entity) { + const AudioStream = theComponent.getMutableOrNull(entity) + if (!AudioStream || !AudioEvent.has(entity)) return undefined + + const lastEvent = Array.from(AudioEvent.get(entity)).pop() + return lastEvent + } + } +} diff --git a/packages/@dcl/ecs/src/components/index.ts b/packages/@dcl/ecs/src/components/index.ts index 81ca0eaa3..fb06df35d 100644 --- a/packages/@dcl/ecs/src/components/index.ts +++ b/packages/@dcl/ecs/src/components/index.ts @@ -12,6 +12,8 @@ import defineSyncComponent, { ISyncComponentsType } from './manual/SyncComponent import defineNetworkEntity, { INetowrkEntityType } from './manual/NetworkEntity' import defineNetworkParent, { INetowrkParentType } from './manual/NetworkParent' import { defineTransformComponent, TransformComponentExtended } from './manual/Transform' +import { AudioStreamComponentDefinitionExtended, defineAudioStreamComponent } from './extended/AudioStream' +import { MediaState } from './generated/pb/decentraland/sdk/components/common/media_state.gen' export * from './generated/index.gen' @@ -37,6 +39,11 @@ export const Animator: LwwComponentGetter = export const AudioSource: LwwComponentGetter = (engine) => defineAudioSourceComponent(engine) +/* @__PURE__ */ +export const AudioStream: ( + engine: Pick +) => AudioStreamComponentDefinitionExtended = (engine) => defineAudioStreamComponent(engine) + /* @__PURE__ */ export const MeshRenderer: LwwComponentGetter = (engine) => defineMeshRendererComponent(engine) @@ -79,3 +86,5 @@ export const NetworkEntity: ( export const NetworkParent: ( engine: Pick ) => LastWriteWinElementSetComponentDefinition = (engine) => defineNetworkParent(engine) + +export { MediaState } diff --git a/packages/@dcl/ecs/src/components/types.ts b/packages/@dcl/ecs/src/components/types.ts index 85e60965e..be447126d 100644 --- a/packages/@dcl/ecs/src/components/types.ts +++ b/packages/@dcl/ecs/src/components/types.ts @@ -1,5 +1,6 @@ export type { AnimatorComponentDefinitionExtended } from './extended/Animator' export type { AudioSourceComponentDefinitionExtended } from './extended/AudioSource' +export type { AudioStreamComponentDefinitionExtended } from './extended/AudioStream' export type { MeshRendererComponentDefinitionExtended } from './extended/MeshRenderer' export type { MeshColliderComponentDefinitionExtended } from './extended/MeshCollider' export type { TextureHelper, MaterialComponentDefinitionExtended } from './extended/Material' diff --git a/packages/@dcl/ecs/src/index.ts b/packages/@dcl/ecs/src/index.ts index 6817bad70..db8d234b3 100644 --- a/packages/@dcl/ecs/src/index.ts +++ b/packages/@dcl/ecs/src/index.ts @@ -27,6 +27,7 @@ import { TransformComponentExtended, AnimatorComponentDefinitionExtended, AudioSourceComponentDefinitionExtended, + AudioStreamComponentDefinitionExtended, ISyncComponents, TweenComponentDefinitionExtended, INetowrkEntity, @@ -38,6 +39,7 @@ import { NameComponent } from './components/manual/Name' export const Transform: TransformComponentExtended = /* @__PURE__*/ components.Transform(engine) export const Animator: AnimatorComponentDefinitionExtended = /* @__PURE__*/ components.Animator(engine) export const AudioSource: AudioSourceComponentDefinitionExtended = /* @__PURE__*/ components.AudioSource(engine) +export const AudioStream: AudioStreamComponentDefinitionExtended = /* @__PURE__*/ components.AudioStream(engine) export const Material: MaterialComponentDefinitionExtended = /* @__PURE__*/ components.Material(engine) export const MeshRenderer: MeshRendererComponentDefinitionExtended = /* @__PURE__*/ components.MeshRenderer(engine) export const MeshCollider: MeshColliderComponentDefinitionExtended = /* @__PURE__*/ components.MeshCollider(engine) diff --git a/packages/@dcl/playground-assets/etc/playground-assets.api.md b/packages/@dcl/playground-assets/etc/playground-assets.api.md index e30d32180..963ccacc2 100644 --- a/packages/@dcl/playground-assets/etc/playground-assets.api.md +++ b/packages/@dcl/playground-assets/etc/playground-assets.api.md @@ -50,6 +50,9 @@ export namespace AppendValueOperation { // @public export function areConnected(parcels: Coords[]): boolean; +// @public (undocumented) +export const AudioEvent: GrowOnlyValueSetComponentDefinition; + // Warning: (ae-missing-release-tag) "AudioSource" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -61,8 +64,15 @@ export interface AudioSourceComponentDefinitionExtended extends LastWriteWinElem stopSound(entity: Entity, resetCursor?: boolean): boolean; } +// Warning: (ae-missing-release-tag) "AudioStream" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// // @public (undocumented) -export const AudioStream: LastWriteWinElementSetComponentDefinition; +export const AudioStream: AudioStreamComponentDefinitionExtended; + +// @public (undocumented) +export interface AudioStreamComponentDefinitionExtended extends LastWriteWinElementSetComponentDefinition { + getAudioState(entity: Entity): PBAudioEvent | undefined; +} // @public (undocumented) export const enum AvatarAnchorPointType { @@ -529,6 +539,7 @@ export type ComponentDefinition = LastWriteWinElementSetComponentDefinition>; + "core::AudioEvent": GSetComponentGetter>; "core::AudioSource": LwwComponentGetter>; "core::AudioStream": LwwComponentGetter>; "core::AvatarAttach": LwwComponentGetter>; @@ -1787,6 +1798,26 @@ export namespace Matrix { export function Zero(): MutableMatrix; } +// @public (undocumented) +export const enum MediaState { + // (undocumented) + MS_BUFFERING = 5, + // (undocumented) + MS_ERROR = 1, + // (undocumented) + MS_LOADING = 2, + // (undocumented) + MS_NONE = 0, + // (undocumented) + MS_PAUSED = 7, + // (undocumented) + MS_PLAYING = 4, + // (undocumented) + MS_READY = 3, + // (undocumented) + MS_SEEKING = 6 +} + // Warning: (ae-missing-release-tag) "MeshCollider" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -2080,6 +2111,21 @@ export namespace PBAnimator { export function encode(message: PBAnimator, writer?: _m0.Writer): _m0.Writer; } +// @public (undocumented) +export interface PBAudioEvent { + // (undocumented) + state: MediaState; + timestamp: number; +} + +// @public (undocumented) +export namespace PBAudioEvent { + // (undocumented) + export function decode(input: _m0.Reader | Uint8Array, length?: number): PBAudioEvent; + // (undocumented) + export function encode(message: PBAudioEvent, writer?: _m0.Writer): _m0.Writer; +} + // @public (undocumented) export interface PBAudioSource { audioClipUrl: string; diff --git a/packages/@dcl/sdk-commands/package-lock.json b/packages/@dcl/sdk-commands/package-lock.json index 36f4393ce..da4b618f4 100644 --- a/packages/@dcl/sdk-commands/package-lock.json +++ b/packages/@dcl/sdk-commands/package-lock.json @@ -15,7 +15,7 @@ "@dcl/inspector": "file:../inspector", "@dcl/linker-dapp": "^0.12.0", "@dcl/mini-comms": "1.0.1-20230216163137.commit-a4c75be", - "@dcl/protocol": "1.0.0-8299166777.commit-9493ffe", + "@dcl/protocol": "^1.0.0-8691799990.commit-4ba546c", "@dcl/quests-client": "^1.0.3", "@dcl/quests-manager": "^0.1.4", "@dcl/rpc": "^1.1.1", @@ -238,9 +238,9 @@ } }, "node_modules/@dcl/protocol": { - "version": "1.0.0-8299166777.commit-9493ffe", - "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8299166777.commit-9493ffe.tgz", - "integrity": "sha512-QgYSltXnQvDlt66BsxRJ/o77xOPWDH1ku+OE8jchohwyXEY8KD5UV/seNU2u+TM8iPMjE+9a40p2AAtAjBnsJQ==", + "version": "1.0.0-8691799990.commit-4ba546c", + "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8691799990.commit-4ba546c.tgz", + "integrity": "sha512-hU/8zZXdjgRSUvfi1QRL6YAMF/8QDS/hhh8cs4bE2dw9obXTziyekiR7IEwAOmF60wt/u6+s7JLIacHd35G+HQ==", "dependencies": { "@dcl/ts-proto": "1.154.0" } @@ -3227,9 +3227,9 @@ } }, "@dcl/protocol": { - "version": "1.0.0-8299166777.commit-9493ffe", - "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8299166777.commit-9493ffe.tgz", - "integrity": "sha512-QgYSltXnQvDlt66BsxRJ/o77xOPWDH1ku+OE8jchohwyXEY8KD5UV/seNU2u+TM8iPMjE+9a40p2AAtAjBnsJQ==", + "version": "1.0.0-8691799990.commit-4ba546c", + "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8691799990.commit-4ba546c.tgz", + "integrity": "sha512-hU/8zZXdjgRSUvfi1QRL6YAMF/8QDS/hhh8cs4bE2dw9obXTziyekiR7IEwAOmF60wt/u6+s7JLIacHd35G+HQ==", "requires": { "@dcl/ts-proto": "1.154.0" } diff --git a/packages/@dcl/sdk-commands/package.json b/packages/@dcl/sdk-commands/package.json index 805420331..66cce4f4d 100644 --- a/packages/@dcl/sdk-commands/package.json +++ b/packages/@dcl/sdk-commands/package.json @@ -13,7 +13,7 @@ "@dcl/inspector": "file:../inspector", "@dcl/linker-dapp": "^0.12.0", "@dcl/mini-comms": "1.0.1-20230216163137.commit-a4c75be", - "@dcl/protocol": "1.0.0-8299166777.commit-9493ffe", + "@dcl/protocol": "^1.0.0-8691799990.commit-4ba546c", "@dcl/quests-client": "^1.0.3", "@dcl/quests-manager": "^0.1.4", "@dcl/rpc": "^1.1.1", diff --git a/scripts/protocol-buffer-generation/generateIndex.ts b/scripts/protocol-buffer-generation/generateIndex.ts index 86ae429e1..7b680a0c0 100644 --- a/scripts/protocol-buffer-generation/generateIndex.ts +++ b/scripts/protocol-buffer-generation/generateIndex.ts @@ -15,7 +15,7 @@ function exportComponent(component: Component) { return `export * from './pb/decentraland/sdk/components/${component.componentFile}.gen'` } -const GROWN_ONLY_COMPONENTS = ['PointerEventsResult', 'VideoEvent', 'AvatarEmoteCommand'] +const GROWN_ONLY_COMPONENTS = ['PointerEventsResult', 'VideoEvent', 'AvatarEmoteCommand', 'AudioEvent'] function isGrowOnlyValueSet(component: Component): boolean { return GROWN_ONLY_COMPONENTS.includes(component.componentPascalName) } diff --git a/test/ecs/components/AudioEvent.spec.ts b/test/ecs/components/AudioEvent.spec.ts new file mode 100644 index 000000000..e9e5737ea --- /dev/null +++ b/test/ecs/components/AudioEvent.spec.ts @@ -0,0 +1,26 @@ +import { components, Engine, MediaState } from '../../../packages/@dcl/ecs/src' +import { testSchemaSerializationIdentity } from './assertion' + +describe('Generated AudioEvent ProtoBuf', () => { + it('should serialize', () => { + const newEngine = Engine() + const AudioEvent = components.AudioEvent(newEngine) + + testSchemaSerializationIdentity(AudioEvent.schema, { + timestamp: 5, + state: MediaState.MS_LOADING + }) + + testSchemaSerializationIdentity(AudioEvent.schema, { + timestamp: 10, + state: MediaState.MS_PLAYING + }) + + testSchemaSerializationIdentity(AudioEvent.schema, { + timestamp: 30, + state: MediaState.MS_PLAYING + }) + + testSchemaSerializationIdentity(AudioEvent.schema, AudioEvent.schema.create()) + }) +}) diff --git a/test/ecs/components/AudioStream.spec.ts b/test/ecs/components/AudioStream.spec.ts index 890ba5a2e..fddaaf866 100644 --- a/test/ecs/components/AudioStream.spec.ts +++ b/test/ecs/components/AudioStream.spec.ts @@ -1,4 +1,4 @@ -import { Engine, components } from '../../../packages/@dcl/ecs/src' +import { MediaState, Engine, components } from '../../../packages/@dcl/ecs/src' import { testComponentSerialization } from './assertion' describe('Generated AudioStream ProtoBuf', () => { @@ -18,4 +18,31 @@ describe('Generated AudioStream ProtoBuf', () => { url: 'FakeUrl2' }) }) + + it('should AudioStream.getAudioState helper return current stream state', () => { + const newEngine = Engine() + const AudioStream = components.AudioStream(newEngine) + const AudioEvent = components.AudioEvent(newEngine) + const entity = newEngine.addEntity() + const entityWithoutAudioStream = newEngine.addEntity() + + AudioStream.create(entity, { + url: 'some-src', + playing: true + }) + + // entity without AudioStream + expect(AudioStream.getAudioState(entityWithoutAudioStream)).toBe(undefined) + + // entity with AudioStream without AudioEvents + expect(AudioStream.getAudioState(entity)).toBe(undefined) + + // add some states + AudioEvent.addValue(entity, { state: MediaState.MS_BUFFERING, timestamp: 1 }) + AudioEvent.addValue(entity, { state: MediaState.MS_ERROR, timestamp: 2 }) + AudioEvent.addValue(entity, { state: MediaState.MS_PLAYING, timestamp: 3 }) + + // get last state + expect(AudioStream.getAudioState(entity)).toStrictEqual({ state: MediaState.MS_PLAYING, timestamp: 3 }) + }) })