qstd 0.3.85 → 0.3.87

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.
@@ -4,6 +4,7 @@ var dateFns = require('date-fns');
4
4
  var awaitSpawn = require('await-spawn');
5
5
  var fs = require('fs');
6
6
  var arktype = require('arktype');
7
+ var clientApigatewaymanagementapi = require('@aws-sdk/client-apigatewaymanagementapi');
7
8
  var libDynamodb = require('@aws-sdk/lib-dynamodb');
8
9
  var clientDynamodb = require('@aws-sdk/client-dynamodb');
9
10
  var signale = require('signale');
@@ -1101,6 +1102,126 @@ function remove(path, body, opts) {
1101
1102
  );
1102
1103
  }
1103
1104
 
1105
+ // src/shared/lexorank/index.ts
1106
+ var lexorank_exports = {};
1107
+ __export(lexorank_exports, {
1108
+ checkBalance: () => checkBalance,
1109
+ createOrderStr: () => createOrderStr,
1110
+ createRebalancedOrderList: () => createRebalancedOrderList,
1111
+ rebalance: () => rebalance,
1112
+ sortByOrder: () => sortByOrder
1113
+ });
1114
+
1115
+ // src/shared/lexorank/literals.ts
1116
+ var LOWER_BOUND = 96;
1117
+ var UPPER_BOUND = 123;
1118
+ var CHAR_A = 97;
1119
+ var CHAR_Z = 122;
1120
+ var ALPHABET_SIZE = 26;
1121
+ var DISTRIBUTION_TABLE = [
1122
+ 0,
1123
+ 4096,
1124
+ 65792,
1125
+ 528416,
1126
+ 1081872,
1127
+ 2167048,
1128
+ 2376776,
1129
+ 4756004,
1130
+ 4794660,
1131
+ 5411476,
1132
+ 9775442,
1133
+ 11097386,
1134
+ 11184810,
1135
+ 22369621
1136
+ ];
1137
+
1138
+ // src/shared/lexorank/fns.ts
1139
+ var stripTrailingAs = (str) => {
1140
+ let last = str.length - 1;
1141
+ while (str.charAt(last) === "a") --last;
1142
+ return str.slice(0, last + 1);
1143
+ };
1144
+ var partialAlphabet = (num2) => {
1145
+ let bits = num2 < 13 ? DISTRIBUTION_TABLE[num2] ?? 0 : 33554431 - (DISTRIBUTION_TABLE[25 - num2] ?? 0);
1146
+ const chars = [];
1147
+ for (let i = 1; i < ALPHABET_SIZE; i++, bits >>= 1) {
1148
+ if (bits & 1) chars.push(String.fromCharCode(CHAR_A + i));
1149
+ }
1150
+ return chars;
1151
+ };
1152
+
1153
+ // src/shared/lexorank/domain.ts
1154
+ var createOrderStr = (prev = "", next = "") => {
1155
+ let p;
1156
+ let n;
1157
+ let pos;
1158
+ let str;
1159
+ for (pos = 0; p === n; pos++) {
1160
+ p = pos < prev.length ? prev.charCodeAt(pos) : LOWER_BOUND;
1161
+ n = pos < next.length ? next.charCodeAt(pos) : UPPER_BOUND;
1162
+ }
1163
+ str = prev.slice(0, pos - 1);
1164
+ if (p === LOWER_BOUND) {
1165
+ while (n === CHAR_A) {
1166
+ n = pos < next.length ? next.charCodeAt(pos++) : UPPER_BOUND;
1167
+ str += "a";
1168
+ }
1169
+ if (n === CHAR_A + 1) {
1170
+ str += "a";
1171
+ n = UPPER_BOUND;
1172
+ }
1173
+ } else if (p !== void 0 && n !== void 0 && p + 1 === n) {
1174
+ str += String.fromCharCode(p);
1175
+ n = UPPER_BOUND;
1176
+ while ((p = pos < prev.length ? prev.charCodeAt(pos++) : LOWER_BOUND) === CHAR_Z) {
1177
+ str += "z";
1178
+ }
1179
+ }
1180
+ return str + String.fromCharCode(
1181
+ Math.ceil(((p ?? LOWER_BOUND) + (n ?? UPPER_BOUND)) / 2)
1182
+ );
1183
+ };
1184
+ var createRebalancedOrderList = (num2) => {
1185
+ const chars = Math.floor(Math.log(num2) / Math.log(ALPHABET_SIZE)) + 1;
1186
+ const prev = Math.pow(ALPHABET_SIZE, chars - 1);
1187
+ const ratio = chars > 1 ? (num2 + 1 - prev) / prev : num2;
1188
+ const part = Math.floor(ratio);
1189
+ const alpha = [partialAlphabet(part), partialAlphabet(part + 1)];
1190
+ const leapStep = ratio % 1;
1191
+ let leapTotal = 0.5;
1192
+ let first = true;
1193
+ const strings = [];
1194
+ const generate = (full, str) => {
1195
+ if (full) {
1196
+ for (let i = 0; i < ALPHABET_SIZE; i++) {
1197
+ generate(full - 1, str + String.fromCharCode(CHAR_A + i));
1198
+ }
1199
+ } else {
1200
+ if (!first) strings.push(stripTrailingAs(str));
1201
+ else first = false;
1202
+ const leap = Math.floor(leapTotal += leapStep);
1203
+ leapTotal %= 1;
1204
+ for (let i = 0; i < part + leap; i++) {
1205
+ strings.push(str + (alpha[leap]?.[i] ?? ""));
1206
+ }
1207
+ }
1208
+ };
1209
+ generate(chars - 1, "");
1210
+ return strings;
1211
+ };
1212
+ var checkBalance = (xs) => {
1213
+ let largestOrderStr = 0;
1214
+ xs.forEach(
1215
+ (x) => largestOrderStr = Math.max(largestOrderStr, x.order.length)
1216
+ );
1217
+ return largestOrderStr > xs.length / 2;
1218
+ };
1219
+ var rebalance = (xs) => {
1220
+ const rebalancedOrderList = createRebalancedOrderList(xs.length);
1221
+ return xs.map((x, i) => ({ ...x, order: rebalancedOrderList[i] ?? x.order }));
1222
+ };
1223
+ var sortByOrder = (xs) => xs.toSorted((a, b) => (a.order ?? "").localeCompare(b.order ?? ""));
1224
+
1104
1225
  // src/server/os/index.ts
1105
1226
  var os_exports = {};
1106
1227
  __export(os_exports, {
@@ -1228,6 +1349,176 @@ var createSqsHandler = (fn) => async (event) => {
1228
1349
  return result;
1229
1350
  };
1230
1351
 
1352
+ // src/server/aws/apigw/index.ts
1353
+ var apigw_exports = {};
1354
+ __export(apigw_exports, {
1355
+ broadcast: () => broadcast,
1356
+ create: () => create2,
1357
+ createFromRequestContext: () => createFromRequestContext,
1358
+ createPublisher: () => createPublisher,
1359
+ deleteConnection: () => deleteConnection,
1360
+ send: () => send
1361
+ });
1362
+
1363
+ // src/server/aws/apigw/fns.ts
1364
+ var normalizePath = (path) => path.replace(/^\/+|\/+$/g, "");
1365
+ var getManagementEndpoint = (props) => {
1366
+ const domainName = props.domainName;
1367
+ if (!domainName) {
1368
+ throw new Error("Missing websocket domain name");
1369
+ }
1370
+ const rawPath = props.basePath ?? props.stage;
1371
+ if (rawPath == null) {
1372
+ throw new Error("Missing websocket stage or base path");
1373
+ }
1374
+ const protocol = props.protocol ?? "https";
1375
+ const path = normalizePath(rawPath);
1376
+ return path ? `${protocol}://${domainName}/${path}` : `${protocol}://${domainName}`;
1377
+ };
1378
+ var isGoneConnectionError = (error2) => {
1379
+ return !!(error2 && typeof error2 === "object" && "$metadata" in error2 && error2.$metadata?.httpStatusCode === 410);
1380
+ };
1381
+ var encodeData = (data) => {
1382
+ if (typeof data === "string") {
1383
+ return data;
1384
+ }
1385
+ if (data instanceof Uint8Array) {
1386
+ return data;
1387
+ }
1388
+ if (data instanceof ArrayBuffer) {
1389
+ return new Uint8Array(data);
1390
+ }
1391
+ if (ArrayBuffer.isView(data)) {
1392
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
1393
+ }
1394
+ const encoded = JSON.stringify(data);
1395
+ if (encoded === void 0) {
1396
+ throw new Error("Websocket payload must be JSON serializable");
1397
+ }
1398
+ return encoded;
1399
+ };
1400
+ var runWithConcurrency = async (items, concurrency, fn) => {
1401
+ const limit = Math.max(1, concurrency);
1402
+ let nextIndex = 0;
1403
+ await Promise.all(
1404
+ Array.from({ length: Math.min(limit, items.length) }, async () => {
1405
+ while (nextIndex < items.length) {
1406
+ const currentIndex = nextIndex;
1407
+ nextIndex += 1;
1408
+ await fn(items[currentIndex]);
1409
+ }
1410
+ })
1411
+ );
1412
+ };
1413
+
1414
+ // src/server/aws/apigw/domain.ts
1415
+ var create2 = (props) => {
1416
+ const client = new clientApigatewaymanagementapi.ApiGatewayManagementApiClient({
1417
+ endpoint: props.endpoint
1418
+ });
1419
+ return { client, endpoint: props.endpoint };
1420
+ };
1421
+ var createFromRequestContext = (props) => {
1422
+ return create2({ endpoint: getManagementEndpoint(props) });
1423
+ };
1424
+ var createPublisher = (apigw, props) => {
1425
+ const getConnectionId = props.getConnectionId;
1426
+ const onGone = props.onGone;
1427
+ return {
1428
+ send: (target, sendProps) => {
1429
+ return send(apigw, {
1430
+ connectionId: getConnectionId(target),
1431
+ data: sendProps.data,
1432
+ onGone: onGone ? () => onGone(target) : void 0
1433
+ });
1434
+ },
1435
+ broadcast: (broadcastProps) => {
1436
+ return broadcast(apigw, {
1437
+ ...broadcastProps,
1438
+ getConnectionId,
1439
+ onGone
1440
+ });
1441
+ }
1442
+ };
1443
+ };
1444
+ var send = async (apigw, props) => {
1445
+ try {
1446
+ await apigw.client.send(
1447
+ new clientApigatewaymanagementapi.PostToConnectionCommand({
1448
+ ConnectionId: props.connectionId,
1449
+ Data: encodeData(props.data)
1450
+ })
1451
+ );
1452
+ } catch (error2) {
1453
+ if (isGoneConnectionError(error2)) {
1454
+ await props.onGone?.(props.connectionId);
1455
+ return false;
1456
+ }
1457
+ throw error2;
1458
+ }
1459
+ return true;
1460
+ };
1461
+ var deleteConnection = (apigw, props) => {
1462
+ return apigw.client.send(
1463
+ new clientApigatewaymanagementapi.DeleteConnectionCommand({
1464
+ ConnectionId: props.connectionId
1465
+ })
1466
+ );
1467
+ };
1468
+ var broadcast = async (apigw, props) => {
1469
+ const result = {
1470
+ failed: [],
1471
+ stale: [],
1472
+ sent: 0
1473
+ };
1474
+ const sharedData = "data" in props ? encodeData(props.data) : null;
1475
+ const getData = "getData" in props ? props.getData : null;
1476
+ const getCacheKey = "getCacheKey" in props ? props.getCacheKey : void 0;
1477
+ const onGone = props.onGone;
1478
+ const cache = /* @__PURE__ */ new Map();
1479
+ const resolveData = async (target) => {
1480
+ if (sharedData !== null) {
1481
+ return sharedData;
1482
+ }
1483
+ if (!getData) {
1484
+ throw new Error("Missing websocket broadcast payload builder");
1485
+ }
1486
+ const cacheKey = getCacheKey?.(target);
1487
+ if (cacheKey == null) {
1488
+ return encodeData(await getData(target));
1489
+ }
1490
+ const existing = cache.get(cacheKey);
1491
+ if (existing) {
1492
+ return existing;
1493
+ }
1494
+ const promise = Promise.resolve(getData(target)).then(encodeData);
1495
+ cache.set(cacheKey, promise);
1496
+ return promise;
1497
+ };
1498
+ await runWithConcurrency(
1499
+ props.targets,
1500
+ props.concurrency ?? 25,
1501
+ async (target) => {
1502
+ const connectionId = props.getConnectionId(target);
1503
+ try {
1504
+ const delivered = await send(apigw, {
1505
+ connectionId,
1506
+ data: await resolveData(target),
1507
+ onGone: onGone ? () => onGone(target) : void 0
1508
+ });
1509
+ if (!delivered) {
1510
+ result.stale.push({ connectionId, target });
1511
+ return;
1512
+ }
1513
+ result.sent += 1;
1514
+ } catch (error2) {
1515
+ result.failed.push({ connectionId, error: error2, target });
1516
+ }
1517
+ }
1518
+ );
1519
+ return result;
1520
+ };
1521
+
1231
1522
  // src/server/aws/ddb/index.ts
1232
1523
  var ddb_exports = {};
1233
1524
  __export(ddb_exports, {
@@ -1235,7 +1526,7 @@ __export(ddb_exports, {
1235
1526
  batchGet: () => batchGet,
1236
1527
  batchWrite: () => batchWrite,
1237
1528
  copyTable: () => copyTable,
1238
- create: () => create2,
1529
+ create: () => create3,
1239
1530
  deleteTable: () => deleteTable,
1240
1531
  find: () => find,
1241
1532
  lsi1: () => lsi1,
@@ -1519,7 +1810,7 @@ var buildUpdateExpression = (ops, names, values) => {
1519
1810
  };
1520
1811
 
1521
1812
  // src/server/aws/ddb/domain.ts
1522
- var create2 = (props) => {
1813
+ var create3 = (props) => {
1523
1814
  const tableName = props?.tableName;
1524
1815
  const credentials = props?.credentials;
1525
1816
  const client = libDynamodb.DynamoDBDocumentClient.from(
@@ -2401,11 +2692,11 @@ var copyTable = async (props) => {
2401
2692
  // src/server/aws/sns/index.ts
2402
2693
  var sns_exports = {};
2403
2694
  __export(sns_exports, {
2404
- create: () => create3,
2695
+ create: () => create4,
2405
2696
  publish: () => publish,
2406
2697
  publishError: () => publishError
2407
2698
  });
2408
- var create3 = (props) => {
2699
+ var create4 = (props) => {
2409
2700
  const client = new clientSns.SNSClient({});
2410
2701
  return { client, topicArn: props?.topicArn };
2411
2702
  };
@@ -2440,8 +2731,8 @@ var publishError = (sns, props) => {
2440
2731
  // src/server/aws/sqs/index.ts
2441
2732
  var sqs_exports = {};
2442
2733
  __export(sqs_exports, {
2443
- create: () => create4,
2444
- send: () => send
2734
+ create: () => create5,
2735
+ send: () => send2
2445
2736
  });
2446
2737
 
2447
2738
  // src/server/aws/sqs/fns.ts
@@ -2455,12 +2746,12 @@ var getQueueUrlOrThrow = (...candidates) => {
2455
2746
  };
2456
2747
 
2457
2748
  // src/server/aws/sqs/domain.ts
2458
- var create4 = (props) => {
2749
+ var create5 = (props) => {
2459
2750
  const client = new clientSqs.SQSClient({});
2460
2751
  const queueUrl = props?.queueUrl;
2461
2752
  return { client, queueUrl };
2462
2753
  };
2463
- var send = (sqs, props) => sqs.client.send(
2754
+ var send2 = (sqs, props) => sqs.client.send(
2464
2755
  new clientSqs.SendMessageCommand({
2465
2756
  MessageBody: JSON.stringify(props.body),
2466
2757
  MessageGroupId: props.messageGroupId,
@@ -2471,16 +2762,16 @@ var send = (sqs, props) => sqs.client.send(
2471
2762
  // src/server/aws/ses/index.ts
2472
2763
  var ses_exports = {};
2473
2764
  __export(ses_exports, {
2474
- create: () => create5,
2475
- send: () => send2
2765
+ create: () => create6,
2766
+ send: () => send3
2476
2767
  });
2477
2768
 
2478
2769
  // src/server/aws/ses/fns.ts
2479
2770
  var stripHtml = (html) => html.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "").replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "").replace(/<[^>]+>/g, " ").replace(/&nbsp;/g, " ").replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/\s+/g, " ").trim();
2480
2771
 
2481
2772
  // src/server/aws/ses/index.ts
2482
- var create5 = () => new clientSes.SESClient({ apiVersion: "2010-12-01" });
2483
- var send2 = (ses, email) => {
2773
+ var create6 = () => new clientSes.SESClient({ apiVersion: "2010-12-01" });
2774
+ var send3 = (ses, email) => {
2484
2775
  const Source = `"${email.fromName}" <${email.from}>`;
2485
2776
  console.log(`[ses] Sending email to ${email.to} from ${email.from}`);
2486
2777
  const Destination = { ToAddresses: [email.to] };
@@ -2505,7 +2796,7 @@ var s3_exports = {};
2505
2796
  __export(s3_exports, {
2506
2797
  bucketExists: () => bucketExists,
2507
2798
  copyFile: () => copyFile,
2508
- create: () => create6,
2799
+ create: () => create7,
2509
2800
  createBucket: () => createBucket,
2510
2801
  createSignedUrl: () => createSignedUrl,
2511
2802
  deleteBucket: () => deleteBucket,
@@ -2532,7 +2823,7 @@ var getBucketNameOrThrow = (...candidates) => {
2532
2823
  };
2533
2824
 
2534
2825
  // src/server/aws/s3/domain.ts
2535
- var create6 = (props = {}) => {
2826
+ var create7 = (props = {}) => {
2536
2827
  const { cdn } = props;
2537
2828
  const client = new clientS3.S3Client({});
2538
2829
  const bucketName = getBucketNameOrThrow(props.bucketName);
@@ -2788,12 +3079,14 @@ var recordsFromSqs = (body) => {
2788
3079
  };
2789
3080
 
2790
3081
  exports.Api = api_exports;
3082
+ exports.ApiGw = apigw_exports;
2791
3083
  exports.DDB = ddb_exports;
2792
3084
  exports.Dict = dict_exports;
2793
3085
  exports.File = file_exports;
2794
3086
  exports.Flow = flow_exports;
2795
3087
  exports.Int = int_exports;
2796
3088
  exports.Lambda = lambda_exports;
3089
+ exports.LexoRank = lexorank_exports;
2797
3090
  exports.List = list_exports;
2798
3091
  exports.Log = log_exports;
2799
3092
  exports.Money = money_exports;
@@ -8,9 +8,11 @@ export * as Flow from "../shared/flow";
8
8
  export * as Random from "../shared/random";
9
9
  export * as Log from "../shared/log";
10
10
  export * as Api from "../shared/api";
11
+ export * as LexoRank from "../shared/lexorank";
11
12
  export * as Os from "./os";
12
13
  export * as File from "./file";
13
14
  export * as Lambda from "./aws/lambda";
15
+ export * as ApiGw from "./aws/apigw";
14
16
  export * as DDB from "./aws/ddb";
15
17
  export * as SNS from "./aws/sns";
16
18
  export * as SQS from "./aws/sqs";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,KAAK,MAAM,iBAAiB,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,eAAe,CAAC;AACrC,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAG/C,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,GAAG,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,MAAM,UAAU,CAAC"}