Untangle external reader code (#776)

- move the following classes into package externalreader:
  - ExternalModuleResolver
  - ExternalResourceResolver
  - MessageTransportModuleResolver (renamed to ExternalModuleResolverImpl, made package-private)
  - MessageTransportResourceResolver (renamed to ExternalResourceResolverImpl, made package-private)
- replace interface ExternalModuleResolver.Spec with record ExternalModuleReaderSpec
- replace interface ExternalResourceResolver.Spec with record ExternalResourceReaderSpec
- translate between messaging.ResourceReaderSpec and ExternalResourceReaderSpec (eliminates dependency from messaging on higher layer)
- translate between messaging.ResourceResolverSpec and ExternalResourceResolverSpec (eliminates dependency from messaging on higher layer)
- add ServerMessages.ExternalReader and translate between this message component and the PklEvaluatorSettings.ExternalReader API
- add ServerMessages.Proxy and translate between this message component and the PklEvaluatorSettings.Proxy API
- change type of CreateEvaluatorRequest.allowedModules/allowedResources from List<Pattern>? to List<String>?
  - removes a lot of code
  - should not need to create a Pattern object to send a message
- deprecate method evaluatorSettings.PklEvaluatorSettings.Proxy.create()
  - only seems useful internally, inlined

Co-authored-by: Dan Chao <dan.chao@apple.com>
This commit is contained in:
odenix
2025-02-20 22:38:51 -08:00
committed by GitHub
parent 31c80e792e
commit 52a86d3f32
31 changed files with 219 additions and 213 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@ package org.pkl.core.externalreader
import java.net.URI
import org.pkl.core.messaging.Messages.ModuleReaderSpec
/** An external module reader, to be used with [ExternalReaderRuntime]. */
/** An external module reader, to be used with [ExternalReaderClient]. */
interface ExternalModuleReader : ExternalReaderBase {
val isLocal: Boolean

View File

@@ -19,14 +19,15 @@ import java.io.IOException
import org.pkl.core.externalreader.ExternalReaderMessages.*
import org.pkl.core.messaging.Message
import org.pkl.core.messaging.MessageTransport
import org.pkl.core.messaging.Messages
import org.pkl.core.messaging.Messages.*
import org.pkl.core.messaging.ProtocolException
import org.pkl.core.util.Nullable
/** An implementation of the client side of the external reader flow */
class ExternalReaderRuntime(
private val moduleReaders: List<ExternalModuleReader>,
private val resourceReaders: List<ExternalResourceReader>,
class ExternalReaderClient(
private val externalModuleReaders: List<ExternalModuleReader>,
private val externalResourceReaders: List<ExternalResourceReader>,
private val transport: MessageTransport,
) {
/** Close the runtime and its transport. */
@@ -35,7 +36,7 @@ class ExternalReaderRuntime(
}
private fun findModuleReader(scheme: String): @Nullable ExternalModuleReader? {
for (moduleReader in moduleReaders) {
for (moduleReader in externalModuleReaders) {
if (moduleReader.scheme.equals(scheme, ignoreCase = true)) {
return moduleReader
}
@@ -44,7 +45,7 @@ class ExternalReaderRuntime(
}
private fun findResourceReader(scheme: String): @Nullable ExternalResourceReader? {
for (resourceReader in resourceReaders) {
for (resourceReader in externalResourceReaders) {
if (resourceReader.scheme.equals(scheme, ignoreCase = true)) {
return resourceReader
}
@@ -72,7 +73,7 @@ class ExternalReaderRuntime(
Message.Type.INITIALIZE_MODULE_READER_REQUEST -> {
val req = msg as InitializeModuleReaderRequest
val reader = findModuleReader(req.scheme)
var spec: @Nullable ModuleReaderSpec? = null
var spec: Messages.ModuleReaderSpec? = null
if (reader != null) {
spec = reader.spec
}
@@ -81,7 +82,7 @@ class ExternalReaderRuntime(
Message.Type.INITIALIZE_RESOURCE_READER_REQUEST -> {
val req = msg as InitializeResourceReaderRequest
val reader = findResourceReader(req.scheme)
var spec: @Nullable ResourceReaderSpec? = null
var spec: Messages.ResourceReaderSpec? = null
if (reader != null) {
spec = reader.spec
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@ package org.pkl.core.externalreader
import java.net.URI
import org.pkl.core.messaging.Messages.ResourceReaderSpec
/** An external resource reader, to be used with [ExternalReaderRuntime]. */
/** An external resource reader, to be used with [ExternalReaderClient]. */
interface ExternalResourceReader : ExternalReaderBase {
fun read(uri: URI): ByteArray

View File

@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@ import org.msgpack.core.MessagePack
import org.pkl.core.externalreader.ExternalReaderMessages.*
import org.pkl.core.messaging.*
class ExternalProcessProcessReaderMessagePackCodecTest {
class MessagePackCodecTest {
private val encoder: MessageEncoder
private val decoder: MessageDecoder

View File

@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View File

@@ -25,10 +25,7 @@ import java.util.concurrent.Future
import kotlin.random.Random
import org.pkl.core.externalreader.ExternalReaderMessages.*
import org.pkl.core.messaging.MessageTransport
import org.pkl.core.messaging.MessageTransportModuleResolver
import org.pkl.core.messaging.MessageTransportResourceResolver
import org.pkl.core.messaging.MessageTransports
import org.pkl.core.messaging.Messages.*
import org.pkl.core.messaging.ProtocolException
class TestExternalReaderProcess(private val transport: MessageTransport) : ExternalReaderProcess {
@@ -42,11 +39,11 @@ class TestExternalReaderProcess(private val transport: MessageTransport) : Exter
transport.close()
}
override fun getModuleResolver(evaluatorId: Long): MessageTransportModuleResolver =
MessageTransportModuleResolver(transport, evaluatorId)
override fun getModuleResolver(evaluatorId: Long): ExternalModuleResolver =
ExternalModuleResolver.of(transport, evaluatorId)
override fun getResourceResolver(evaluatorId: Long): MessageTransportResourceResolver =
MessageTransportResourceResolver(transport, evaluatorId)
override fun getResourceResolver(evaluatorId: Long): ExternalResourceResolver =
ExternalResourceResolver.of(transport, evaluatorId)
fun run() {
try {
@@ -69,7 +66,11 @@ class TestExternalReaderProcess(private val transport: MessageTransport) : Exter
transport.send(request) { response ->
when (response) {
is InitializeModuleReaderResponse -> {
complete(response.spec)
val spec =
response.spec?.let {
ModuleReaderSpec(it.scheme, it.hasHierarchicalUris, it.isLocal, it.isGlobbable)
}
complete(spec)
}
else -> completeExceptionally(ProtocolException("unexpected response"))
}
@@ -86,7 +87,11 @@ class TestExternalReaderProcess(private val transport: MessageTransport) : Exter
transport.send(request) { response ->
when (response) {
is InitializeResourceReaderResponse -> {
complete(response.spec)
val spec =
response.spec?.let {
ResourceReaderSpec(it.scheme, it.hasHierarchicalUris, it.isGlobbable)
}
complete(spec)
}
else -> completeExceptionally(ProtocolException("unexpected response"))
}
@@ -97,9 +102,9 @@ class TestExternalReaderProcess(private val transport: MessageTransport) : Exter
companion object {
fun initializeTestHarness(
moduleReaders: List<ExternalModuleReader>,
resourceReaders: List<ExternalResourceReader>,
): Pair<TestExternalReaderProcess, ExternalReaderRuntime> {
externalModuleReaders: List<ExternalModuleReader>,
externalResourceReaders: List<ExternalResourceReader>,
): Pair<TestExternalReaderProcess, ExternalReaderClient> {
val rxIn = PipedInputStream(10240)
val rxOut = PipedOutputStream(rxIn)
val txIn = PipedInputStream(10240)
@@ -115,13 +120,14 @@ class TestExternalReaderProcess(private val transport: MessageTransport) : Exter
ExternalReaderMessagePackEncoder(rxOut),
) {}
val runtime = ExternalReaderRuntime(moduleReaders, resourceReaders, clientTransport)
val client =
ExternalReaderClient(externalModuleReaders, externalResourceReaders, clientTransport)
val proc = TestExternalReaderProcess(serverTransport)
Thread(runtime::run).start()
Thread(client::run).start()
Thread(proc::run).start()
return proc to runtime
return proc to client
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright © 2024 Apple Inc. and the Pkl project authors. All rights reserved.
* Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.