runtime-manifest.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /**
  2. * 运行时环境清单(与历史扁平 config 等价字段,实现方式完全不同)
  3. * 修改环境时优先改下方 ENDPOINTS / IDENTITY 等片段。
  4. */
  5. const ENDPOINTS = Object.freeze(
  6. Object.assign(Object.create(null), {
  7. streamingSocket: 'wss://chat.amazewayhk.com',
  8. publicCdnRoot: 'https://backend.amazewayhk.com',
  9. apiGatewayRoot: 'https://backend.amazewayhk.com/api'
  10. })
  11. )
  12. const IDENTITY = Object.freeze({
  13. releaseLabel: '1.1.41',
  14. numericBuild: '1141',
  15. // 排查"看不到直播"期间临时开启,正式发布请改回 false
  16. traceVerbose: false,
  17. geoServiceKey: '',
  18. mpOfficialAppId: ''
  19. })
  20. /** 界面展示开关(改 true 即可放开对应 UI) */
  21. const UI_FLAGS = Object.freeze({
  22. // 底部栏点赞按钮下方的数量(直播观看页 + 视频 feed 底栏)
  23. showBottomBarLikeCount: false,
  24. // 原生 FCM/VoIP 推送(uni_modules/gzfuts-fcm)
  25. // false:不加载 JS 推送桥接;插件需在 _disabled_native,并重打自定义基座后才不会在 iOS 启动 VoIP
  26. nativePushEnabled: false,
  27. })
  28. const HTTP_CLIENT_ALIASES = ['app', 'wechat', 'h5', 'mp'].reduce((acc, slot) => {
  29. const tag = `${slot}-hl88live`
  30. acc[slot] = slot === 'app' ? `app-hl88live` : tag
  31. return acc
  32. }, Object.create(null))
  33. function assembleIceCatalog() {
  34. const host = 'rtc.abtim-my.com:3478'
  35. const sharedAuth = { username: 'admin', credential: 'k8sF3mNpQ2xR7vT9wL5z' }
  36. return [
  37. {
  38. urls: [`stun:${host}`],
  39. ...sharedAuth
  40. },
  41. {
  42. urls: [`turn:${host}?transport=udp`, `turn:${host}?transport=tcp`],
  43. ...sharedAuth
  44. }
  45. ]
  46. }
  47. function backendAddonFolder() {
  48. return ['w', 'a', 'n', 'l', 's', 'h', 'o', 'p'].join('')
  49. }
  50. /**
  51. * @returns {Readonly<Record<string, unknown>>} 与拦截器、store 约定的扁平字段及派生 getter
  52. */
  53. export function materializeRuntimeManifest() {
  54. const ice = assembleIceCatalog()
  55. const addon = backendAddonFolder()
  56. return Object.freeze({
  57. get socketurl() {
  58. return ENDPOINTS.streamingSocket
  59. },
  60. get cdnurl() {
  61. return ENDPOINTS.publicCdnRoot
  62. },
  63. get appurl() {
  64. return ENDPOINTS.apiGatewayRoot
  65. },
  66. get amapkey() {
  67. return IDENTITY.geoServiceKey
  68. },
  69. get appid() {
  70. return IDENTITY.mpOfficialAppId
  71. },
  72. get versionName() {
  73. return IDENTITY.releaseLabel
  74. },
  75. get versionCode() {
  76. return IDENTITY.numericBuild
  77. },
  78. get debug() {
  79. return IDENTITY.traceVerbose
  80. },
  81. get showBottomBarLikeCount() {
  82. return UI_FLAGS.showBottomBarLikeCount
  83. },
  84. get nativePushEnabled() {
  85. return UI_FLAGS.nativePushEnabled
  86. },
  87. get restPathPrefix() {
  88. return `/${addon}`
  89. },
  90. get cdnStaticAddon() {
  91. return `/assets/addons/${addon}/img`
  92. },
  93. get httpAppClient() {
  94. return Object.freeze({ ...HTTP_CLIENT_ALIASES })
  95. },
  96. get webrtcIceServers() {
  97. return ice
  98. },
  99. get avcallTestSignalingWs() {
  100. return ''
  101. }
  102. })
  103. }
  104. /** 进程内单例,避免重复组装 */
  105. let cachedSurface = null
  106. export function getManifestSingleton() {
  107. if (!cachedSurface) cachedSurface = materializeRuntimeManifest()
  108. return cachedSurface
  109. }
  110. export default getManifestSingleton