@dxos/functions-testing 0.12.0-next-73daef452f1464b62efdbca75fb0067c1066f264 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ import { Feed, Filter, Obj, Query, Scope } from "@dxos/echo";
9
9
  import { FunctionsServiceClient } from "@dxos/edge-compute";
10
10
  import { bundleFunction } from "@dxos/edge-compute/native";
11
11
  import { ErrorCodec } from "@dxos/protocols";
12
- import { EdgeReplicationSetting } from "@dxos/protocols/proto/dxos/echo/metadata";
12
+ import { EdgeReplicationSetting } from "@dxos/protocols/buf/dxos/echo/metadata_pb";
13
13
  //#region src/testing/util.ts
14
14
  var __dxlog_file = "/__w/dxos/dxos/packages/core/compute/functions-testing/src/testing/util.ts";
15
15
  var writeBundle = (path, bundle) => {
@@ -1 +1 @@
1
- {"version":3,"file":"testing.mjs","names":[],"sources":["../../src/testing/util.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport fs from 'node:fs';\n\nimport { sleep } from '@dxos/async';\nimport { Client, type Config } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { InvocationTraceEndEvent, InvocationTraceStartEvent } from '@dxos/compute-runtime';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as Trigger from '@dxos/compute/Trigger';\nimport { Context } from '@dxos/context';\nimport { Feed, Filter, Obj, Query, Scope } from '@dxos/echo';\nimport { FunctionsServiceClient } from '@dxos/edge-compute';\nimport { bundleFunction } from '@dxos/edge-compute/native';\nimport type { BundleResult } from '@dxos/edge-compute/native';\nimport { ErrorCodec, type FunctionRuntimeKind } from '@dxos/protocols';\nimport { EdgeReplicationSetting } from '@dxos/protocols/proto/dxos/echo/metadata';\n\nexport const writeBundle = (path: string, bundle: BundleResult) => {\n fs.mkdirSync(path, { recursive: true });\n Object.entries(bundle.assets).forEach(([name, content]) => {\n fs.writeFileSync(path + '/' + name, content);\n });\n};\n\nexport const setup = async (config: Config) => {\n const client = await new Client({\n config,\n types: [Operation.PersistentOperation, Trigger.Trigger],\n }).initialize();\n await client.halo.createIdentity();\n\n const space = await client.spaces.create();\n await space.waitUntilReady();\n await space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED);\n\n const functionsServiceClient = FunctionsServiceClient.fromClient(client);\n\n return { client, space, functionsServiceClient };\n};\n\nexport const sync = async (space: Space) => {\n await space.db.flush();\n await space.internal.syncToEdge({\n onProgress: (state) =>\n console.log(state ? `${state.unsyncedDocumentCount} documents syncing...` : 'connecting to edge...'),\n });\n};\n\nexport const deployFunction = async (\n space: Space,\n functionsServiceClient: FunctionsServiceClient,\n entryPoint: string,\n runtime: FunctionRuntimeKind,\n ownerUri: string,\n): Promise<Operation.PersistentOperation> => {\n const artifact = await bundleFunction({\n entryPoint,\n verbose: true,\n });\n const func = await functionsServiceClient.deploy(Context.default(), {\n version: '0.0.1',\n ownerUri,\n entryPoint: artifact.entryPoint,\n assets: artifact.assets,\n runtime,\n });\n space.db.add(func);\n\n return func;\n};\n\nexport const observeInvocations = async (space: Space, maxCount: number | null) => {\n let initialCount = null;\n const invocationData = new Map<\n string,\n {\n count: number;\n begin: InvocationTraceStartEvent;\n end?: InvocationTraceEndEvent;\n }\n >();\n let count = 0;\n while (true) {\n try {\n const traceFeed = space.properties.invocationTraceFeed?.target;\n const traceFeedDXN = traceFeed ? Feed.getFeedUri(traceFeed) : undefined;\n const invocations = traceFeedDXN\n ? await space.db.query(Query.select(Filter.everything()).from(Scope.feed(traceFeedDXN))).run()\n : [];\n\n for (const invocation of invocations) {\n if (Obj.instanceOf(InvocationTraceStartEvent, invocation)) {\n if (invocationData.has(invocation.invocationId)) {\n continue;\n }\n invocationData.set(invocation.invocationId, {\n count: count++,\n begin: invocation,\n });\n console.log(\n `${count.toString().padStart(3, ' ')}: BEGIN ${invocation.runtime ?? '(unknown runtime)'} ${JSON.stringify(invocation.input)}`,\n );\n } else if (Obj.instanceOf(InvocationTraceEndEvent, invocation)) {\n const data = invocationData.get(invocation.invocationId);\n if (!data || !!data.end) {\n continue;\n }\n data.end = invocation;\n\n const outcome = data.end.outcome;\n console.log(\n `${data.count.toString().padStart(3, ' ')}: END outcome=${outcome} duration=${data.end.timestamp - data.begin.timestamp}`,\n );\n if (outcome === 'failure' && data.end.error) {\n console.error(ErrorCodec.decode(data.end.error));\n }\n }\n }\n if (initialCount === null) {\n initialCount = invocations.length;\n }\n\n if (maxCount !== null && invocationData.size >= maxCount + initialCount) {\n break;\n }\n } catch (err) {\n console.error(err);\n }\n await sleep(1_000);\n }\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"testing.mjs","names":[],"sources":["../../src/testing/util.ts"],"sourcesContent":["//\n// Copyright 2025 DXOS.org\n//\n\nimport fs from 'node:fs';\n\nimport { sleep } from '@dxos/async';\nimport { Client, type Config } from '@dxos/client';\nimport { type Space } from '@dxos/client/echo';\nimport { InvocationTraceEndEvent, InvocationTraceStartEvent } from '@dxos/compute-runtime';\nimport * as Operation from '@dxos/compute/Operation';\nimport * as Trigger from '@dxos/compute/Trigger';\nimport { Context } from '@dxos/context';\nimport { Feed, Filter, Obj, Query, Scope } from '@dxos/echo';\nimport { FunctionsServiceClient } from '@dxos/edge-compute';\nimport { bundleFunction } from '@dxos/edge-compute/native';\nimport type { BundleResult } from '@dxos/edge-compute/native';\nimport { ErrorCodec, type FunctionRuntimeKind } from '@dxos/protocols';\nimport { EdgeReplicationSetting } from '@dxos/protocols/buf/dxos/echo/metadata_pb';\n\nexport const writeBundle = (path: string, bundle: BundleResult) => {\n fs.mkdirSync(path, { recursive: true });\n Object.entries(bundle.assets).forEach(([name, content]) => {\n fs.writeFileSync(path + '/' + name, content);\n });\n};\n\nexport const setup = async (config: Config) => {\n const client = await new Client({\n config,\n types: [Operation.PersistentOperation, Trigger.Trigger],\n }).initialize();\n await client.halo.createIdentity();\n\n const space = await client.spaces.create();\n await space.waitUntilReady();\n await space.internal.setEdgeReplicationPreference(EdgeReplicationSetting.ENABLED);\n\n const functionsServiceClient = FunctionsServiceClient.fromClient(client);\n\n return { client, space, functionsServiceClient };\n};\n\nexport const sync = async (space: Space) => {\n await space.db.flush();\n await space.internal.syncToEdge({\n onProgress: (state) =>\n console.log(state ? `${state.unsyncedDocumentCount} documents syncing...` : 'connecting to edge...'),\n });\n};\n\nexport const deployFunction = async (\n space: Space,\n functionsServiceClient: FunctionsServiceClient,\n entryPoint: string,\n runtime: FunctionRuntimeKind,\n ownerUri: string,\n): Promise<Operation.PersistentOperation> => {\n const artifact = await bundleFunction({\n entryPoint,\n verbose: true,\n });\n const func = await functionsServiceClient.deploy(Context.default(), {\n version: '0.0.1',\n ownerUri,\n entryPoint: artifact.entryPoint,\n assets: artifact.assets,\n runtime,\n });\n space.db.add(func);\n\n return func;\n};\n\nexport const observeInvocations = async (space: Space, maxCount: number | null) => {\n let initialCount = null;\n const invocationData = new Map<\n string,\n {\n count: number;\n begin: InvocationTraceStartEvent;\n end?: InvocationTraceEndEvent;\n }\n >();\n let count = 0;\n while (true) {\n try {\n const traceFeed = space.properties.invocationTraceFeed?.target;\n const traceFeedDXN = traceFeed ? Feed.getFeedUri(traceFeed) : undefined;\n const invocations = traceFeedDXN\n ? await space.db.query(Query.select(Filter.everything()).from(Scope.feed(traceFeedDXN))).run()\n : [];\n\n for (const invocation of invocations) {\n if (Obj.instanceOf(InvocationTraceStartEvent, invocation)) {\n if (invocationData.has(invocation.invocationId)) {\n continue;\n }\n invocationData.set(invocation.invocationId, {\n count: count++,\n begin: invocation,\n });\n console.log(\n `${count.toString().padStart(3, ' ')}: BEGIN ${invocation.runtime ?? '(unknown runtime)'} ${JSON.stringify(invocation.input)}`,\n );\n } else if (Obj.instanceOf(InvocationTraceEndEvent, invocation)) {\n const data = invocationData.get(invocation.invocationId);\n if (!data || !!data.end) {\n continue;\n }\n data.end = invocation;\n\n const outcome = data.end.outcome;\n console.log(\n `${data.count.toString().padStart(3, ' ')}: END outcome=${outcome} duration=${data.end.timestamp - data.begin.timestamp}`,\n );\n if (outcome === 'failure' && data.end.error) {\n console.error(ErrorCodec.decode(data.end.error));\n }\n }\n }\n if (initialCount === null) {\n initialCount = invocations.length;\n }\n\n if (maxCount !== null && invocationData.size >= maxCount + initialCount) {\n break;\n }\n } catch (err) {\n console.error(err);\n }\n await sleep(1_000);\n }\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export * from './util';
1
+ export * from './util.ts';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC"}