diff --git a/.github/workflows/release-typescript-sdk.yml b/.github/workflows/release-typescript-sdk.yml index e3813e8..5376bbc 100644 --- a/.github/workflows/release-typescript-sdk.yml +++ b/.github/workflows/release-typescript-sdk.yml @@ -31,6 +31,7 @@ jobs: outputs: sdk_version: ${{ steps.sdk-version.outputs.value }} publish_release: ${{ steps.release-mode.outputs.value }} + sdk_already_published: ${{ steps.sdk-presence.outputs.value }} steps: - name: Checkout uses: actions/checkout@v4 @@ -93,10 +94,31 @@ jobs: exit 1 fi + - name: Check whether SDK package version already exists on npm + id: sdk-presence + shell: bash + run: | + set -euo pipefail + if [[ "${{ steps.release-mode.outputs.value }}" != "true" ]]; then + echo "value=false" >> "${GITHUB_OUTPUT}" + exit 0 + fi + + package_name="$(node -p "require('./${SDK_DIRECTORY}/package.json').name")" + package_version="${{ steps.sdk-version.outputs.value }}" + if pnpm view "${package_name}@${package_version}" version >/dev/null 2>&1; then + echo "value=true" >> "${GITHUB_OUTPUT}" + echo ">>> ${package_name}@${package_version} already exists on npm; SDK verification/publish steps will skip where possible." + else + echo "value=false" >> "${GITHUB_OUTPUT}" + fi + - name: Install workspace dependencies + if: steps.sdk-presence.outputs.value != 'true' run: pnpm install --frozen-lockfile - name: Run TypeScript SDK checks + if: steps.sdk-presence.outputs.value != 'true' run: pnpm --dir "${SDK_DIRECTORY}" run check publish-native: @@ -130,11 +152,6 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup Rust CI toolchain and tools - uses: ./.github/actions/rust-ci-setup - with: - cargo-tools: cargo-make,cargo-nextest - - name: Setup pnpm uses: pnpm/action-setup@v4 with: @@ -148,11 +165,33 @@ jobs: cache-dependency-path: pnpm-lock.yaml registry-url: https://registry.npmjs.org + - name: Check whether native runtime package version already exists on npm + id: native-package-presence + if: needs.verify.outputs.publish_release == 'true' + shell: bash + run: | + set -euo pipefail + package_name="${{ matrix.package_name }}" + package_version="${{ needs.verify.outputs.sdk_version }}" + if pnpm view "${package_name}@${package_version}" version >/dev/null 2>&1; then + echo "value=true" >> "${GITHUB_OUTPUT}" + echo ">>> ${package_name}@${package_version} already exists on npm; skipping native runtime build/publish." + else + echo "value=false" >> "${GITHUB_OUTPUT}" + fi + + - name: Setup Rust CI toolchain and tools + if: needs.verify.outputs.publish_release != 'true' || steps.native-package-presence.outputs.value != 'true' + uses: ./.github/actions/rust-ci-setup + with: + cargo-tools: cargo-make,cargo-nextest + - name: Install workspace dependencies + if: needs.verify.outputs.publish_release != 'true' || steps.native-package-presence.outputs.value != 'true' run: pnpm install --frozen-lockfile - name: Publish native runtime package - if: needs.verify.outputs.publish_release == 'true' + if: needs.verify.outputs.publish_release == 'true' && steps.native-package-presence.outputs.value != 'true' working-directory: ${{ matrix.package_dir }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} @@ -189,11 +228,27 @@ jobs: cache-dependency-path: pnpm-lock.yaml registry-url: https://registry.npmjs.org + - name: Check whether SDK package version already exists on npm + id: sdk-package-presence + if: needs.verify.outputs.publish_release == 'true' + shell: bash + run: | + set -euo pipefail + package_name="$(node -p "require('./${SDK_DIRECTORY}/package.json').name")" + package_version="${{ needs.verify.outputs.sdk_version }}" + if pnpm view "${package_name}@${package_version}" version >/dev/null 2>&1; then + echo "value=true" >> "${GITHUB_OUTPUT}" + echo ">>> ${package_name}@${package_version} already exists on npm; skipping SDK install/publish." + else + echo "value=false" >> "${GITHUB_OUTPUT}" + fi + - name: Install workspace dependencies + if: needs.verify.outputs.publish_release != 'true' || steps.sdk-package-presence.outputs.value != 'true' run: pnpm install --frozen-lockfile - name: Wait for native packages to index on npm - if: needs.verify.outputs.publish_release == 'true' + if: needs.verify.outputs.publish_release == 'true' && steps.sdk-package-presence.outputs.value != 'true' shell: bash run: | set -euo pipefail @@ -206,7 +261,7 @@ jobs: local pkg="$1" local attempt for attempt in $(seq 1 30); do - if npm view "${pkg}@${version}" version >/dev/null 2>&1; then + if pnpm view "${pkg}@${version}" version >/dev/null 2>&1; then echo ">>> ${pkg}@${version} is visible on npm" return 0 fi @@ -237,7 +292,7 @@ jobs: fi - name: Publish TypeScript SDK - if: needs.verify.outputs.publish_release == 'true' + if: needs.verify.outputs.publish_release == 'true' && steps.sdk-package-presence.outputs.value != 'true' working-directory: ${{ env.SDK_DIRECTORY }} env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/sdks/typescript/README.md b/sdks/typescript/README.md index 1daaad2..60064a8 100644 --- a/sdks/typescript/README.md +++ b/sdks/typescript/README.md @@ -1,6 +1,8 @@ # `@lythaeon-sof/sdk` -TypeScript SDK for building apps with a typed `App`, `Plugin`, `runtime`, and `derivedState` model. +TypeScript SDK for building Node.js Solana observer apps on top of SOF. + +These apps ingest Solana data from websocket, gRPC, gossip, or direct-shred sources, run typed plugins and derived state, and execute on the packaged SOF runtime host without requiring app authors to touch the Rust code underneath. ## Tooling diff --git a/sdks/typescript/RELEASING.md b/sdks/typescript/RELEASING.md index 71b7d6b..487c9e0 100644 --- a/sdks/typescript/RELEASING.md +++ b/sdks/typescript/RELEASING.md @@ -21,8 +21,8 @@ Use `ts-sdk-vX.Y.Z` tags for npm releases. Examples: ```sh -git tag ts-sdk-v0.1.1 -git push origin ts-sdk-v0.1.1 +git tag ts-sdk-v0.1.2 +git push origin ts-sdk-v0.1.2 ``` The release workflow rejects tags that do not match `sdks/typescript/package.json`. diff --git a/sdks/typescript/native/darwin-arm64/package.json b/sdks/typescript/native/darwin-arm64/package.json index 95a7dab..b8cf074 100644 --- a/sdks/typescript/native/darwin-arm64/package.json +++ b/sdks/typescript/native/darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@lythaeon-sof/sdk-native-darwin-arm64", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT OR Apache-2.0", "description": "Native SOF runtime host for @lythaeon-sof/sdk on macOS arm64", "repository": { diff --git a/sdks/typescript/native/darwin-x64/package.json b/sdks/typescript/native/darwin-x64/package.json index 3c0ac02..3f3e24e 100644 --- a/sdks/typescript/native/darwin-x64/package.json +++ b/sdks/typescript/native/darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@lythaeon-sof/sdk-native-darwin-x64", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT OR Apache-2.0", "description": "Native SOF runtime host for @lythaeon-sof/sdk on macOS x64", "repository": { diff --git a/sdks/typescript/native/linux-arm64/package.json b/sdks/typescript/native/linux-arm64/package.json index ac63cd1..294573d 100644 --- a/sdks/typescript/native/linux-arm64/package.json +++ b/sdks/typescript/native/linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@lythaeon-sof/sdk-native-linux-arm64", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT OR Apache-2.0", "description": "Native SOF runtime host for @lythaeon-sof/sdk on Linux arm64", "repository": { diff --git a/sdks/typescript/native/linux-x64/package.json b/sdks/typescript/native/linux-x64/package.json index 4e6f70a..f6d3fbd 100644 --- a/sdks/typescript/native/linux-x64/package.json +++ b/sdks/typescript/native/linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@lythaeon-sof/sdk-native-linux-x64", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT OR Apache-2.0", "description": "Native SOF runtime host for @lythaeon-sof/sdk on Linux x64", "repository": { diff --git a/sdks/typescript/native/win32-arm64/package.json b/sdks/typescript/native/win32-arm64/package.json index e62352a..bd1cb81 100644 --- a/sdks/typescript/native/win32-arm64/package.json +++ b/sdks/typescript/native/win32-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@lythaeon-sof/sdk-native-win32-arm64", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT OR Apache-2.0", "description": "Native SOF runtime host for @lythaeon-sof/sdk on Windows arm64", "repository": { diff --git a/sdks/typescript/native/win32-x64/package.json b/sdks/typescript/native/win32-x64/package.json index baaa4c2..75baec7 100644 --- a/sdks/typescript/native/win32-x64/package.json +++ b/sdks/typescript/native/win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@lythaeon-sof/sdk-native-win32-x64", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT OR Apache-2.0", "description": "Native SOF runtime host for @lythaeon-sof/sdk on Windows x64", "repository": { diff --git a/sdks/typescript/package.json b/sdks/typescript/package.json index cd40684..6b0bccf 100644 --- a/sdks/typescript/package.json +++ b/sdks/typescript/package.json @@ -1,7 +1,7 @@ { "name": "@lythaeon-sof/sdk", - "version": "0.1.1", - "description": "TypeScript App SDK", + "version": "0.1.2", + "description": "TypeScript SDK for Node.js Solana observer apps on SOF", "license": "MIT OR Apache-2.0", "sideEffects": false, "packageManager": "pnpm@10.28.2",