### Is there an existing issue for this?

- [X] I have searched the existing issues

### Enhancement description

Kinesis Mock is preparing a switch to a Javascript executable offering, which will remove the old GraalVM executables. This should be much easier to work with from Localstack's perspective, as well as remove the java dependency for users. But I'm unsure as to how to approach this in Localstack's code base, and am looking for some guidance / direction.

The current plan is to have 2 GitHub release assets:
- main.js
- main.js.map

To start the service, you'd simply do `./main.js`, as it should be an executable. You can use `node main.js` as well. 

I also plan to publish this to NPM if that is an easier grab for localstack. 

References:

https://github.com/etspaceman/kinesis-mock/pull/531
https://github.com/etspaceman/kinesis-mock/blob/scalajs/docker/Dockerfile


### 🧑‍💻 Implementation

Update these lines to execute a nodejs command instead:

https://github.com/localstack/localstack/blob/master/localstack/services/kinesis/kinesis_mock_server.py#L101

Upgrade this to the newest version (planning for 0.4.0):

https://github.com/localstack/localstack/blob/master/localstack/services/kinesis/kinesis_mock_server.py#L101

Update this to get the `main.js` file for all platforms:

https://github.com/localstack/localstack/blob/master/localstack/services/kinesis/kinesis_mock_server.py#L101



### Anything else?

_No response_
raise NotImplementedError()
    def _get_download_url(self) -> str:
        raise NotImplementedError()
    def get_installed_dir(self) -> str | None:
        installed_dir = super().get_installed_dir()
        subdir = self._get_archive_subdir()
        
        
        if installed_dir and subdir:
            return os.path.join(installed_dir, subdir)
        return installed_dir
    def _get_archive_subdir(self) -> str | None:
        """
        :return: name of the subdirectory contained in the archive or none if the package content is at the root level
                of the archive
        """
        return None
    def get_executable_path(self) -> str | None:
        subdir = self._get_archive_subdir()
        if subdir is None:
            return super().get_executable_path()
        else:
            install_dir = self.get_installed_dir()
            if install_dir:
                install_dir = install_dir[: -len(subdir)]
                return self._get_install_marker_path(install_dir)
    def _install(self, target: InstallTarget) -> None: