class TransportAction extends TransportSingleShardAction<Request, Response> {

        private final IndicesService indicesService;
        private final PublisherRestoreService publisherRestoreService;

        @Inject
        public TransportAction(ThreadPool threadPool,
                               ClusterService clusterService,
                               TransportService transportService,
                               IndicesService indicesService,
                               PublisherRestoreService publisherRestoreService) {
            super(
                NAME,
                threadPool,
                clusterService,
                transportService,
                Request::new,
                ThreadPool.Names.GET
            );
            this.indicesService = indicesService;
            this.publisherRestoreService = publisherRestoreService;
            TransportActionProxy.registerProxyAction(transportService, NAME, Response::new);
        }

        @Override
        protected Response shardOperation(Request request,
                                          ShardId shardId) throws IOException {<FILL_FUNCTION_BODY>}

        @Override
        protected Writeable.Reader<Response> getResponseReader() {
            return Response::new;
        }

        @Override
        protected boolean resolveIndex(Request request) {
            return true;
        }

        @Nullable
        @Override
        protected ShardsIterator shards(ClusterState state,
                                        InternalRequest request) {
            return state.routingTable().shardRoutingTable(request.request().shardId()).primaryShardIt();
        }
    }

            var indexShard = indicesService.indexServiceSafe(shardId.getIndex()).getShard(shardId.id());
            var store = indexShard.store();
            var buffer = new byte[request.length()];
            var bytesRead = 0;

            store.incRef();
            var fileMetadata = request.storeFileMetadata();
            try (var currentInput = publisherRestoreService.openInputStream(
                request.restoreUUID(), request, fileMetadata.name(), fileMetadata.length())) {
                var offset = request.offset();
                if (offset < fileMetadata.length()) {
                    currentInput.skip(offset);
                    bytesRead = currentInput.read(buffer);
                }
            } finally {
                store.decRef();
            }

            return new Response(
                request.storeFileMetadata(),
                request.offset(),
                new BytesArray(buffer, 0, bytesRead)
            );
        
<methods>public void <init>(java.lang.String) ,public boolean equals(java.lang.Object) ,public Reader<io.crate.replication.logical.action.GetFileChunkAction.Response> getResponseReader() ,public int hashCode() ,public java.lang.String name() ,public org.elasticsearch.transport.TransportRequestOptions transportOptions(org.elasticsearch.common.settings.Settings) <variables>private final non-sealed java.lang.String name