route.ts 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { NextResponse } from 'next/server'
  2. import semver from 'semver'
  3. import { Octokit } from '@octokit/rest'
  4. import { RequestError } from '@octokit/types'
  5. const octokit = new Octokit()
  6. export async function GET(req: Request) {
  7. const { searchParams } = new URL(req.url)
  8. const os = searchParams.get('os') || ''
  9. const version = searchParams.get('version') || ''
  10. try {
  11. const { data } = await octokit.repos.getLatestRelease({
  12. owner: 'jmorganca',
  13. repo: 'ollama',
  14. })
  15. // todo: get the correct asset for the current arch/os
  16. const asset = data.assets.find(a => a.name.toLowerCase().includes(os))
  17. if (!asset) {
  18. return new Response('up to date', { status: 204 })
  19. }
  20. if (semver.lt(version, data.tag_name)) {
  21. return NextResponse.json({ version: data.tag_name, url: asset.browser_download_url })
  22. }
  23. } catch (error) {
  24. const e = error as RequestError
  25. if (e.status === 404) {
  26. return new Response('not found', { status: 404 })
  27. }
  28. return new Response('internal server error', { status: 500 })
  29. }
  30. return new Response('up to date', { status: 204 })
  31. }